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

1实验平台的介绍

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

2实验实现的功能

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

3开发板原理图

S5PC100的PWM定时器中断实现示例_第1张图片

有图可知,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实验)