您的位置:首页 > 其它

S5PC100的PWM定时器中断实现示例

2012-11-01 16:49 375 查看
1实验平台的介绍

实验芯片是S5PC100处理器,开发平台是FSC100开发平台。

2实验实现的功能

使用PWM定时器的中断来产生一个占空比可调的PWM波形。

3开发板原理图



有图可知,PWM定时器输出TOUT1来控制一个无缘的蜂鸣器。可以用定时器的中断方式来实现一个PWM占空比可调的方波。

4实验代码分析

void main()

{

int i;

uart0_init();

//初始化UART0

pwm_init();//PWM定时器,用来设定PWM定时器的中断触发方式的.

while(1);

}

void pwm_init()

{

GPD.GPDCON = GPD.GPDCON & (~0XF0) | (0X2<<4);

//设置IO功能为TOUT1输出

CLK_GATE_D1.CLK_GATE_D1_3 = (CLK_GATE_D1.CLK_GATE_D1_3 & (~(1<<6)) ) | (1<<6);

//打开PWM的时钟,让PCLK给PWM提供时钟,这个默认就是打开的,可以不用设置

TIMER.TCFG0 = ( TIMER.TCFG0 & ~0XFF ) + 66;

//配置预分频值为66

TIMER.TCFG1 = ( TIMER.TCFG1 & ~0Xf0 ) + 0<<4;

//配置分频的值为1分频 即不分频

TIMER1.TCNTB1 = 10;

//设置缓冲器的值

TIMER1.TCMPB1 = 0;

//设置比较缓冲器的值

VIC0VECTADDR.VIC0VECTADDR22 = (unsigned int)int_pwm;

//设置PWM定时器的的中断处理函数

VIC0INTERRUPT.VIC0INTENABLE = VIC0INTERRUPT.VIC0INTENABLE | (1<<22);

// 打开相应的中断使能位,

TINT_CSTAT = TINT_CSTAT;

// 清楚中断源,这是个好习惯,用的时候保证中断源都是干净的.

TINT_CSTAT = 1<<1;

//打开PWM定时器1的中断使能

// 以上的设置用来让PWM定时工作在1M的时钟频率下, TCNTB1设置为10 ,是为了让定时//器在100KHZ 的频率下产生中断

TIMER.TCON = 0X0e<<8;

//手动更新,使缓冲器的值到计数器里面,双缓冲机制 起始,位为低电平

TIMER.TCON = 0X0d<<8;

//清除手动更新位,并启动定时器

}

以上是main函数的部分

下面是中断函数的处理部分:

这部分是汇编代码,在启动文件start.S中

irq_handler:

sub lr,lr,#4

stmfd sp!,{r0-r12,lr}

bl do_irq

ldmfd sp!,{r0-r12,pc}^

以下是C中的代码

void do_irq()

{

printf("in do_irq\n");

((void (*)(void))VIC0ADDRESS ) ();

//中断发生后,内核处理中断,会进入汇编去执行执行irq_handler:标号处的代码,执行bl //do_irq 此时会进入C函数,执行void do_irq(),发生PWM定时器中断后,此时VIC0ADDRESS里面的地址就是VIC0VECTADDR22的值,把这个地址强转成函数类型的,就可以执行 void int_pwm()函数

}

//中断处理函数

void int_pwm()

{

VIC0ADDRESS = 0;

// 清楚VIC中断控制器的中断地址

TINT_CSTAT |= 1<<6;

// 清楚PWM定时器1的中断源,中断源的清楚是写1清楚

// 下面的代码省略,可以实现不同的功能,在每次发生中可以调整TIMER1.TCMPB1 = 0; // 来实现不同的PWM占空比.

}

以上是对这个PWM中断的程序分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: