本帖最后由 ArterySW 于 2022-5-10 19:35 编辑
定时器入门指南——第2讲 前言:
定时器基本上是所有嵌入式芯片都会具有的一个功能,不同的芯片在操作上也是大同小异,本指南将一一介绍定时器的各种功能,旨在让大家掌握AT32系列的定时器使用,以AT32403A为例。首先AT32403A提供了三种不同类型的定时器,分为基本定时器(BSCTMR)、通用定时器(GPTMR)以及高级定时器(ADVTMR),总共多达14个不同的定时器。第二讲将会对定时器的中断进行讲解。
一、基本原理
通过Cortex-m4中的中断向量控制器(NVIC),能够实现对中断的控制。除此之外,还需要通过对定时器的一系列寄存器的进行配置或读取才能实现定时器中断的各项功能。由于高级定时器中的中断种类是最丰富的,所以下面将以高级定时器TMR1的中断为例。
二、中断种类
对于高级定时器一共有8个中断,分别是:
- 1个更新中断
- 4个通道中断
- 1个HALL中断
- 1个触发中断
- 1个刹车中断
其中刹车和HALL中断为高级定时器所特有,基本定时器仅有更新中断,通用定时器会有更新、通道和触发中断。
三、中断配置
对于定时器的中断配置主要涉及以下几个寄存器:
- DMA/中断使能寄存器(TMRx_IDEN)
- 中断状态寄存器(TMRx_ISTS)
- 软件事件寄存器(TMRx_SWEVT)
下面以TMR1的更新中断为例来看看代码:/* TMR1 更新中断使能 */
tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
/* TMR1 更新中断 NVIC 使能 */
nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 0, 0);
/* TMR1 中断处理函数 */
void TMR1_OVF_TMR10_IRQHandler(void)
{
if(tmr_flag_get(TMR1, TMR_OVF_FLAG) != RESET)
{
/* add user code... */
tmr_flag_clear(TMR1, TMR_OVF_FLAG);
}
}
对于AT32系列MCU的定时器,还提供了软件触发定时器中断的功能,只需要调用以下函数操作软件事件寄存器(TMRx_SWEVT)即可:
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] generate tmr event
* @param tmr_x: select the tmr peripheral.
* this parameter can be one of the following values:
* TMR1, TMR2, TMR3, TMR4, TMR5, TMR9, TMR10, TMR11
* @param tmr_event
* this parameter can be one of the following values:
* - TMR_OVERFLOW_SWTRIG
* - TMR_C1_SWTRIG
* - TMR_C2_SWTRIG
* - TMR_C3_SWTRIG
* - TMR_C4_SWTRIG
* - TMR_HALL_SWTRIG
* - TMR_TRIGGER_SWTRIG
* - TMR_BRK_SWTRIG
* @retval none
*/
void tmr_event_sw_trigger(tmr_type *tmr_x, tmr_event_trigger_type tmr_event)
{
tmr_x->swevt |= tmr_event;
}
可以看到针对定时器中断所使用的代码并不复杂,主要就是对于前面提到的TMRx_IDEN、TMRx_ISTS和TMRx_SWEVT三个寄存器的操作。IDEN,用于定时器中断使能;ISTS,用于中断状态读取和清除;SWEVT,用于软件触发中断事件。
|