S5PC100的PWM定时器中断实现示例
2012-11-01 16:49
375 查看
1实验平台的介绍
实验芯片是S5PC100处理器,开发平台是FSC100开发平台。
2实验实现的功能
使用PWM定时器的中断来产生一个占空比可调的PWM波形。
3开发板原理图
![](http://www.embedu.org/Column/images/Column541-1.jpg)
有图可知,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中断的程序分析
实验芯片是S5PC100处理器,开发平台是FSC100开发平台。
2实验实现的功能
使用PWM定时器的中断来产生一个占空比可调的PWM波形。
3开发板原理图
![](http://www.embedu.org/Column/images/Column541-1.jpg)
有图可知,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中断的程序分析
相关文章推荐
- 定时器1的设置 s5pc100
- 【定时器/中断/PWM】利用一个定时器实现一路PWM波的输出---点亮LED
- ok6410实现定时器中断驱动 pwm驱动
- STM8S---TIM2产生PWM与TIM1定时器周期中断的时钟问题
- 定时器中断模拟pwm输出声音文件
- 中断和定时器实验--c语言实现中断嵌套
- S5PC100芯片的linux-lcd驱动移植(基于2.6.35.13内核)
- 用龙芯1c库在RT-Thread下实现硬件定时器中断
- Python实现1-9数组形成的结果为100的所有运算式的示例
- AVR使用范例--定时器实现PWM功能
- 用龙芯1c库在裸机编程环境中实现硬件定时器中断
- JavaScript实现事件的中断传播和行为阻止方法示例
- S5PC100 DMAC简述
- STM32定时器----Toggle模式实现2路pwm移相
- 通用定时器(中断功能和PWM输出)
- 打打基础,回头看看avr单片机的定时器、中断和PWM(转)
- Angular实现的简单定时器功能示例
- S5PC100——UART
- 嵌入式软件开发培训笔记——boot原理与u-boot 基于Cortex_A8核的S5PC100芯片
- 使用STM32的systick定时器中断实现RTC工作过程出错