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口輸入電平
推薦閱讀最新更新時間:2025-05-20 16:41






設計資源 培訓 開發板 精華推薦
- 使用 Diodes Incorporated 的 PT8A 3518CPE 的參考設計
- P1020RDB: QorIQ? P1020和P1011參考設計板
- LTC2602CMS8 演示板,雙 16 位軌至軌 Vout DAC
- 基于ISD4002-120錄音回放的ISD-ES302、ES302演示板
- 使用 Diodes Incorporated 的 ZSAT600 的參考設計
- 聲控LED燈
- 1117 電壓調節器的簡易板
- DER-857 - 基于具有PowiGaN技術的LYTSwitch-6的65 W高功率因數、隔離反激式和開關填谷PFC LED驅動器
- 隨機數發生器
- CAT4252EVAL、AN??D9010/D CAT4252 LED 驅動器評估板