七、mini2440裸机程序之定时器中断(3)定时器简介

1.概览

        S3C2440A有516-bit的定时器 . 定时器0,1,2,3有PWM功能 , 定时器4只有一个内部定时没有关联上输出管脚 . 定时器0有一个dead-zone产生器 ,用于大电流设备 .

       

        定时器 0 和 1 共享这一个8-bit的预分频器 , 定时器2,3,4共享另一个8-bit的预分频器 . 每一个定时器都有一个时钟分频器 , 用于产生5个不同的分频信号(1/2 ,1/4  , 1/8  , 1/16 , TCLK) . 每一个定时器模块从时钟分频器(clock divider)(输入到时钟分配器的信号是来自于对应的8-bit预分频器)接收自己的时钟信号 . 这个8-bit的预分频器是可编程的并且分频PCLK根据设置的值(TCFG0TCFG1寄存器里的值) .

 

        定时计数缓冲寄存器(timer count buffer :TCNTBn):在定时器启动时 , TCNTBn里的值 会被加载到递减计数器(down-counter)里 . 而对于定时比较缓冲寄存器(timer compare buffer : TCMPBn)里的值会被加载到比较寄存器(compare register)来跟递减计数器进行比较. 

 

        每一个定时器都有一个属于自己的16-bit的递减计数器,这个计数器的计数由定时器时钟驱动. 但递减计数器到达0时 , 定时器中断请求产生通知CPU定时器运行完成 .

 

        TCMPBn的值通常用于PWM . 定时器控制逻辑改变输出逻辑当递减计数器和比较寄存器相匹配时 , 所以比较寄存器决定了PWM输出的开启时间(或者说关闭时间) .

 

特征:

------5个16-bit定时器

------两个8-bit预分频和两个4-bit分频器

------可编程PWM占空比

------重装载模式或者一次性脉冲模式

------dead-zone产生器

 

2.16-bit PWM 定时器模块框架图

 

3.PWM定时器的运行时序如下:


注:

          一个定时器(除了定时器通道5)都有TCNBn , TCNTn, TCMPBn 和 TCMPn . (TCNTn和TCMPn都为内部寄存器 . 其中TCNTn的值可以从TXCNTOn寄存器里读到) 当定时器到达 0 时 , TCNTBn和TCMPBn的内容被装载到TCNTn和TCMPn . 当TCNTn到达0 , 一个中断请求将会出现  (假如中断使能)  .  当TCNTn = TCMPn时 , TOUTn逻辑电平翻转.

 

4.自动重载(auto reload)和双重缓冲器

        S3C2440A的PWM定时器有一个双重缓冲功能 , 使能重载内容给下一个定时操作而不需要停止当前的定时操作 . 所以 , 尽管性的定时器值被设置 , 当前定时器操作都能正确完成 .

       

        定时器的内容可以写入TCNTBn , 并且可以从TCNTOn寄存器里读取定时器的当前计数值 . 假如TCNTBn被读取 , 这个值是用于下次定时操作的重载值而不是当前计数器的值 .

 

        一旦TCNTn到达 0 之后 , 自动重载操作拷贝TCNTBn的值到TCNTn . 写在TCNTBn里的值只有在TCNTn到达 0 并且使能自动重载才会被加载到TCNTn . 假如TCNTn计数到0并且自动重载位被设置为 0 ,那么TCNTn不做任何操作  .

     

       以下是一个例子:

 

5.定时器初始化使用manual update 和 inverter bit(反相位)

        一个定时器的自动重载操作会在递减计数器计数到 0 时发生  . 所以 , 一个TCNTn的初始值必须提前被定义 . 在这种情况下 , 初始值需要手动加载到进TCNTn通过manual update位. 具体步骤如下:

        1)把初始值写入TCNTBn和TCMPBn

        2)设置相应定时器的manual update位 .  (推荐也配置反相器开关位)

        3)设置相应定时器的启动位来启动定时器(并且清除手动更新位)

 

如果定时器被迫停止 ,TCNTn保持计数值并且不从TCNTBn重载数据 . 如果希望设置一个新的计数值 , 则需要手动更新 .

 

注意:

        一旦TOUT反相器开关位被改变了 , TOUTn逻辑值也被改变不管定时器有没有工作 , 所以 , 在设置手动配置位时也配置反相器开关位是合适的 .

 

        1)输出电平控制

                 如果反相器被关闭 , 那么定时器的输出管脚初始值为高电平在定时器启动后 , TCNTn>TCMPn期间 , 输出为  ' 0 ' , TCNTn < TCMPn期间 , 输出为1 ' .  如果反相器被打开 , 情况与上述相反 .

 

 

 

 

 

 

 


看门狗(Watchdog)是一种硬件定时器,用于监视系统是否正常运行。如果系统正常运行,那么看门狗会在设定的时间间隔内被定期喂狗;如果系统出现异常,看门狗就会在时间间隔到达后触发中断或复位操作,以恢复系统的正常运行。 在Mini2440上,看门狗的控制寄存器位于WTDAT、WTCON和WTCNT中。其中,WTDAT用于设置看门狗的计数器初始值,WTCON用于配置看门狗的工作模式和计数器时钟源,WTCNT则是看门狗的计数器。 下面是一个简单的示例代码,用于启动看门狗并设置其定时时间为5秒钟: ```c #include "s3c2440_soc.h" void delay(int count) { while(count--); } int main() { /* 设置看门狗定时时间为5秒钟 */ WTCON = (0x1 << 5) | (0x3 << 3) | (0x1 << 0); /* 启动看门狗 */ WTCNT = 0x10000; while(1) { /* 喂狗 */ WTCNT = 0x10000; delay(100000); /* 业务处理 */ // ... } return 0; } ``` 在上述代码中,我们首先设置了看门狗的定时时间为5秒钟。然后在主循环中,我们每隔一段时间就喂狗一次,以保证看门狗不会触发中断或复位操作。同时,我们还可以在喂狗的时间间隔内进行业务处理。 需要注意的是,在实际应用中,我们通常不会像上述代码一样简单地启动一个看门狗并喂狗。实际上,我们需要在系统正常运行时定期喂狗,以确保看门狗不会触发中断或复位操作;同时,我们还需要在系统出现异常时及时处理异常并复位系统,以防止系统陷入死循环或其他错误状态。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值