HAL只提供了ms级的延时,但有些特殊场景,比如与通信速率较慢的设备通信时,会需要用到us级延时。STM32标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库将SysTick定时器用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱,所以此时就需要自己实现一个us级别延时函数。
这里介绍一种使用定时器设计us级延时函数的方法。
思路:我们将定时器设置为1MHZ的计数频率,这样定时器计一个数就是1us,我们就可以通过定时器计数值得知计时时间。
以使用TIM1为例,这里我们采用STM32F103内部8MHz晶振,故需要设置预分频系数PSC为8-1=7。同时配置PA1为GPIO输出模式,之后用于测试延时函数的效果。
Untitled
编写微秒延时函数:
/* USER CODE BEGIN PD */
#define DLY_TIM_Handle (&htim1) // Timer handle
/* USER CODE END PD */
/* USER CODE BEGIN PFP */
void delay_us(uint16_t nus);
/* USER CODE END PFP */
/* USER CODE BEGIN 4 */
void delay_us(uint16_t nus)
{
__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0); // set the counter value a 0
__HAL_TIM_ENABLE(DLY_TIM_Handle); // start the counter
// wait for the counter to reach the us input in the parameter
while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus);
__HAL_TIM_DISABLE(DLY_TIM_Handle); // stop the counter
}
/* USER CODE END 4 */
编写微秒延时函数测试程序,使PA1高低电平间隔100us转换一次:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
delay_us(100);
}
/* USER CODE END 3 */
烧录程序,通过逻辑分析仪观察PA1电平变化:
可以看到PA1高电平持续时间和低电平持续时间都和符合100us的预设,延时效果较好。
上一篇:ROS与STM32串口通信代码
下一篇:stm32怎么读取io口输入电平
推荐阅读最新更新时间:2024-11-18 18:28
设计资源 培训 开发板 精华推荐
- DC2440A,基于 LTC3374AEUHF 高精度 8 通道可并联 1A 降压 DC/DC 的演示板
- AS5600 Sensor
- LT6656ACDC-3.3、3.3V 2 端子电压基准电流源的典型应用
- 适用于工业应用的 C8051F505 MCU 的 C8051F500DK、8051 开发系统
- AM6TW-4805SZ 5V 6 瓦双路输出 DC/DC 转换器的典型应用
- 使用 Semtech 的 SC440A 的参考设计
- QN9080DK: 高度可扩展的QN908x应用开发平台
- SY89547L EV,SY89547L 评估板,2.5V,3.2Gbps 差分 2:1 LVDS 多路复用器,带 1:2 扇出内部终端
- LT3790 的典型应用 - 60V 同步 4 开关降压-升压控制器
- 16x16双色点阵
- 了解ADI电网管理、能源计量方案,答题赢Kindle、《新概念模拟电路》【世健的ADI之路主题游 能源站】
- 暑期加油站:零起点带你学遍单片机
- 【实时抽奖】MPS AI电源解决方案合集,咨询抽【按摩眼罩、体脂秤、电脑支架】等好礼
- 有奖直播 | 同质化严重,缺乏创新,ST60毫米波非接触连接器,赋予你独特的产品设计,重拾市场话语权
- 悭钱十月,分享你的省钱购物经!
- 了解PI InnoSwitch-CE,答题赢好礼
- 【EEWORLD第三十一届】2011年10月社区明星人物揭晓!
- TI有奖直播|C2000™ F280013x实现更低成本且更高效的实时控制方案
- 开启Altera SoC体验之旅,玩转Altera Cyclone V系列SoC