AT32F403A基本定时器

目录

一、简介

二、功能

1.计数时钟

2.基本结构

3.计数模式

三、寄存器

1.控制寄存器1(TMRx_CTRL1)

2.控制寄存器2(TMRx_CTRL2)

3.中断使能寄存器(TMRx_IDEN)

4.中断状态寄存器(TMRx_ISTS) 

5.软件事件寄存器(TMRx_SWEVT) 

6.计数值寄存器(TMRx_CVAL)

7.分频系数寄存器(TMRx_DIV) 

8.周期寄存器(TMRx_PR)

四、案例 

1.描述

2.步骤

3.代码

4.现象


一、简介

基本定时器(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]简称功能
位7PRBEN

周期缓冲使能(Period buffer enable)

0:关闭;

1:开启。

位3OCMEN

单周期使能 (One cycle mode enable)

0:关闭;

1:开启,溢出事件后,计数器停止计数。

位2OVFS

溢出事件源选择 (Overflow event source)

0:来源于计数器溢出、设置 OVFSWTR 位或次定时器控制器产生的溢出事件;

1:只能来源于计数器溢出。

位1OVFEN

溢出事件使能(Overflow event enable)

0:允许溢出事件产生,溢出事件如下:

- 计数器溢出;

- 将OVFSWTR位置 1;

- 通过次定时器控制器产生的溢出事件;

1:禁止溢出事件产生。

如果将OVFSWTR位置1或次定时器控制器产生了一个硬件复位,则计数器和预分频器将被重新初始化。

注:该位由软件置1和清0。

位0TMREN

使能定时器(TMR enable)

0:关闭;

1:开启。

注:未显示的位均保留默认值;

2.控制寄存器2(TMRx_CTRL2)

域[15:0]简称功能
位6:4PTOS

主定时器输出信号选择(Primary TMR output selection)

TMRx输出到次定时器的信号选择:

000:复位;

001:使能;

010:更新;

注:未显示的位均保留默认值;

3.中断使能寄存器(TMRx_IDEN)

域[15:0]简称功能
位8OVFDEN

溢出事件的DMA请求使能

(overflow event DMA request enable)

0:关闭;

1:开启。

位0OVFIEN

溢出中断使能

(overflow interrupt enable)

0:关闭;

1:开启。

注:未显示的位均保留默认值;

4.中断状态寄存器(TMRx_ISTS) 

域[15:0]简称功能
位0OVFIF

溢出中断标记(Overflow interrupt flag)

0:无溢出事件发生;

1:发生溢出事件,若TMRx_CTRL1的OVFEN=0、OVFS=0时:

− 当 TMRx_SWEVE 寄存器的OVFG=1时产生溢出事件;

− 当计数值CVAL 被触发事件重初始化时产生溢出事件。

注:当溢出事件发生时由硬件置’1’,由软件清’0’。

注:未显示的位均保留默认值;

5.软件事件寄存器(TMRx_SWEVT) 

域[15:0]简称功能
位0OVFSWTR

软件触发溢出事件

( Overflow event triggered by software)

0:无作用;

1:软件触发一个溢出事件。

注:未显示的位均保留默认值;

6.计数值寄存器(TMRx_CVAL)

域[15:0]简称功能
位15:0CVAL计数值(Counter value)

7.分频系数寄存器(TMRx_DIV) 

域[15:0]简称功能
位15:0DIV

分频系数(Divider value)

计数器时钟频率

fCK_CNT = fTMR_CLK /(DIV[15:0]+1)

8.周期寄存器(TMRx_PR)

域[15:0]简称功能
位15:0PR

周期值(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)​编辑 网页链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值