开发环境:
IDE:MounRiver Studio
MCU:CH585
1 定时器的工作原理
CH585定时器最基本功能是定时,可以设置不同时间长度的定时。定时器除了最基本的定时功能外,定时器与GPIO有挂钩使得它可以发挥强大的作用,比如可以输出不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。
CH585有4 个 26 位定时器,TMR0、TMR1、TMR2 和 TMR3,最长定时时间为 2^26 个时钟周期。它适用于多种场合,包括测量输入信号脉冲长度(输入捕捉)或者产生输出波形(PWM),支持 DMA 功能。每个定时器都是完全独立的,可以一起同步操作。
2 定时器代码实现
接下来我们以通用定时器 TMR0为实例,来说明要经过哪些步骤,才能达到这个要求,并产生中断。
2.1 定时器配置步骤
这里我们就对每个步骤通过库函数的实现方式来描述。首先要提到的是,定时器相关的库函数主要集中在固件库文件CH58x_timerx.h 和CH58x_timerx.c 文件中。
1) TMR0时钟初始化。
TMR0是挂载在 HCLK 之下,所以我们通过 HCLK总线下的使能使能函数来使能 TMR0。调用的函数是:
void TMR0_TimerInit(uint32_t t)
2) 开启 TMR0中断。
因为我们要使用 TMR0的更新中断, 寄存器的相应位便可使能更新中断。 在库函数里面定时器中断使能是通过TMR0_ITCfg函数来实现的:
#define TMR0_ITCfg(s, f) ((s) ? (R8_TMR0_INTER_EN |= f) : (R8_TMR0_INTER_EN &= ~f))
3) 允许 TMR0工作,也就是使能 TMR0中断向量。
光配置好定时器还不行,没有开启定时器,照样不能用。我们在配置完后要开启定时器。在固件库里面使能定时器的函数是通过TIM_Cmd函数来实现的:
__attribute__((always_inline)) RV_STATIC_INLINE void PFIC_EnableIRQ(IRQn_Type IRQn)
4) 编写中断服务函数。
在最后,还是要编写定时器中断服务函数,通过该函数来处理定时器产生的相关中断。在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是中断结束标志。
__attribute__((interrupt("WCH-Interrupt-fast")))
void TMR0_IRQHandler(void) {
TMR0_ClearITFlag(TMR0_3_IT_CYC_END);
}
通过以上几个步骤,我们就可以达到我们的目的了,使用通用定时器的中断,来控制LED的亮灭。
主函数如下:
#include "CH58x_common.h"
volatile uint32_t timer_flag = 0; // 中断标志
/*********************************************************************
* @fn main
*
* [url=home.php?mod=space&uid=2666770]@Brief[/url] 主函数
*
* [url=home.php?mod=space&uid=1141835]@Return[/url] none
*/
int main()
{
HSECFG_Capacitance(HSECap_18p);
// 配置系统时钟(使用内部32MHz时钟)
SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
// 初始化GPIO
// 初始化GPIOB8, PB17为推挽输出(驱动能力5mA)
GPIOB_ModeCfg(GPIO_Pin_8 | GPIO_Pin_17,
GPIO_ModeOut_PP_5mA);
// 初始状态:所有LED熄灭
GPIOB_SetBits(GPIO_Pin_8 | GPIO_Pin_17);
//初始化定时器
TMR0_TimerInit(FREQ_SYS); // 周期=1秒
TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 使能周期结束中断
PFIC_EnableIRQ(TMR0_IRQn); // 使能中断向量
while(1)
{
if (timer_flag)
{
GPIOB_InverseBits(GPIO_Pin_8); // 翻转LED
GPIOB_InverseBits(GPIO_Pin_17); // 翻转LED
timer_flag = 0;
}
}
}
2.2 实现现象
将编译好的程序下载到看板子中,可以看到LED不停闪烁,延时时间为1s。