STM32CubeMX之定时器控制微秒延时详解
2017-07-31 20:24
323 查看
写在前面的话,为什么另需定时器进行微秒级延时。
1.在HAL固件库中只有使用Systick作为延时计数器,毫秒级延时HAL_Delay()。为了增加精确的微秒级延时,一般都是更改Systick配置参数,但HAL固件库许多地方都使用了HAL_Delay()函数,因此建议大家不要修改系统自动配置的Systick参数;
2.个人觉得到加入操作系统时要占用Systick,而MCU系统自身的时基还要选择其他的定时器,综上所述,对Systick做的更改基本白搭;
因此采用定时器控制微妙延时的方法,是比较灵活的。需要用户增加的代码很少,经济实用,节能环保- -;
步骤1.配置时钟
注意,一定要确定红色部分标记的晶振频率要与实际的晶振保持一致。
步骤2.配置定时器
在配置定时器时,需要明确以下几点:
1. 定时器时钟频率;
2. 定时器溢出频率;
首先,我们看一下比较重要的寄存器,如下所示:
用红线标记的地方可得:
定时器工作频率=**经过内部时钟分频的**APBx Timer Clock/PSC寄存器的值+1;
举个栗子,如下:
即定时器的时钟频率为84MHz,不用用内部时钟分频,要使定时器的工作频率为1MHz(1us),如下:
1MHz=84MHz/(83+1);
定时器的溢出频率=定时器的工作频率/arr
关于arr重载值何时载入,即发生溢出更新事件后,才会载入新值;
相关配置如下:
系统时钟配置,见上图;
这里我使用了TIM14通用定时器来进行1us延时,配置如下:
步骤3.编写代码
因为采用的是向上计数方式,因此需要转换一下,向下计数方式不用;
测试代码如下:
实际波形如下:
1.在HAL固件库中只有使用Systick作为延时计数器,毫秒级延时HAL_Delay()。为了增加精确的微秒级延时,一般都是更改Systick配置参数,但HAL固件库许多地方都使用了HAL_Delay()函数,因此建议大家不要修改系统自动配置的Systick参数;
2.个人觉得到加入操作系统时要占用Systick,而MCU系统自身的时基还要选择其他的定时器,综上所述,对Systick做的更改基本白搭;
因此采用定时器控制微妙延时的方法,是比较灵活的。需要用户增加的代码很少,经济实用,节能环保- -;
步骤1.配置时钟
注意,一定要确定红色部分标记的晶振频率要与实际的晶振保持一致。
步骤2.配置定时器
在配置定时器时,需要明确以下几点:
1. 定时器时钟频率;
2. 定时器溢出频率;
首先,我们看一下比较重要的寄存器,如下所示:
用红线标记的地方可得:
定时器工作频率=**经过内部时钟分频的**APBx Timer Clock/PSC寄存器的值+1;
举个栗子,如下:
即定时器的时钟频率为84MHz,不用用内部时钟分频,要使定时器的工作频率为1MHz(1us),如下:
1MHz=84MHz/(83+1);
定时器的溢出频率=定时器的工作频率/arr
关于arr重载值何时载入,即发生溢出更新事件后,才会载入新值;
相关配置如下:
系统时钟配置,见上图;
这里我使用了TIM14通用定时器来进行1us延时,配置如下:
步骤3.编写代码
void delay_us(uint16_t us) { uint16_t differ=0xffff-us-5; /*为防止因中断打断延时,造成计数错误. 如从0xfffE开始延时1us,但由于中断打断 (此时计数器仍在计数),本因计数至0xffff) 便停止计数,但由于错过计数值,并重载arr值, 导致实际延时(0xffff+1)us */ HAL_TIM_Base_Start(&htim14); __HAL_TIM_SetCounter(&htim14,differ); while(differ<0xffff-5) { differ=__HAL_TIM_GetCounter(&htim14); } HAL_TIM_Base_Stop(&htim14); }
因为采用的是向上计数方式,因此需要转换一下,向下计数方式不用;
测试代码如下:
/* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin); delay_us(5); } /* USER CODE END 3 */
实际波形如下:
相关文章推荐
- 使用Stm32Cubemx配置定时器正交编码模式详解(附上程序思想介绍)
- 详解VUE的状态控制与延时加载刷新
- STM32Cubemx下实现通用定时器微秒级延时
- JAVA实现定时器功能详解
- 详解cisco访问控制列表ACL
- JSP学习之Java Web中的安全控制实例详解
- Android中几种常用的定时器和延时方法
- kernel 定时器延时跨平台问题
- STM32定时器---正交编码器模式详解
- 优雅的JavaScript-定时器详解
- 详解javascript高级定时器
- Tomcat中用web.xml控制Web应用详解(1)
- U-Mail邮件服务器详解邮件延时
- jQuery队列控制方法详解queue()/dequeue()/clearQueue()
- 用定时器控制Led灯闪烁
- QOS流量控制管理详解!
- SAP系统中信用控制功能详解
- 工作流模式详解之流程控制模式(9)——Structured Discriminator
- tcp报文,定时器详解(转)
- <MFC实践>定时器详解及其简单实例二则