发新帖我要提问
12
返回列表
打印
[DemoCode下载]

定时器计数

[复制链接]
楼主: 玛尼玛尼哄
手机看帖
扫描二维码
随时随地手机跟帖
21
M451 系列支持 4 组定时器,那么可以从 4 组中选择其中一组就行了,默认选择定时器 0,同时既然选择了定时操作必须进行时
钟源的选择,通过下图 9.3.1 定时器 0 要正常工作,需要设置 CLKSEL1 寄存器,完成 CLKSEL1 寄存器的设置后,还需要设置
APBCLK0 寄存器使能定时器 0 时钟。为了设置定时器 0 的时钟源并使能,需要调用到库函数 CLK_SetModuleClock 和
CLK_EnableModuleClock,详细代码如下:

定时器 0/1 的时钟源选择与使能



/* 设置定时器 0 时钟源输入为外部晶振 */
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0);
/* 使能定时器 0 时钟模块 */
CLK_EnableModuleClock(TMR0_MODULE);


使用特权

评论回复
22
heisexingqisi| | 2016-7-30 19:57 | 只看该作者
当正确设置好时钟源并使能了定时器 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;
}
}


使用特权

评论回复
23
heisexingqisi| | 2016-7-30 19:58 | 只看该作者
main 函数分析
a. 调用 CLK_SetModuleClock 函数设置定时器的时钟源来自外部 12MHz 高速晶振,由于定时器常用的最小定时值为微秒或毫秒
级别,同时必须是整数,那么选择外部 12MHz 高速晶振最合适不过了。
b. 调用 TIMER_Open 函数用于使能某一定时器,同时设置当前定时器的定时时间,第三个参数用于设置产生中断的次数,亦即说
是若产生中断次数为 4,那么 1S/4=250 毫秒是该定时器的定时时间。
c. 一旦产生中断,g_vbTimer0Event 变量则置位,同时对 PB8 引脚进行异或,即进行 Led 灯点亮与熄灭进行控制。
[4] TMR0_IRQHandler 中断服务函数分析
a. 调用 TIMER_GetIntFlag 函数检查当前定时器 0 是否产生中断,若是则调用 TIMER_ClearIntFlag 清除定时器 0 中断标志
位。
b. 将 g_vbTimer0Event 变量置位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则