当正确设置好时钟源并使能了定时器 0 时钟模块,接着去设置正确的定时值,细心观察图 9.3.2,要使定时器 0 触发中断还需
要设置 8 位预分频值寄存器( 8-bit Prescale) 、 定时器 0 计数值( 24-bit up counter) 、 定时器 0 比较值 (24-bit CMPDAT) ,
当计数值与比较值相匹配时,就会将定时器 0 中断标志位 TIF 置位,最后产生定时器 0 中断(Timer0 Interrput) 。
#include "SmartM_M4.h"
VOLATILE BOOL g_vbTimer0Event = FALSE;
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
int32_t main(void)
{
PROTECT_REG
(
/* 系统时钟初始化 */
SYS_Init(PLL_CLOCK);
/* 设置定时器 0 时钟源输入为外部晶振 */
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0);
/* 使能定时器 0 时钟模块 */
CLK_EnableModuleClock(TMR0_MODULE);
)
/* PB8 引脚初始化为输出模式 */
GPIO_SetMode(PB,BIT8,GPIO_MODE_OUTPUT);
/* 设置定时器 0 为定时计数模式且 1 秒内产生 4 次中断 */
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 4);
/* 使能定时器 0 中断 */
TIMER_EnableInt(TIMER0);
/* 使能定时器 0 嵌套向量中断 */
NVIC_EnableIRQ(TMR0_IRQn);
/* 启动定时器 0 开始计数 */
TIMER_Start(TIMER0);
while(1)
{
/* 检查当前是否已经产生了定时器 0 中断 */
if(g_vbTimer0Event)
{
g_vbTimer0Event = FALSE;
PB8 ^= 1;
}
}
}
/****************************************
*函数名称:TMR0_IRQHandler
*输 入:无
*输 出:无
*功 能:定时器 0 中断服务函数
******************************************/
VOID TMR0_IRQHandler(VOID)
{
/* 检查定时器 0 中断标志位是否置位 */
if(TIMER_GetIntFlag(TIMER0) == 1)
{
/* 清除定时器 0 中断标志位 */
TIMER_ClearIntFlag(TIMER0);
g_vbTimer0Event = TRUE;
}
}
|