单片机开发之定时器和中断思路

定时器程序编写思路

注意:(本文偏向于寄存器程序编写,使用库函数的也可以参考)

定时器:顾名思义就是精准定时,

优势:不同于延时函数一定需要在程序主体中运行,定时器可以独立运行,间接增加单片机多任务处理的能力。

              常见的使用有:PWM   IO模拟输出,延时函数等

1.概念解析

定时器(时间量度),在单片机系统中需要稳定的时钟源提供稳定参考信号,自身自带晶振或者外部晶振源提供。自身才能根据需求设置,一般单片机系统都配置有1-128倍等不同的倍频,当然分频也不是无限可小的详细参考如下的链接

https://blog.csdn.net/luoyir1997/article/details/81951797

2:开发思路

       1)初始化时钟计数器为0,设置定时器时钟源,根据需求完成分频倍频,或者不操作

      2)重装时钟周期:在定时器中我们在不同设计中可能对时钟节拍的需求不同,因此就可以根据需求设置定时器的时钟周期

      3)设置定时器模式:https://www.dianyuan.com/article/32264.html  ,熟悉不同MCU的模式

      4)  启动定时器

     有些单片机有捕获事件CCR和匹配事件MCR的需求,当计数需求达到满足会自行的触发中断,溢出不会触发中断,一般是和匹配寄存器同时的使用.

扫描二维码关注公众号,回复: 9605356 查看本文章

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);
}
————————————————
版权声明:本文为CSDN博主「登上王者的男人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaolongwoaini99/article/details/80202591

  3.2 CC2530-C51单片机

相关设计详细参考网站:https://blog.csdn.net/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定时控制寄存器启动
}
发布了34 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xuxudeta/article/details/102491849