STM32 使用通用计时器实现微秒延时

发布者:闪耀的星空最新更新时间:2017-02-17 来源: eefocus关键字:STM32  通用计时器  微秒延时 手机看文章 扫描二维码
随时随地手机看文章

为了驱动ARF2496K这款芯片,做STM32上的移植,所以第一步需要解决的就是时序问题,很显然在STM32下类似于51的延时方法并不适用,自然想到了采用定时器进行定时来延时。目前使用的是查询方式进行延时。


环境: STM32F107主控,采用STLINK仿真

代码如下:


  1. static void TIM5_Init_Query(CALC_TYPE type,uint32_t val)  

  2. {  

  3.     TIM_TimeBaseInitTypeDef Tim5;  

  4.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  

  5.     Tim5.TIM_Period=1; //???  

  6.     if(type==CALC_TYPE_S) //延时以S为单位时,时钟频率57600Hz,外部需要1250次计时  

  7.     {  

  8.         Tim5.TIM_Prescaler=57600-1; //预分频 72MHz / 57600= 1250Hz  

  9.     }else if(type==CALC_TYPE_MS)  

  10.     {  

  11.         Tim5.TIM_Prescaler=2880-1; //25000Hz ,定时器计数25次为ms  

  12.     }else if(type==CALC_TYPE_US)  

  13.     {     

  14.         Tim5.TIM_Prescaler=72-1; //1MHz ,计数1次为us  

  15.     }else  

  16.     {  

  17.         Tim5.TIM_Prescaler=7200-1;  

  18.     }  

  19.     Tim5.TIM_ClockDivision=0;  

  20.     Tim5.TIM_CounterMode=TIM_CounterMode_Down; //向下计数  

  21.     TIM_TimeBaseInit(TIM5,&Tim5);         

  22. }  

  23.   

  24. static void TIM5_S_CALC(uint32_t s)  

  25. {  

  26.     u16 counter=(s*1250)&0xFFFF; //前提定时器时钟为1250Hz  

  27.     TIM_Cmd(TIM5,ENABLE);  

  28.     TIM_SetCounter(TIM5,counter); //设置计数值  

  29.       

  30.     while(counter>1)  

  31.     {  

  32.         counter=TIM_GetCounter(TIM5);  

  33.     }  

  34.     TIM_Cmd(TIM5,DISABLE);  

  35. }  

  36.   

  37. static void TIM5_MS_CALC(uint32_t ms)  

  38. {  

  39.     u16 counter=(ms*25)&0xFFFF;   

  40.     TIM_Cmd(TIM5,ENABLE);  

  41.     TIM_SetCounter(TIM5,counter); //设置计数值  

  42.       

  43.     while(counter>1)  

  44.     {  

  45.         counter=TIM_GetCounter(TIM5);  

  46.     }  

  47.     TIM_Cmd(TIM5,DISABLE);  

  48. }  

  49.   

  50. static void TIM5_US_CALC(uint32_t us)  

  51. {  

  52.     u16 counter=us&0xffff;  

  53.     TIM_Cmd(TIM5,ENABLE);  

  54.     TIM_SetCounter(TIM5,counter); //设置计数值  

  55.   

  56.     while(counter>1)  

  57.     {  

  58.         counter=TIM_GetCounter(TIM5);  

  59.     }  

  60.     TIM_Cmd(TIM5,DISABLE);  

  61. }  

  62.   

  63. int main()  

  64. {  

  65.     SystemInit(); //库函数 初始化系统时钟源选择,PLL等    

  66.   

  67. #ifdef _DEBUG  

  68.     Init_PD11();  

  69. #endif  

  70.     TIM5_Init_Query(CALC_TYPE_US);  

  71.   

  72.     while(1)  

  73.     {  

  74.         PD11_U; //产生方波  

  75.         TIM5_US_CALC(1);   //TIM5_MS_CALC(1); 毫秒延时, TIM5_S_CALC(1); 秒级别延时   

  76.         PD11_D;  

  77.         TIM5_US_CALC(1);  

  78.     }  

  79. }  


实验数据: 


延时1微秒时,略有出入,下图:

(延时1us,并不精准,这与while循环中的语句有关)

延时20微秒时,比较准确,下图:


延时1毫秒时,下图:

(差了0.2ms,也就是才延时0.9ms,可以将分频系数降低,然后延时值加大些进行改善)

延时20毫秒时,下图:


延时1秒时,下图:



毫秒延时那里修改成下面代码,基本上能精准。


  1. Tim5.TIM_Prescaler=720-1; //100KHz ,定时器计数100次为1ms  

  2. static void TIM5_MS_CALC(uint32_t ms)  

  3. {  

  4.     u16 counter=(ms*100)&0xFFFF; //前提定时器时钟为100KHz  

  5.     TIM_Cmd(TIM5,ENABLE);  

  6.     TIM_SetCounter(TIM5,counter); //设置计数值  

  7.       

  8.     while(counter>1)  

  9.     {  

  10.         counter=TIM_GetCounter(TIM5);  

  11.     }  

  12.     TIM_Cmd(TIM5,DISABLE);  

  13. }  



关键字:STM32  通用计时器  微秒延时 引用地址:STM32 使用通用计时器实现微秒延时

上一篇:纠结的STM32 RTC时钟源LSE
下一篇:神舟IV学习笔记(五)实时时钟RTC

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

stm32 芯片与Cat的对应分类
最近在使用stm32l151cbu6开发一个项目,在查询datasheet关于DMA使用的时候,发现不同的cat分类,对应的功能还有些区别, 例如上面这个就是针对Cat.1和Cat.2。 这上面这个对应的就是Cat.3。 那么问题来了,怎么知道我的stm32l151cbu6是属于Cat.x呢,再慢慢翻datasheet,发现还真有。在P40页, 可以看到Cat分类是与flash大小直接相关的,这里面有个坑,表格里面的符号是“x”与“-”,‘x’反而表示flash大小与芯片型号的对应。往下看,我们还能看到更细致的芯片分类, 我项目的stm32l151cbu6属于STM32L 15XXB分类,对应的就是Cat.1分
[单片机]
<font color='red'>stm32</font> 芯片与Cat的对应分类
CLion配置STM32开发环境
一、前言   上一篇文章介绍了VSCode配置STM32的开发环境,本文将介绍使用CLion配置STM32的开发环境,很多喜欢稚晖君的小伙伴,都知道稚晖君使用的是CLion开发STM32,并且稚晖君的知乎上也有介绍CLion配置STM32的开发环境的文章。我针对我的使用情况,对我遇到的一些问题做一下总结,并且展示解决的办法。本次介绍的也是HAL库开发。B话不多说,开干~ 二、软件及环境准备 1、CLion2021.3.3   官网下载地址: CLion: A Cross-Platform IDE for C and C++ by JetBrains ,CLion是收费软件,解决办法如下:   a、购买CLion正版授权,199美刀
[单片机]
STM32上电复位不正常 手动复位正常的原因
描述: STM32f0按键模块电路经常遇到上电不复位的情况,芯片采用的是stm32f030,按键模块采用ZLG7290芯片、4X4按键LED矩阵。ZLG7290是周立功公司专门开发的按键芯片,其最大可支持64个按键和64个LED,可通过I2C协议对其读写,ZLG7290与stm32f030复位电路采用datasheet参考电路,如下: 正常情况下,电路上电后会有一个LED全部点亮的过程,上电稳定延时后,LED自动全部熄灭,正常运行时,按下相应按键其对应的LED灯应被点亮。 问题: STM32复位电路内部有自带的上拉电阻,同时PVD的电源检测阈值采用的是默认值2.2V,采用电池供电,电压表测量引脚电压在2.8V左右,但是电路
[单片机]
<font color='red'>STM32</font>上电复位不正常 手动复位正常的原因
STM32实现低功耗待机总结(电流低至5.7uA)
刚开始进入STOPMode后,整机功耗有 300uA的,此时外围其他硬件电路电流已经可以肯定漏电流在nA级,因此调试方向在主芯片,经过实际测试,都是GPIO配置的问题,比如某个GPIO为中断输入,闲置为低电平,而我们配置成了IPU,因此内部的40K上拉就会在这里消耗3/40k =75uA,另外将N.C的GPIO配置成Floating Input,也会有一些漏电流,实际测试漏电流不大;另外将STM32F05x直接PIINtoPIN替代STM32100,所以Pin35,36的 PF6,PF7为之前的VCC,GND,因此要相应的配置为IPU,IPD,才不会有拉电流/灌电流;外部不使用晶振,因此必须将其配置为IPU/IPD 或者输出Low,
[单片机]
STM32高级开发(1)-开源是什么
开源的历史及简介 在上个世纪计算机发展的早期阶段,软件几乎都是开放的,任何人使用软件的同时都可以查看软件的源代码,或者根据自己的需要去修改它。在程序员的社团中大家互相分享软件,共同提高知识水平。这种自由的风气给大家带来了欢乐,也带来了进步。 但不久之后,以微软为主的一些商业公司就破坏了这种风气。这些商业公司从自由的计算机社团里雇佣了大量的技术高手,开发带有知识产权保护的专有软件。他们在分发软件的时候也不再附带源代码。从此,专有软件的时代到来了。直到现在,专有软件不公开源代码仍是默认的行业潜规则。 即使这样,崇尚自由的斗士们也没有妥协。他们认为,数字时代本应是自由的,任何人都可以自由的获取软件资源及其源代码,而不应该被少数
[单片机]
<font color='red'>STM32</font>高级开发(1)-开源是什么
STM32定时器通道独立启停控制
在main()中 ch1_open(); delay_ms(1000); ch2_open(); delay_ms(1000); ch3_open(); delay_ms(1000); ch4_open(); delay_ms(1000); 在timer.c中添加了 //开启通道一,同时关闭通道二三四 void ch1_open(void) { TIM3- CCER|=(1 1); TIM3- CCER&=~(1 4); TIM3- CCER&=~(1 8); TIM3- CCER&=~(1 12); } //开启通道二,同时关闭通道一三四 void ch2
[单片机]
电机位置闭环控制(STM32代码详细注释)
这是一个电机位置闭环控制(代码详细注释),很适合做伺服电机控制入门的同志们学习借鉴 单片机源程序如下: #include sys.h u8 Flag_Stop=1; //停止标志位 int Encoder,Position=10000; //编码器的脉冲计数 long SHOW; int Moto1; //电机PWM变量 应是Motor的 向Moto致敬 int main(void) { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 LED_Init();
[单片机]
STM32速成笔记(10)—IWDG
一、IWDG简介 独立看门狗 (Independent Watchdog, IWDG ),什么是看门狗?字面意思——看门的,有陌生人来,就会叫。实际在嵌入式领域里,看门狗也是这种作用,当软件程序发生故障或者程序跑飞时,看门狗会产生复位信号,复位系统。 二、STM32的IWDG 2.1 STM32的IWDG简介 STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗
[单片机]
<font color='red'>STM32</font>速成笔记(10)—IWDG
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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