当正确设置好时钟源并使能了定时器 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;
- }
- }
|