从S5PV210学习最基础的定时器(WDT篇)

xiaoxiao2021-02-28  25

注:下文都以S5PV210为背景。

看门狗,也就是有复位功能的定时器。

一。看图说话:

中图表示了一下几点:

(1)时钟是由PCLK两级分频。

(2)WTDAT的值被自动赋值给了WTCNT.

(3)有可控制的中断信号和复位信号功能。

此外结合U_M的其他信息可知:

(1)第一次定时,WTDAT的值不会被自动加载到WTCNT中。

(2)WTCNT是可读写的寄存器,并有初始值0x8000。(PWM中的CNT是不可读写的)

所以,对此有两种方法:

(1)初始化时给WTCNT直接赋值。

(2)不对 WTCNT赋值,而使用其初始值0x8000。

二。编程实战

WDT本质上就是定时器,二定时器最基本的设置就是设置定时时间,此外WDT有可选的

中断和复位功能,所以编程的思路就是:

(1)设置定时时间(确定时钟频率,设置WTDAT)

(2)选择中断复位功能。

(3)开启WDT。

示例代码如下:

// 初始化WDT使之可以产生中断 void wdt_init_interrupt(void) { // 第一步,设置好预分频器和分频器,得到时钟周期是128us rWTCON &= ~(0xff<<8); rWTCON |= (65<<8); // 1MHz rWTCON &= ~(3<<3); rWTCON |= (3<<3); // 1/128 MHz, T = 128us // 第二步,设置中断和复位信号的使能或禁止 rWTCON |= (1<<2); // enable wdt interrupt rWTCON &= ~(1<<0); // disable wdt reset // 第三步,设置定时时间 // WDT定时计数个数,最终定时时间为这里的值×时钟周期 //rWTDAT = 10000; // 定时1.28s //rWTCNT = 10000; // 定时1.28s // 其实WTDAT中的值不会自动刷到WTCNT中去,如果不显式设置WTCON中的值,它的值就是 // 默认值,然后以这个默认值开始计数,所以这个时间比较久。如果我们自己显式的 // 设置了WTCNT和WTDAT一样的值,则第一次的定时值就和后面的一样了。 rWTDAT = 1000; // 定时0.128s //rWTCNT = 1000; // 定时0.128s // 第四步,先把所有寄存器都设置好之后,再去开看门狗 rWTCON |= (1<<5); // enable wdt } 中断服务程序如下:

// wdt的中断处理程序 void isr_wdt(void) { static int i = 0; printf("wdt interrupt, i = %d...", i++); // 清中断 intc_clearvectaddr(); rWTCLRINT = 1; }

main设置如下:

int main(void) { uart_init(); wdt_init_interrupt(); // 如果程序中要使用中断,就要调用中断初始化来初步初始化中断控制器 system_init_exception(); printf("-------------wdt interrupt test--------------"); // 绑定isr到中断控制器硬件 intc_setvectaddr(NUM_WDT, isr_wdt); // 使能中断 intc_enable(NUM_WDT); while (1); return 0; } 自此,实现了WDT的中断功能。

转载请注明原文地址: https://www.6miu.com/read-2050000.html

最新回复(0)