本帖最后由 聪聪哥哥 于 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 的同步电路
二:功能介绍:
TMR6 和 TMR7 由内部时钟源(CK INT)经由预分频器提供计数器计数。
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计数器基本结构
向上计数模式
上计数模式计数值达到 TMRX PR 值时,重新从0向上计数,计数器上溢并产生溢出事件,同时 OVFIF位置 1。若禁止产生溢出事件,计数器溢出后不再重载预分频值和周期值,否则预分频值和周期值在溢出事件后更新。
图 14-4PRBEN=0时的溢出事件
三:AT work bench 软件配置过程:
3.1 配置基本参数
3.2 使能定时3 中断
四:代码编写:
4.1 初始化:
void wk_tmr6_init(void)
{
/* add user code begin tmr6_init 0 */
/* add user code end tmr6_init 0 */
/* add user code begin tmr6_init 1 */
/* add user code end tmr6_init 1 */
/* configure counter settings */
tmr_cnt_dir_set(TMR6, TMR_COUNT_UP);
tmr_period_buffer_enable(TMR6, TRUE);
tmr_base_init(TMR6, 1799, 9999);
/* configure primary mode settings */
tmr_primary_mode_select(TMR6, TMR_PRIMARY_SEL_ENABLE);
/* configure overflow event */
tmr_overflow_request_source_set(TMR6, TRUE);
tmr_counter_enable(TMR6, TRUE);
/**
* Users need to configure TMR6 interrupt functions according to the actual application.
* 1. Call the below function to enable the corresponding TMR6 interrupt.
* --tmr_interrupt_enable(...)
* 2. Add the user's interrupt handler code into the below function in the at32m412_416_int.c file.
* --void TMR6_DAC_GLOBAL_IRQHandler(void)
*/
/* add user code begin tmr6_init 2 */
tmr_interrupt_enable(TMR6, TMR_OVF_INT, TRUE);
/* add user code end tmr6_init 2 */
4.2 定时器中断函数编写:
void TMR6_DAC_GLOBAL_IRQHandler(void)
{
/* add user code begin TMR6_DAC_GLOBAL_IRQ 0 */
/* add user code end TMR6_DAC_GLOBAL_IRQ 0 */
/* add user code begin TMR6_DAC_GLOBAL_IRQ 1 */
if(tmr_interrupt_flag_get(TMR6, TMR_OVF_FLAG) == SET)
{
/* add user code... */
gpio_bits_toggle(GPIOF,GPIO_PINS_7| GPIO_PINS_8);
tmr_flag_clear(TMR6, TMR_OVF_FLAG);
}
/* add user code end TMR6_DAC_GLOBAL_IRQ 1 */
}
试验现象:烧录代码之后,LED灯以100MS的时间间隔闪烁,基本定时器6 功能调试完成。
测试图如下:
代码如下:
01_TIME6.zip
(6.88 MB)
|