[AT32M412] 【AT-START-M412测评】+ 04基本定时器6调试过程

[复制链接]
 楼主| 发表于 2025-6-18 09:10 | 显示全部楼层 |阅读模式
本帖最后由 聪聪哥哥 于 2025-6-18 09:28 编辑

今天和大家分享一下使用AT32 work bench V1.1.09 版本配置一下,基本定时器6的过程。
一:基本定时器知识分享:
1.1基本定时器(TMR6和TMR7)
1.1.1 TMR6和TMR7简介
基本定时器(TMR6 和 TMR7)包含一个 16 位向上计数器以及对应的控制逻辑,没有外部 O 接入。可用于简单的定时功能以及为 DAC 提供时钟。
1.1.2 TMR6和TMR7的主要功能
16位向上计数器,可自动装载16 位预分频器,用于对TMR CLK时钟分频,分频系数为1~65536之间的任意数值触发 DAC 的同步电路

1.png
二:功能介绍:
TMR6 和 TMR7 由内部时钟源(CK INT)经由预分频器提供计数器计数。
2.png
2.1 计数模式:基本定时器仅提供向上计数模式。其内部拥有一个16 位计数器。TMRX PR 寄存器用于设置计数器计数周期。默认 TMRX PR 寄存器值会立即传入它的影子寄存器:当开启周期缓冲功能后(PRBEN置1),TMRXPR寄存器值在溢出事件发生时传入它的子寄存器。TMRX DIN寄存器用于设置计数器计数频率,每(DIV[15:0]+1)个计数时钟周期,计数器计数一次。和TMRX_PR 寄存器类似,开启周期缓冲功能后,TMRX_DI 寄存器值在溢出事件时更新至它的影子寄存器。
读取 TMRX_CNT 寄存器会返回当前计数器计数值,写入TMRX_CNT 寄存器会更新计数器当前计数值为写入值。
默认允许产生溢出事件,设置 TMRX CTRL1 寄存器 OVFEN=1将禁止溢出事件产生。TMRX CTRL1 寄存器 OVFS 用于选择溢出事件来源,默认计数器上溢或下溢、置位 OVFSWTR、复位模式次定时器控制器产生的复位信号产生溢出事件。置位 OVFS后,只有计数器上溢或下溢产生溢出事件。TMREN 位置1将使能定时器计数,由于同步逻辑,实际驱动计数器的使能信号 TMR EN 相对于 TMREN延迟一个时钟周期。
图14-3计数器基本结构
3.png
向上计数模式
上计数模式计数值达到 TMRX PR 值时,重新从0向上计数,计数器上溢并产生溢出事件,同时 OVFIF位置 1。若禁止产生溢出事件,计数器溢出后不再重载预分频值和周期值,否则预分频值和周期值在溢出事件后更新。
图 14-4PRBEN=0时的溢出事件

4.png
三:AT work bench 软件配置过程:
3.1 配置基本参数
5.png
3.2 使能定时3 中断
6.png
四:代码编写:
4.1 初始化:
  1. void wk_tmr6_init(void)
  2. {
  3.   /* add user code begin tmr6_init 0 */
  4.   /* add user code end tmr6_init 0 */
  5.   /* add user code begin tmr6_init 1 */
  6.   /* add user code end tmr6_init 1 */
  7.   /* configure counter settings */
  8.   tmr_cnt_dir_set(TMR6, TMR_COUNT_UP);
  9.   tmr_period_buffer_enable(TMR6, TRUE);
  10.   tmr_base_init(TMR6, 1799, 9999);
  11.   /* configure primary mode settings */
  12.   tmr_primary_mode_select(TMR6, TMR_PRIMARY_SEL_ENABLE);
  13.   /* configure overflow event */
  14.   tmr_overflow_request_source_set(TMR6, TRUE);
  15.   tmr_counter_enable(TMR6, TRUE);
  16.   /**
  17.    * Users need to configure TMR6 interrupt functions according to the actual application.
  18.    * 1. Call the below function to enable the corresponding TMR6 interrupt.
  19.    *     --tmr_interrupt_enable(...)
  20.    * 2. Add the user's interrupt handler code into the below function in the at32m412_416_int.c file.
  21.    *     --void TMR6_DAC_GLOBAL_IRQHandler(void)
  22.    */
  23.   /* add user code begin tmr6_init 2 */
  24.   tmr_interrupt_enable(TMR6, TMR_OVF_INT, TRUE);
  25.   /* add user code end tmr6_init 2 */
4.2 定时器中断函数编写:
  1. void TMR6_DAC_GLOBAL_IRQHandler(void)
  2. {
  3.   /* add user code begin TMR6_DAC_GLOBAL_IRQ 0 */
  4.   /* add user code end TMR6_DAC_GLOBAL_IRQ 0 */
  5.   /* add user code begin TMR6_DAC_GLOBAL_IRQ 1 */
  6.   if(tmr_interrupt_flag_get(TMR6, TMR_OVF_FLAG) == SET)
  7.   {
  8.     /* add user code... */
  9.     gpio_bits_toggle(GPIOF,GPIO_PINS_7| GPIO_PINS_8);
  10.     tmr_flag_clear(TMR6, TMR_OVF_FLAG);
  11.   }
  12.   /* add user code end TMR6_DAC_GLOBAL_IRQ 1 */
  13. }
试验现象:烧录代码之后,LED灯以100MS的时间间隔闪烁,基本定时器6 功能调试完成。
测试图如下:
WeChat_20250618092513 00_00_00-00_00_30.gif
代码如下:
01_TIME6.zip (6.88 MB, 下载次数: 0)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

219

帖子

1

粉丝
快速回复 返回顶部 返回列表