6、定时器原理(包含软定时器设计)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Baidu Nhomakorabea功能
手动更新
位
1
设置
0:无用 1:将TCNTB0/TCMPB0寄存器的值装入内 部寄存器TCNT0/TCMP0
• 步骤4:设置自动装载,并清除手动更新 目的:第一次手动更新后,TCNTn有计数 值,但是当计数到0时,没有再给TCNTBn赋 值就不会再计数,所以设置自动装载 (注意:设置自动装载后,要把手动更新清除)
内部工作流程
定时器内部控制逻辑工作流程:
程序初始化,设定TCMPBn、TCNTBn这两个寄存器,他们表 示定时器n的比较值、初始计数值。 随之设置TCON寄存器启动定时器n,这是TCMPBn、TCNTBn 的值将被装入其内部寄存器TCMPn、TCNTn中。在定时器n 的工作频率下,TCNTn开始计数,其值可以通过读取 TCNTOn寄存器获得。 当TCNTn的值等于TCMPn的值时,定时器n的输出管脚TOUTn 反转;TCNTn继续减1计数。 当TCNTn的值到达0时,其输出管脚TOUTn再次反转。并触 发定时器的中断(假设中断使能) 当TCNTn的值到达0时,如果TCON寄存器中将定时器n设为 “自动加载”,则TCMPBn和TCNTBn寄存器的值被自动装入 TCMPn和TCNTn中,下一个计数流程开始。
过程分析
1. 使能自动重载功能。设置 TCNTBn 为 160(50+110)并且设 置 TCMPBn 为 110。置位手动更新位并且配制变相位(开/关).手 动更新位分别设置TCNTn和TCMPn到TCNTBn 和TCMPBn 的值中。然 后分别设置TCNTBn和 TCMPBn 为80(40+40)和40,以决定下次 重载值。 2. 设置启动位,预设手动更新位为 0,变相位为关,自动重载 位为开。定时器在定时器分辨率内的等待时间后启动递减计数。 3.当 TCNTn 与TCMPn 的值相同时,TOUTn 的逻辑电平从低电 平变为高电平。
概述
• S3C2440A 有 5 个 16 位定时器。其中定时器 0 、1、2 和 3 具有脉宽调制(PWM)功能。定时器 4 是一个无输出引脚的内部定时器。定时器0还包 含用于大电流驱动的死区发生器。 • 定时器 0和 1共用一个8位预分频器,定时器2、3 和 4 共用另外的8 位预分频器。每个定时器都有 一个可以生成5 种不同分频信号(1/2,1/4,1/8 ,1/16 和TCLK)的时钟分频器。每个定时器模块 从相应8 位预分频器得到时钟的时钟分频器中得 到其自己的时钟信号。8 位预分频器是可编程的 ,并且按存储在 TCFG0 和 TCFG1 寄存器中的加 载值来分频PCLK。
位
0 1 0:停止定时器 1:开启定时器
设置
0:无用 1:将TCNTB0/TCMPB0寄存器的值装入 内部寄存器TCNT0/TCMP0 0:TOUT0不反转; 1:TOUT0反转 0:不自动加载 1:在定时器0计数达到0时,将 TCNTB0/TCMPB0寄存器的值自动装入内 部寄存器TCNT0/TCMP0
软定时器封装
软定时器:
void TIMER_TS_Init(... ...) int TIMER_TS_Create(... ...) int TIMER_TS_Destory(int nTimerId) int TIMER_TS_Start(int nTimerId) int TIMER_TS_Stop(int nTimerId) int TIMER_TS_ResetTimeout(int nTimerId, int nTimerOut) int TIMER_TS_Dispatch()
PWM定时器
第五章 定时器
本章目标
• 2440PWM定时器的基本操作 • 定时器中断操作 • 软定时器的封装
特性
什么是定时器 定时器的本质就是一个递减的计数器, 根据触发条件在计数器的值达到触发条件的时 候,触发事件的发生。 特性 – – – – –
五个 16 位定时器 两个8 位预分频器和两个4 位分频器 可编程输出波形的占空比控制(PWM) 自动重载模式或单脉冲模式 死区发生
3
步骤5: • 注册定时器中断服务函数 • 并开启定时器中断
• 步骤6:开启定时器 功能
开启/停止
位
0 0:停止定时器 1:开启定时器
设置
PWM
• 要使用PWM脉宽调试的方法 在原来的步骤2(配置计数初始值 --TCNTBn)时, 同时配置TCMPBn,并设置TCON的输出反转
TCON
功能
开启/停止 手动更新
过程分析
4.当 TCNTn到达0时, 发出中断请求并且TCNTBn的值加载到 暂存器中。 在下一个定时器标记时刻, 重载TCNTn为暂存器 (TCNTBn)的值。 5.中断服务程序(ISR)中,为下一个持续时间分别设置TCNTBn 和TCMPBn为80(20+60)和 60。 6.当 TCNTn 与TCMPn 的值相同时,TOUTn 的逻辑电平从低电平 变为高电平。 7.当当TCNTn到达0 时,触发一个中断自动重载TCNTn 为TCNTBn 的值。 8.中断服务程序(ISR)中,禁止自动重载和中断请求以停止定 时器。 9.当 TCNTn 与TCMPn 的值相同时,TOUTn 的逻辑电平从低电平 变为高电平。 10.尽管TCNTn到达0,但因为禁止了自动重载,所以TCNTn并不 会再次重载并且定时器已经停止了。 11. 不再产生中断请求。
rTCON &= ~0xF00000; rTCON |= 0x700000; rTCON &= ~0x200000 ;
//定时器4开始工作
硬件驱动
硬件接口函数:
1、 int TIMER_Init(int nTimerID,int nDiv0,int nDiv1)//配置预分频比 2、int TIMER_Create(... ...) //配置定时器 3、int TIMER_Destory(int nTimerID)//注销定时器 中断 4、void TIMER_Start(int nTimerID)//启动定时器 5、void TIMER_Stop(int nTimerID)//停止定时器
TCNTBn、TCMPBn
定时器 计数寄存器和比较寄存器(TCNTB0/TCMPB0)
• 步骤3:把初始值装载进内部TCNTn
过程:设置TCON寄存器的手动更新位,当给TCON 寄存器的手动更新位置1,即将TCNTB0寄存器的值 装 入内部寄存器TCNT0
(注意:第一次要手动更新)
TCON
TCON
功能
开启/停止 手动更新
位
0 1 0:停止定时器 1:开启定时器
设置
0:无用 1:将TCNTB0/TCMPB0寄存器的值装入内 部寄存器TCNT0/TCMP0 0:不自动加载 1:在定时器0计数达到0时,将 TCNTB0/TCMPB0寄存器的值自动装入内 部寄存器TCNT0/TCMP0
自动加载
配置定时器流程
选择一个定时器(0,1,2,3,4) 设置预分频值(TCFG0) 设置分频值(TCFG1) 设置计数初始值(TCNTBn) 设置TCON(手动更新,自动加载) 清除TCON的手动更新 注册定时器中断服务函数 开启定时器中断(定时器中断使能) 开启定时器
代码分析
rTCFG0 &= 0xFF00FF; rTCFG0 |= 0xf900; // prescaler等于249 rTCFG1 &= ~0xF0000; rTCFG1 |= 0x20000; //divider等于8,则设置定时器4的时钟频率为25kHz rTCNTB4 = 12500; //让定时器4每隔0.5秒中断一次
功能框图
定时器0 比定时器1 多了死区 发生器
定时器1 比定时器4 多了具有 脉宽调制 (PWM) 功能
定时器2
定时器3 无输出引脚 内部定时器
定时器4
• 步骤1:配置预分频器和分频值 (TCFG0,TCFG1) 目的产生一定的定时器时钟周期
时钟频率计算公式: 定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值}
TCFGn
定时器配制寄存器 0(TCFG0) 位[7:0]、位[15:8]分别用于控制预分频器0、1,范 围0~255。经过预分频器出来的始终频率:PCLK / {预分频值+1} 定时器配制寄存器 1(TCFG1) 经过预分频器的始终将被2、4、8、16分频
示例:假设PCLK=50M,预分频值=249,分频值=8 时钟频率 = 50M/(249+1)/8=25Khz 时钟周期=1/25KHZ = 40us
PWM
假设设置 TCNTBn 为 150,设 置 TCMPBn 为 100。置位手动更新位并且配制变相位(开/关),开 启自动装载,清除手动更新位后,开启定时器, 则输出波形如下:
TOUTn 50 100
工作原理
定时计数缓冲寄存器(TCNTBn)包含了一个(当定时器被使能 时)被加载到递减计数器中的初始值。定时比较缓冲寄存器( TCMPBn)包含了与递减计数器相比较的初始值。 这种 TCNTBn 和TCMPBn的双缓冲特征保证了改变频率和占空比 时定时器产生稳定的输出。 每个定时器有它自己的由定时器时钟驱动的 16 位递减计数器 。当递减计数器到达零时,产生定时器中断请求通知CPU定时 器操作已经完成。当定时器计数器到达零时,相应的TCNTBn的 值将自动被加载到递减计数器以继续下一次操作。然而,如果 定时器停止了,例如,在定时器运行模式期间清除 TCONn 的 定时器使能位,TCNTBn的值将不会被重新加载到计数器中。 TCMPBn的值是用于脉宽调制(PWM)。当递减计数器的值与定 时器控制逻辑中的比较寄存器的值相匹配时定时器控制逻辑改 变输出电平。因此,比较寄存器决定PWM输出的开启时间(或 关闭时间)。
自动重载
S3C2440A PWM定时器包含双缓冲功能,允许在不停止当前 定时器操作的情况下为下次定时器操作改变重载值。所以 即使设置了新的定时器值,当前定时器操作仍然顺利的被 完成。 定时器值可以被写入到定时器计数缓冲寄存器(TCNTBn) 中并且可以从定时器计数监视寄存器(TCNTOn)中读取当 前定时器的计数值。如果读取TCNTBn,读出的值不是指示 当前计数器的状态而是下次定时器持续时间的重载值。 自动重载操作在 TCNTn 到达 0 时复制 TCNTBn 到TCNTn。 如果需要改变TCNTBn,需执行手动更新。 TCNTBn 的值,只有在 TCNTn 到达 0并且使能了自动重载 时才被加载到 TCNTn。如果 TCNTn 变为 0 并且自动重载 位为 0,TCNTn 不会进一步任何操作。
TCFG0
定时器配制寄存器 0(TCFG0)
TCFG1
定时器配制寄存器 1(TCFG1)
• 步骤2:配置计数初始值 (TCNTBn) 目的产生一个计数初始值 (注意:这里暂没有设置比较值,不产生PWM脉冲控制)
初始值计算公式: 初始值 = 定时时间 / 时钟周期
问:假设时钟周期已设置40us,若要定时500ms产生一次中断, 初始值等于多少? 初始值 = 500ms/40us=12500
输出反转 自动加载
2 3
内部结构
一个定时器(除了定时器4)包含TCNTBn,TCNTn,TCMPBn和 TCMPn。(TCNTn 和TCMPn是内部寄存器的名称。 从 TCNTOn 寄存器中可以读取TCNTn) 当定时器到达0 时TCNTBn和 TCMPBn被加载到TCNTn和 TCMPn中。当 TCNTn到达0 时,如果 中断为使能则将发生一个中断请求。
手动更新
位
1
设置
0:无用 1:将TCNTB0/TCMPB0寄存器的值装入内 部寄存器TCNT0/TCMP0
• 步骤4:设置自动装载,并清除手动更新 目的:第一次手动更新后,TCNTn有计数 值,但是当计数到0时,没有再给TCNTBn赋 值就不会再计数,所以设置自动装载 (注意:设置自动装载后,要把手动更新清除)
内部工作流程
定时器内部控制逻辑工作流程:
程序初始化,设定TCMPBn、TCNTBn这两个寄存器,他们表 示定时器n的比较值、初始计数值。 随之设置TCON寄存器启动定时器n,这是TCMPBn、TCNTBn 的值将被装入其内部寄存器TCMPn、TCNTn中。在定时器n 的工作频率下,TCNTn开始计数,其值可以通过读取 TCNTOn寄存器获得。 当TCNTn的值等于TCMPn的值时,定时器n的输出管脚TOUTn 反转;TCNTn继续减1计数。 当TCNTn的值到达0时,其输出管脚TOUTn再次反转。并触 发定时器的中断(假设中断使能) 当TCNTn的值到达0时,如果TCON寄存器中将定时器n设为 “自动加载”,则TCMPBn和TCNTBn寄存器的值被自动装入 TCMPn和TCNTn中,下一个计数流程开始。
过程分析
1. 使能自动重载功能。设置 TCNTBn 为 160(50+110)并且设 置 TCMPBn 为 110。置位手动更新位并且配制变相位(开/关).手 动更新位分别设置TCNTn和TCMPn到TCNTBn 和TCMPBn 的值中。然 后分别设置TCNTBn和 TCMPBn 为80(40+40)和40,以决定下次 重载值。 2. 设置启动位,预设手动更新位为 0,变相位为关,自动重载 位为开。定时器在定时器分辨率内的等待时间后启动递减计数。 3.当 TCNTn 与TCMPn 的值相同时,TOUTn 的逻辑电平从低电 平变为高电平。
概述
• S3C2440A 有 5 个 16 位定时器。其中定时器 0 、1、2 和 3 具有脉宽调制(PWM)功能。定时器 4 是一个无输出引脚的内部定时器。定时器0还包 含用于大电流驱动的死区发生器。 • 定时器 0和 1共用一个8位预分频器,定时器2、3 和 4 共用另外的8 位预分频器。每个定时器都有 一个可以生成5 种不同分频信号(1/2,1/4,1/8 ,1/16 和TCLK)的时钟分频器。每个定时器模块 从相应8 位预分频器得到时钟的时钟分频器中得 到其自己的时钟信号。8 位预分频器是可编程的 ,并且按存储在 TCFG0 和 TCFG1 寄存器中的加 载值来分频PCLK。
位
0 1 0:停止定时器 1:开启定时器
设置
0:无用 1:将TCNTB0/TCMPB0寄存器的值装入 内部寄存器TCNT0/TCMP0 0:TOUT0不反转; 1:TOUT0反转 0:不自动加载 1:在定时器0计数达到0时,将 TCNTB0/TCMPB0寄存器的值自动装入内 部寄存器TCNT0/TCMP0
软定时器封装
软定时器:
void TIMER_TS_Init(... ...) int TIMER_TS_Create(... ...) int TIMER_TS_Destory(int nTimerId) int TIMER_TS_Start(int nTimerId) int TIMER_TS_Stop(int nTimerId) int TIMER_TS_ResetTimeout(int nTimerId, int nTimerOut) int TIMER_TS_Dispatch()
PWM定时器
第五章 定时器
本章目标
• 2440PWM定时器的基本操作 • 定时器中断操作 • 软定时器的封装
特性
什么是定时器 定时器的本质就是一个递减的计数器, 根据触发条件在计数器的值达到触发条件的时 候,触发事件的发生。 特性 – – – – –
五个 16 位定时器 两个8 位预分频器和两个4 位分频器 可编程输出波形的占空比控制(PWM) 自动重载模式或单脉冲模式 死区发生
3
步骤5: • 注册定时器中断服务函数 • 并开启定时器中断
• 步骤6:开启定时器 功能
开启/停止
位
0 0:停止定时器 1:开启定时器
设置
PWM
• 要使用PWM脉宽调试的方法 在原来的步骤2(配置计数初始值 --TCNTBn)时, 同时配置TCMPBn,并设置TCON的输出反转
TCON
功能
开启/停止 手动更新
过程分析
4.当 TCNTn到达0时, 发出中断请求并且TCNTBn的值加载到 暂存器中。 在下一个定时器标记时刻, 重载TCNTn为暂存器 (TCNTBn)的值。 5.中断服务程序(ISR)中,为下一个持续时间分别设置TCNTBn 和TCMPBn为80(20+60)和 60。 6.当 TCNTn 与TCMPn 的值相同时,TOUTn 的逻辑电平从低电平 变为高电平。 7.当当TCNTn到达0 时,触发一个中断自动重载TCNTn 为TCNTBn 的值。 8.中断服务程序(ISR)中,禁止自动重载和中断请求以停止定 时器。 9.当 TCNTn 与TCMPn 的值相同时,TOUTn 的逻辑电平从低电平 变为高电平。 10.尽管TCNTn到达0,但因为禁止了自动重载,所以TCNTn并不 会再次重载并且定时器已经停止了。 11. 不再产生中断请求。
rTCON &= ~0xF00000; rTCON |= 0x700000; rTCON &= ~0x200000 ;
//定时器4开始工作
硬件驱动
硬件接口函数:
1、 int TIMER_Init(int nTimerID,int nDiv0,int nDiv1)//配置预分频比 2、int TIMER_Create(... ...) //配置定时器 3、int TIMER_Destory(int nTimerID)//注销定时器 中断 4、void TIMER_Start(int nTimerID)//启动定时器 5、void TIMER_Stop(int nTimerID)//停止定时器
TCNTBn、TCMPBn
定时器 计数寄存器和比较寄存器(TCNTB0/TCMPB0)
• 步骤3:把初始值装载进内部TCNTn
过程:设置TCON寄存器的手动更新位,当给TCON 寄存器的手动更新位置1,即将TCNTB0寄存器的值 装 入内部寄存器TCNT0
(注意:第一次要手动更新)
TCON
TCON
功能
开启/停止 手动更新
位
0 1 0:停止定时器 1:开启定时器
设置
0:无用 1:将TCNTB0/TCMPB0寄存器的值装入内 部寄存器TCNT0/TCMP0 0:不自动加载 1:在定时器0计数达到0时,将 TCNTB0/TCMPB0寄存器的值自动装入内 部寄存器TCNT0/TCMP0
自动加载
配置定时器流程
选择一个定时器(0,1,2,3,4) 设置预分频值(TCFG0) 设置分频值(TCFG1) 设置计数初始值(TCNTBn) 设置TCON(手动更新,自动加载) 清除TCON的手动更新 注册定时器中断服务函数 开启定时器中断(定时器中断使能) 开启定时器
代码分析
rTCFG0 &= 0xFF00FF; rTCFG0 |= 0xf900; // prescaler等于249 rTCFG1 &= ~0xF0000; rTCFG1 |= 0x20000; //divider等于8,则设置定时器4的时钟频率为25kHz rTCNTB4 = 12500; //让定时器4每隔0.5秒中断一次
功能框图
定时器0 比定时器1 多了死区 发生器
定时器1 比定时器4 多了具有 脉宽调制 (PWM) 功能
定时器2
定时器3 无输出引脚 内部定时器
定时器4
• 步骤1:配置预分频器和分频值 (TCFG0,TCFG1) 目的产生一定的定时器时钟周期
时钟频率计算公式: 定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值}
TCFGn
定时器配制寄存器 0(TCFG0) 位[7:0]、位[15:8]分别用于控制预分频器0、1,范 围0~255。经过预分频器出来的始终频率:PCLK / {预分频值+1} 定时器配制寄存器 1(TCFG1) 经过预分频器的始终将被2、4、8、16分频
示例:假设PCLK=50M,预分频值=249,分频值=8 时钟频率 = 50M/(249+1)/8=25Khz 时钟周期=1/25KHZ = 40us
PWM
假设设置 TCNTBn 为 150,设 置 TCMPBn 为 100。置位手动更新位并且配制变相位(开/关),开 启自动装载,清除手动更新位后,开启定时器, 则输出波形如下:
TOUTn 50 100
工作原理
定时计数缓冲寄存器(TCNTBn)包含了一个(当定时器被使能 时)被加载到递减计数器中的初始值。定时比较缓冲寄存器( TCMPBn)包含了与递减计数器相比较的初始值。 这种 TCNTBn 和TCMPBn的双缓冲特征保证了改变频率和占空比 时定时器产生稳定的输出。 每个定时器有它自己的由定时器时钟驱动的 16 位递减计数器 。当递减计数器到达零时,产生定时器中断请求通知CPU定时 器操作已经完成。当定时器计数器到达零时,相应的TCNTBn的 值将自动被加载到递减计数器以继续下一次操作。然而,如果 定时器停止了,例如,在定时器运行模式期间清除 TCONn 的 定时器使能位,TCNTBn的值将不会被重新加载到计数器中。 TCMPBn的值是用于脉宽调制(PWM)。当递减计数器的值与定 时器控制逻辑中的比较寄存器的值相匹配时定时器控制逻辑改 变输出电平。因此,比较寄存器决定PWM输出的开启时间(或 关闭时间)。
自动重载
S3C2440A PWM定时器包含双缓冲功能,允许在不停止当前 定时器操作的情况下为下次定时器操作改变重载值。所以 即使设置了新的定时器值,当前定时器操作仍然顺利的被 完成。 定时器值可以被写入到定时器计数缓冲寄存器(TCNTBn) 中并且可以从定时器计数监视寄存器(TCNTOn)中读取当 前定时器的计数值。如果读取TCNTBn,读出的值不是指示 当前计数器的状态而是下次定时器持续时间的重载值。 自动重载操作在 TCNTn 到达 0 时复制 TCNTBn 到TCNTn。 如果需要改变TCNTBn,需执行手动更新。 TCNTBn 的值,只有在 TCNTn 到达 0并且使能了自动重载 时才被加载到 TCNTn。如果 TCNTn 变为 0 并且自动重载 位为 0,TCNTn 不会进一步任何操作。
TCFG0
定时器配制寄存器 0(TCFG0)
TCFG1
定时器配制寄存器 1(TCFG1)
• 步骤2:配置计数初始值 (TCNTBn) 目的产生一个计数初始值 (注意:这里暂没有设置比较值,不产生PWM脉冲控制)
初始值计算公式: 初始值 = 定时时间 / 时钟周期
问:假设时钟周期已设置40us,若要定时500ms产生一次中断, 初始值等于多少? 初始值 = 500ms/40us=12500
输出反转 自动加载
2 3
内部结构
一个定时器(除了定时器4)包含TCNTBn,TCNTn,TCMPBn和 TCMPn。(TCNTn 和TCMPn是内部寄存器的名称。 从 TCNTOn 寄存器中可以读取TCNTn) 当定时器到达0 时TCNTBn和 TCMPBn被加载到TCNTn和 TCMPn中。当 TCNTn到达0 时,如果 中断为使能则将发生一个中断请求。