STM8L1xx利用定时器实现毫秒和微妙延时

发布者:AdventureSeeker最新更新时间:2018-07-24 来源: eefocus关键字:STM8L1xx  定时器  毫秒  微妙延时 手机看文章 扫描二维码
随时随地手机看文章

    采用单片机的定时计数器进行毫秒和微妙级延时,精度较准。检测溢出时产生的标志位来判断延时到达。下面以STM8L101芯片为例及配合代码说明。

   一、实现原理:

    1、初始化Timer2时钟源(附上相应代码)

void TIM2Init (void)

{

  TIM2_DeInit ();

  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);

  

  TIM2->CR1 &= ((uint8_t)(~TIM_CR1_CMS)) & ((uint8_t)(~TIM_CR1_DIR));

  TIM2->CR1 |= ( (TIM2_CounterMode_Up) | (TIM_CR1_ARPE) );               /*counter up, enable Auto-Reload*/

  

  TIM2_SetCounter(0x00);  

   

  TIM2->IER &= (~TIM2_IT_Update);                                        /*disable timer2 interrupt*/

  TIM2->CR1 &= (~TIM_CR1_CEN);                                           /*disable timer2*/

}

   打开外设时钟源;


   选择向上计数模式和打开自动重加载功能;


   填装计数器的初始值; 


   关闭Timer2中断功能;


   关闭Timer2;


   2、毫秒延时代码示例



void DelayMs (uint16_t timeVal)

{

  uint16_t i = 0; 

  TIM2_TimeBaseInit(TIM2_Prescaler_64, TIM2_CounterMode_Up, 124);        /*AutoReload Value = 124,  1ms*/

  

  TIM2->CNTRH = (uint8_t)0;                                              /*counter value = 0*/

  TIM2->CNTRL = (uint8_t)0;

 

  TIM2->CR1 |= (TIM_CR1_CEN);                                            /*enable timner2*/

  

  for(i = 0; i < timeVal; i++)

  {

    TIM2->SR1 &= (~TIM2_FLAG_Update);                                    /*clear timer2 update flag*/  

    while( ((TIM2->SR1) & TIM2_FLAG_Update) != TIM2_FLAG_Update );       /**/ 

  }

    

  TIM2->CR1 &= (~TIM_CR1_CEN);                                           /*disable timer2*/

}

          设置Timer2分频,向上加1计数模式,填装自动重载寄存器目标值。这里每经过8us计数器加1,从0一直到124,共延时1ms,这时Timer2产生溢出标志位。通过检查寄存器TIM2->SR1的位[0]判断。


for(i = 0; i < timeVal; i++)

  {

    TIM2->SR1 &= (~TIM2_FLAG_Update);                                    /*clear timer2 update flag*/  

    while( ((TIM2->SR1) & TIM2_FLAG_Update) != TIM2_FLAG_Update );       /**/ 

  }

   先软件清除TIM2->SR1位[0],再等待判断TIM2->SR1位[0]。这里加上for循环,表示延时多少毫秒。


      关闭Timer2。


  3、微妙延时代码示例



void DelayUs (uint16_t timeVal)

{

  TIM2->PSCR = (uint8_t)(TIM2_Prescaler_8);

  TIM2->CR1 |= (uint8_t)(TIM2_CounterMode_Up);

  TIM2->EGR = TIM2_EventSource_Update;

  

  TIM2->CNTRH = (uint8_t)0;

  TIM2->CNTRL = (uint8_t)0;

  

  TIM2->ARRH = (uint8_t)0xff;

  TIM2->ARRL = (uint8_t)0xff;

  

  TIM2->SR1 &= (~TIM2_FLAG_Update);                                      /*clear timer update flag*/  

  TIM2->CR1 |= (TIM_CR1_CEN);                                            /*enable timner*/

  

  while(1)

  {  

  if( (TIM2->CNTRH ==  (uint8_t)((timeVal - 1) >> 8)) &&

      (TIM2->CNTRL == ((uint8_t)(timeVal - 1) & 0x00ff)) )

  {

      break;

  }

  }  

    

  TIM2->CR1 &= (~TIM_CR1_CEN);                                           /*disable timer*/

}

          设置Timer2分频系数,向上加1计数模式,计数器初始值和自动重装载目标值。这里计数器每经过1us自动做加1计数。

    清除溢出标志位,并打开Timer2;



while(1)

  {  

  if( (TIM2->CNTRH ==  (uint8_t)((timeVal - 1) >> 8)) &&

      (TIM2->CNTRL == ((uint8_t)(timeVal - 1) & 0x00ff)) )

  {

      break;

  }

  }  

   这里不是检测溢出标志位,而是检测计数器当前的计数值。比较是否等于预定设置值。

     关闭Timer2。               


关键字:STM8L1xx  定时器  毫秒  微妙延时 引用地址:STM8L1xx利用定时器实现毫秒和微妙延时

上一篇:STM8的TIM1定时器简单使用
下一篇:STM8L之timer2产生PWM - CSDN博客

推荐阅读最新更新时间:2024-03-16 16:10

51单片机内部定时器使用
/*------------------------------ Function: generate pulse signal Author: Zhang Kaizhou Date: 2019-5-15 22:50:43 ------------------------------*/ #include reg51.h #define uchar unsigned char sbit output = P1^0; uchar period = 250; uchar high = 50; uchar tcount = 0; void timer0() interrupt 1 using 1 { TH0 = (655
[单片机]
51单片机实验——用定时器0实现流水灯,要求每个led轮流显示1s
1.实验题目: 用定时器0实现流水灯,要求每个led轮流显示1s。 2.KEIL代码 #include reg51.h void main() { TMOD &=0X0F; TMOD |=0x01; TH0 = (65536 - 50000)/256;//高四位初值 TL0 = (65536 - 50000)%256;//低四位初值,每隔50ms溢出 EA = 1; //开总中断 ET0 = 1; //T1开时定时器溢出 TR0 = 1; //开启定时器 P1=0xff; while(1); } void Time0(void) interrupt 1 //定时中断 {
[单片机]
51单片机实验——用<font color='red'>定时器</font>0实现流水灯,要求每个led轮流显示1s
STM8L151系列 使用定时器计时,全局滴答器jiffes
IAR软件,使用官方halt库 u32 g_counter = 0; // 全局, jiffes 滴答时钟,时间计时器; INTERRUPT_HANDLER(TIM3_UPD_OVF_TRG_BRK_USART3_TX_IRQHandler,21)// 计数器; 50ms 中断一次 { // disableInterrupts(); g_counter ++; TIM3_ClearITPendingBit(TIM3_IT_Update); // enableInterrupts(); } #define time_after(unknown,known) ((long)(known) - (long)
[单片机]
中断&定时器(二)
1、中断 上图即为中断过程示意图,产生中断的请求源被称为中断源,中断源向CPU提出的处理请求被称为中断请求或中断申请。CPU暂时中止当前的事件,转去处理中断请求所对应的事件称为CPU的中断响应过程,对事件的整个处理过程称为中断服务(中断处理)。处理完毕后,返回到原先被中止的地方称为中断返回。 80C51中断系统结构: 80C51的终端系统有5个中断源(52有6个),两个 优先级 ,可以实现二级中断嵌套。 2、51单片机的定时/计数器 51 单片机 有两个定时/计数器T0和T1,为16位可编程计数器,定时器的实质是加1计数器(16位),由低8位和高8位两个寄存器组成,最大计数值为65535个计数脉冲。 该加
[单片机]
中断&<font color='red'>定时器</font>(二)
AVR 定时器ICP功能
系统功能 使用AVR内部定时器做1S定时,并使用LED作出简单指示! 硬件设计 关于AVR的I/O结构及相关介绍详见Datasheet,这里仅对作部分简单介绍,下面是AVR的I/O引脚配置表: AVR主控电路图 LED控制电路 软件设计 下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解! /*01010101010101010101010101010101010101010101010101010101010101010101 ---------------------------------------------------------------------- 实验内容:
[单片机]
AVR <font color='red'>定时器</font>ICP功能
STM32F103C8T6定时器TIM4通道1、2输出PWM
这美妙的波形,真好,我他喵的终于把你弄出来了。 STM32F103C8T6使用定时器TIM4进行双通道的PWM输出: 下面的图是从STM32中文参考手册中截取的,定时器TIM4的通用和复用功能I/O 我选用的是TIM4_CH1和TIM4_CH2也就是PB6和PB7输出。 注意事项: 输出PWM是属于IO口的复用功能,所以在设置GPIO_Mode的时候一定要设置为GPIO_Mode_AF_PP也就是推挽复用。 我就是被这个卡了好长时间……,感觉自己蠢到家了。 我是用的正点原子的精英板学的32,所以一些写代码的习惯都是学的正点原子的。 下面是代码 timer.c #include timer.h //TIM
[单片机]
STM32F103C8T6<font color='red'>定时器</font>TIM4通道1、2输出PWM
STM32单片机定时器调试之方波输出
今天试着让STM32的定时器输出50%占空比信号,按照例程写了一下方波初始化函数,例程用的是STM32自带库函数,由于嫌麻烦,我又自己写了一个简单的,采用定时器1进行输出。结果一上来,没反应,修改了很多参数,还是没反应,然后将开发板例程写进芯片后,有反应 ,仔细越多数据手册,没有问题,纠结一上午,中午吃饭。吃完饭后,下午又开始试验,还是别人程序有反映,自己程序,没反应。再看了看,开发板程序使用的是TIM3,而我使用的是TIM1,于是又把我的程序将TIM1换成TIM3,点击调试运行,有反应 。不会是高级定时器只能干高级的任务吧,像输出方波这么简单的低级任务他不惜的干?郁闷了半天。后来通过在网上查找,这个程序 以下为源代码,CC1进行比
[单片机]
正点原子战舰V3 31讲 通用定时器
STM32F10X 最多有8个定时器 例如 STM32F103RC 有 4个通用定时器 2个高级定时器 2个基本定时器 三种定时器的区别 F1系列只有16位定时器 16位可编程预分频 将定时器的时钟源进行分频 预分频相当于将频率进行一个除法运算。可以降低时钟的频率。时钟低的话计数时间可以更长。 每一个定时器 都有4个独立的通道 STM32 中文参考手册的第13章 时钟来源分类 1.内部时钟来自APB1 触发控制器将 内部时钟作为定时器的时钟来源 2 外部引脚输入 ETR 引脚 ETR对应的引脚可以 在数据手册上找---引脚功能描述 搜索 ETR就可以找到ETR对应的的相关功能
[单片机]
正点原子战舰V3 31讲 通用<font color='red'>定时器</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved