目录
一、简介
基本定时器(TMR6和TMR7)包含一个16位向上计数器,由内部时钟作为计数时钟,支持溢出事件中断和DMA请求。
二、功能
1.计数时钟
TMR6和TMR7由内部时钟源(CK_INT)经预分频器提供计数器计数。
使用内部时钟(CK_INT)
2.基本结构
- TMRx_PR(周期寄存器):用于设置计数器计数周期;
- TMRx_DIV(预分频寄存器):用于设置计数器计数频率;
- TMRx_CNT(计数值寄存器):用于读/写计数器的计数值;
- PR_shadow(周期影子寄存器):默认TMRx_PR的值会立即传入它的影子寄存器;
- DIV_shadow(预分频影子寄存器):默认TMRx_DIV的值会立即传入它的影子寄存器;
- PRBEN(周期缓冲使能):选择是否打开周期缓冲功能;
注:
若PRBEN=0,即关闭周期缓冲功能,则TMRx_PR的值会立即传入它的影子寄存器(PR_shadow);
PRBEN=0时的溢出事件
如上图,关闭周期缓冲功能时,改写PR(计数周期由0x22改为0x32)后,COUNTER立即使用新的计数值(0x32)。
若PRBEN=1,即打开周期缓冲功能,则TMRx_PR的值会在溢出事件发生时传入它的影子寄存器(PR_shadow);
PRBEN=1时的溢出事件
如上图,打开周期缓冲功能时,改写PR(计数周期由0x22改为0x32)后,COUNTER仍是使用旧的计数值(0x22),等OVFIF(溢出中断标志)产生信号之后,才使用新的计数值(0x32)。
3.计数模式
基本定时器仅提供向上计数模式,即当计数值达到TMR_PR时,计数器向上溢出并产生溢出事件,同时OVFIF(溢出中断标志)置1,之后重新从0开始计数;
计数器时序图
三、寄存器
1.控制寄存器1(TMRx_CTRL1)
注:未显示的位均保留默认值;
域[15:0] 简称 功能 位7 PRBEN 周期缓冲使能(Period buffer enable)
0:关闭;
1:开启。
位3 OCMEN 单周期使能 (One cycle mode enable)
0:关闭;
1:开启,溢出事件后,计数器停止计数。
位2 OVFS 溢出事件源选择 (Overflow event source)
0:来源于计数器溢出、设置 OVFSWTR 位或次定时器控制器产生的溢出事件;
1:只能来源于计数器溢出。
位1 OVFEN 溢出事件使能(Overflow event enable)
0:允许溢出事件产生,溢出事件如下:
- 计数器溢出;
- 将OVFSWTR位置 1;
- 通过次定时器控制器产生的溢出事件;
1:禁止溢出事件产生。
如果将OVFSWTR位置1或次定时器控制器产生了一个硬件复位,则计数器和预分频器将被重新初始化。
注:该位由软件置1和清0。
位0 TMREN 使能定时器(TMR enable)
0:关闭;
1:开启。
2.控制寄存器2(TMRx_CTRL2)
注:未显示的位均保留默认值;
域[15:0] 简称 功能 位6:4 PTOS 主定时器输出信号选择(Primary TMR output selection)
TMRx输出到次定时器的信号选择:
000:复位;
001:使能;
010:更新;
3.中断使能寄存器(TMRx_IDEN)
注:未显示的位均保留默认值;
域[15:0] 简称 功能 位8 OVFDEN 溢出事件的DMA请求使能
(overflow event DMA request enable)
0:关闭;
1:开启。
位0 OVFIEN 溢出中断使能
(overflow interrupt enable)
0:关闭;
1:开启。
4.中断状态寄存器(TMRx_ISTS)
注:未显示的位均保留默认值;
域[15:0] 简称 功能 位0 OVFIF 溢出中断标记(Overflow interrupt flag)
0:无溢出事件发生;
1:发生溢出事件,若TMRx_CTRL1的OVFEN=0、OVFS=0时:
− 当 TMRx_SWEVE 寄存器的OVFG=1时产生溢出事件;
− 当计数值CVAL 被触发事件重初始化时产生溢出事件。
注:当溢出事件发生时由硬件置’1’,由软件清’0’。
5.软件事件寄存器(TMRx_SWEVT)
注:未显示的位均保留默认值;
域[15:0] 简称 功能 位0 OVFSWTR 软件触发溢出事件
( Overflow event triggered by software)
0:无作用;
1:软件触发一个溢出事件。
6.计数值寄存器(TMRx_CVAL)
域[15:0] 简称 功能 位15:0 CVAL 计数值(Counter value)
7.分频系数寄存器(TMRx_DIV)
域[15:0] 简称 功能 位15:0 DIV 分频系数(Divider value)
计数器时钟频率
fCK_CNT = fTMR_CLK /(DIV[15:0]+1)。
8.周期寄存器(TMRx_PR)
域[15:0] 简称 功能 位15:0 PR 周期值(Period value)
定时器计数的周期值。当周期值为0时,定时器不工作。
四、案例
1.描述
TMR6向上计数,每过1秒溢出1次同时让LED闪烁1次。
2.步骤
①打开WorkBench,选择对应的型号,以AT32F403A为例新建工程;
②通过分频系数和周期值设定溢出频率为1Hz,即1秒溢出1次;
③打开溢出中断;
④选择任意端口作为端口输出,以PD13为例;
⑤配置PD13;
⑥代码预览。
3.代码
main.c
#include "at32f403a_407_wk_config.h" #include "at32f403a_407_board.h" int main(void) { wk_system_clock_config(); wk_periph_clock_config(); wk_nvic_config(); wk_tmr6_init(); wk_gpio_config(); while(1) { } }
at32f403a_407_wk_config.c
#include "at32f403a_407_wk_config.h" void wk_system_clock_config(void) { crm_reset(); crm_clock_source_enable(CRM_CLOCK_SOURCE_LICK, TRUE); while(crm_flag_get(CRM_LICK_STABLE_FLAG) != SET) { } crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE); while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET) { } crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_60, CRM_PLL_OUTPUT_RANGE_GT72MHZ); crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE); while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET) { } crm_ahb_div_set(CRM_AHB_DIV_1); crm_apb2_div_set(CRM_APB2_DIV_2); crm_apb1_div_set(CRM_APB1_DIV_2); crm_auto_step_mode_enable(TRUE); crm_sysclk_switch(CRM_SCLK_PLL); while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL) { } crm_auto_step_mode_enable(FALSE); system_core_clock_update(); } void wk_periph_clock_config(void) { crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_TMR6_PERIPH_CLOCK, TRUE); } void wk_nvic_config(void) { nvic_priority_group_config(NVIC_PRIORITY_GROUP_4); nvic_irq_enable(TMR6_GLOBAL_IRQn, 0, 0); }
at32f403a_407_int.c
#include "at32f403a_407_int.h" void TMR6_GLOBAL_IRQHandler(void) { if(tmr_interrupt_flag_get(TMR6, TMR_OVF_FLAG) != RESET) { tmr_flag_clear(TMR6, TMR_OVF_FLAG); GPIOD->odt ^= GPIO_PINS_13; //PD13电平翻转 } }
4.现象
LED(PD13)每隔1秒闪烁一次。
参考资料:
《RM_AT32F403A_407_CH_V2.06》的14.1基本定时器(TMR6和TMR7)编辑 网页链接