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中断的程序分析