S5PV210的定时器程序模块程序
--参考朱有鹏ARM裸机程序
1、PWM定时器的初始化:
步奏分析:
(1)因为我们是输出PWM波,所以需要将需要的GPIO口设置成PWM模式:
(2)根据上一篇博客说明的,我们需要知道驱动我们的PWM波的频率到底是多大,
所以我们需要配置我们的两个分频器
(3)接着,是PWM波的关键寄存器:
rTCNTB2 = 250; // 频率*这个数可以得出我们需要知道的周期
rTCMPB2 = 125; //把这个数除以上面的数,可以知道我们输出的占空比是多少。
(4)最后启动PWM波即可。
//初始化PWM timer2,使其输出PWM波形,频率是2KHZ,duty为50%
void timer2_pwm_init(void)
{
//设置相关的寄存器
//首先设置GPD0_CON,将其配置为xpwmTOUT_2
//一般的寄存器实行的是读改写,三部曲
rGPD0CON &= ~(0xf << 8); //将这个寄存器清零
rGPD0CON |= (2 << 8); //将这个GPIO配置成PWM模式
//设置PWM定时器的其他的寄存器使其工作,两个分频器进行分频
rTCFG0 &= ~(0xff<<8);
rTCFG0 |= (65<<8);
rTCFG1 &= ~(0x0f<<8);
rTCFG1 |= (1<<8);
//前面的这两个确定的是得到的单位频率的多少
rCON |= (1<<15);
rTCNTB2 = 250;
rTCMPB2 = 125;
//第一次需要手工将TCNTB中的值刷新到TCNT中去,以后就可以自动重装载了
rCON |= (1<<13);
rCON &= ~(1<<13);
rCON |= (1<<12);
}
2、使用看门狗定时器产生中断
步奏分析:
(1)根据上图的分析:看门狗定时器也是有两个预分频器寄存器的,用来
得到需要的频率。
(2)接着WTDAT用来把数写进去,也就是相当于设定好了周期,一旦减少到了0之后。
就会触发中断(前提是WTCON[2]已经设置好)
(3)WTCON[0]寄存器设置为复位的寄存器,写什么值都能进行复位
使用看门狗的中断程序:
void wdt_init_interrupt(void)
{
//第一步:设置好预分频器和分频器,得到时钟周期是128US
rWTCON &= ~(0xff<<8);
rWTCON |= (65<<8);
rWTCON &= ~(3<<3);
rWTCON |= (3<<3);
//第二步;设置中断和复位信号的使能或者禁止
rWTCON |= (1<<2); //enable wdt intterrupt
rWTCON &= ~(1<<0); //diasble wdt reset
//第三步;设置定时时间
rWTDAT = 10000; //定时1.28S
rWTCNT = 10000; //定时1.28S
//其实WTDAT中的值不会自动刷到WTCNT中去,如果不是显示
//它的值就是默认值,然后以这个默认值开始计数,所以这个时间比较久
//设置了WTCNT和WTDAT一样的值,则第一次的定时值和后面的一样的。
rWTDAT = 1000;
//第四步,先把所有的寄存器都设置好了之后,再去开看门狗
rWTCON |= (1<<5); //enable wdt
}
使用看门狗进行复位:
void wdt_init_reset(void)
{
//第一步,设置好预分频器和分频器
rWTCON &= ~(0xff<<8);
rWTCON |= (65<<8); // 1MHz
rWTCON &= ~(3<<3);
rWTCON |= (3<<3); // 1/128 MHz, T = 128us
//设置中断和复位的信号的使能或者禁止
rWTCON &= ~(1<<2); //disable wdt interrupt
rWTCON |= (1<<0); //enable WDT reset
//第三步:设置定时时间
rWTDAT = 10000;
rWTCNT = 10000;
//第四步:先把所有的寄存器设置好,再去看门狗。
rWTCON |= (1<<5); //enable wdt
}