定时器程序编写思路
注意:(本文偏向于寄存器程序编写,使用库函数的也可以参考)
定时器:顾名思义就是精准定时,
优势:不同于延时函数一定需要在程序主体中运行,定时器可以独立运行,间接增加单片机多任务处理的能力。
常见的使用有:PWM IO模拟输出,延时函数等
1.概念解析
定时器(时间量度),在单片机系统中需要稳定的时钟源提供稳定参考信号,自身自带晶振或者外部晶振源提供。自身才能根据需求设置,一般单片机系统都配置有1-128倍等不同的倍频,当然分频也不是无限可小的详细参考如下的链接
https://blog.youkuaiyun.com/luoyir1997/article/details/81951797
2:开发思路
1)初始化时钟计数器为0,设置定时器时钟源,根据需求完成分频倍频,或者不操作
2)重装时钟周期:在定时器中我们在不同设计中可能对时钟节拍的需求不同,因此就可以根据需求设置定时器的时钟周期
3)设置定时器模式:https://www.dianyuan.com/article/32264.html ,熟悉不同MCU的模式
4) 启动定时器
有些单片机有捕获事件CCR和匹配事件MCR的需求,当计数需求达到满足会自行的触发中断,溢出不会触发中断,一般是和匹配寄存器同时的使用.
3.使用举例
3.1 延时函数-STM32(库函数)
void TIM6_Delay_ms(uint16_t ms)
{
/* 定义一个定时器基本定时初始化结构体变量 */
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
/* 时钟预分频数为36000,在主频72M时,计数器每500us加1*/
TIM_TimeBaseInitStruct.TIM_Prescaler= 35999;
/* 自动重装载寄存器值 */
TIM_TimeBaseInitStruct.TIM_Period=ms*2;
/* 把上面的值配置到寄存器 */
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);
/* 设置定时时间到了以后停止定时器计数 */
TIM_SelectOnePulseMode(TIM6, TIM_OPMode_Single);
/* 清除SR中的UIF标志 */
TIM_ClearFlag(TIM6, TIM_IT_Update);
/* 打开定时器6 */
TIM_Cmd(TIM6, ENABLE);
/* 检测定时时间是否到来 */
while(TIM_GetFlagStatus(TIM6, TIM_IT_Update)==RESET);
/* 软件清除更新标志 */
TIM_ClearFlag(TIM6, TIM_IT_Update);
}
————————————————
版权声明:本文为优快云博主「登上王者的男人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/xiaolongwoaini99/article/details/80202591
3.2 CC2530-C51单片机
相关设计详细参考网站:https://blog.youkuaiyun.com/return9/article/details/79469259
参考寄存器
/*函数目的实现定时器查询方式进行LED的闪烁
外部晶振32MHZ,设置一个1mS的计数器*/
void Init_timer(void)//系统在不配置的时候默认是2分频,既16M
{
T1CTL = 0x0d;//选择定时器128分频自由计数 自动重装0x00- 0xFFFF(16位)0.125M
T1STAT = 0x21;//0通道 中断4有效
}
void LED_Timer(void)
{
uint i = 0;
for(i = 0;i < 100;i++)
{
if(IRCON)//中断标志4,计数设置为自由模式,自动清0重新计数
{
LED1 = 0;
Delay_ms(10);
LED1 = 1;
}
}
3.3 ARM _LPC2000系列定时器
1)计算定时器的时钟频率,设置PR(预分频寄存器)进行分频操作
2)设置比较匹配寄存器的初值,及其工作模式,当需要设置捕获功能的时候,则根据需求添加
3)在使用定时器的相关中断,则需要设置定时器中断
4)设置TCR(时钟计数寄存器)启动定时器
定时器的计数时钟频率 = Fpclk / N+1
1)定时器作用
/************************************************
* 名称:Time0_init()
* 功能:初始化定时器0,定时时间为0.1S,然后启用定时器
* 入口参数:无
* 出口参数:无
************************************************/
void Time0_init(void)
{
T0TC = 0; //定时器初始化为0
T0PR = 0; //时钟不分频
T0MCR = 0x03; //设置T0MR0匹配后复位T0TC,产生中断标志
T0MCR = Fpclk/10 ;//设置0.1S的匹配值,预装值
T0TCR = 0x01; //定时器0定时控制寄存器启动
}
2)匹配寄存器使用,实现输出50占空比的作用%
/************************************************
* 名称:Time0_init()
* 功能:初始化定时器0,设置MR1匹配时MAT0.1输出取反,
然后MAT0.1实现输出翻转,最终输出占空比为50%的脉冲频率
* 入口参数:无
* 出口参数:无
************************************************/
void Time0_init1(void)
{
T0TC = 0; //定时器初始化为0
T0PR = 0; //时钟不分频
T0MCR = 0x10; //设置T0MR1匹配后复位T0TC
T0EMR = 0xC0; //T0MR1匹配后,MAT0.1输出翻转
T0MR1 = 5000;//输出频率控制周期
T0TCR = 0x01; //定时器0定时控制寄存器启动
}