HAL只提供了ms級的延時,但有些特殊場景,比如與通信速率較慢的設備通信時,會需要用到us級延時。STM32標準庫一般是使用系統(tǒng)嘀嗒定時器來進行微妙級別的延時,而HAL庫將SysTick定時器用做了庫函數(shù)的超時定時器,使用的地方非常多,自己修改代碼使用嘀嗒定時器的話就會引起錯亂,所以此時就需要自己實現(xiàn)一個us級別延時函數(shù)。
這里介紹一種使用定時器設計us級延時函數(shù)的方法。
思路:我們將定時器設置為1MHZ的計數(shù)頻率,這樣定時器計一個數(shù)就是1us,我們就可以通過定時器計數(shù)值得知計時時間。
以使用TIM1為例,這里我們采用STM32F103內部8MHz晶振,故需要設置預分頻系數(shù)PSC為8-1=7。同時配置PA1為GPIO輸出模式,之后用于測試延時函數(shù)的效果。

Untitled
編寫微秒延時函數(shù):
/* 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 */
編寫微秒延時函數(shù)測試程序,使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高電平持續(xù)時間和低電平持續(xù)時間都和符合100us的預設,延時效果較好。
關鍵字:STM32 HAL庫 微秒延時
引用地址:
STM32基于HAL庫實現(xiàn)微秒延時
推薦閱讀最新更新時間:2025-06-16 04:31
STM32 HAL庫DMA串口使用問題集錦
開發(fā)小白用stm32開發(fā)時遇到的問題記錄 1.問題描述:使用HAL_UART_Receive_DMA進行接收時,經(jīng)常接收不到信息 處理過程: 經(jīng)查閱資料發(fā)現(xiàn)對于DMA串口,每個串口都有其對應的通道,查詢后更改串口通道。 由于使用NUCLEO開發(fā)板進行調試,調試過程中發(fā)現(xiàn)使用的串口未被引到對應的排針上,而是接到板上自帶的STLINK的串口上。 串口極其不穩(wěn)定,有時能收到有時不能收到,但是另外一發(fā)送模塊確實是發(fā)出來了,經(jīng)打中斷發(fā)現(xiàn)經(jīng)常會出現(xiàn)溢出錯誤,調試了半天都不行,極其苦惱,后靈光一閃,在使用HAL_UART_Receive_DMA函數(shù)接收之前利用HAL_UART_Init函數(shù)再次對串口進行初始化,之后發(fā)現(xiàn)可以接
[單片機]
HAL庫教程8:通用定時器的使用
定時器溢出時間的計算 ??關于定時器溢出的時間計算,有個公式: ??定時器本質上是一個不斷自加的計數(shù)器,只不過在自加的時候,能夠自動比較計數(shù)值跟某個設定值而已。定時器+1用時多少? ??1/84000000,單位是秒。 ??我想讓數(shù)的慢一點,感覺84Mhz的時鐘太快了,想用42Mhz可以嗎?可以,2分頻就行,這是+1的操作用時:2/84000000, ??數(shù)100個數(shù)字用時多少?100 * 2/84000000。 ??可能是為了避免用戶誤操作,給arr或psc寫一個0,所以arr與psc都需要做+1操作。 ??為了方便計算,在psc為8399的情況下,溢出時間就是(arr+1)/10,單位是毫秒。 ??能不能把psc設置為83
[單片機]
stm32F4XX之窗口看門狗 HAL庫
首先講一下獨立看門狗和窗口看門狗之間的區(qū)別。 獨立看門狗Iwdg——獨立于系統(tǒng)之外,因為有獨立時鐘,一般是外部低速時鐘。主要用于監(jiān)視硬件錯誤。 窗口看門狗wwdg——系統(tǒng)內部的故障探測器,采用內部RCC時鐘,時鐘與系統(tǒng)相同。如果系統(tǒng)時鐘不走了,這個狗也就失去作用了。主要用于監(jiān)視軟件錯誤 1)獨立看門狗沒有中斷,窗口看門狗有中斷 2)獨立看門狗有硬件軟件之分,窗口看門狗只能軟件控制 3)獨立看門狗只有下限,窗口看門狗又下限和上限 4)獨立看門狗是12位遞減的。窗口看門狗是7位遞減的 5)獨立看門狗是用的內部的大約40KHZ RC振蕩器(不受系統(tǒng)時鐘限制,即使系統(tǒng)時鐘壞了也能工作),窗口看門狗是用的系統(tǒng)時鐘
[單片機]
stm32l476 內部flash HAL庫操作方法
stm32l476 FLASH特征 ? Up to 1 Mbyte of Flash memory with dual bank architecture supporting read-while-write capability (RWW). ? Memory organization: 2 banks (Bank 1 and Bank 2) – main memory: 512 Kbyte per bank – information block: 32 Kbyte per bank ? 72-bit wide data read (64 bits plus 8 ECC bits) ? 72-bit wide
[單片機]
STM32一文通(3) GPIO
預置知識: 開時鐘 STM32 每一個片上外設資源都有自己的時鐘,這些時鐘被一個叫做RCC的外設統(tǒng)一管理, 所以,每一個片上外設想要應用第一件事就是: 開時鐘!!!!! 根據(jù)系統(tǒng)結構圖,GPIO都在APB2總線上 所以,我們要用void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)函數(shù)操作開啟GPIO的時鐘: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能或者失能APB2外設時鐘 一. GPIO基礎知識、寄存器及庫函數(shù) 二. (重要)GPIO
[單片機]
STM32中斷使用筆記
1.GPIO 的正確設置 GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPI
[單片機]
關于STM32 ADC時采用DMA的一點疑問
手冊上有這樣的話:只有ADC1能夠產(chǎn)生DMA請求,似乎是只有ADC通道1能采用DMA方式傳輸數(shù)據(jù)。 但是萬利的開發(fā)板上的ADC例子,用的是ADC通道10,還用了DMA 方式傳數(shù)據(jù)。 所以我猜測 “只有ADC1能夠產(chǎn)生DMA請求”中提到的ADC1 并不是指ADC 通道1, 而是軟件可配置的 ADC 通道的分類形式,可分為ADC1和ADC2. 我們可將 通道10(或其他)配置成ADC1 “模式”。通過函數(shù) /* ADC1 regular channel10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_5
[單片機]
STM32之八定時器中斷
STM32的通用定時器是一個通過可編程預分頻器(PSC)驅動的16 位自動裝載計數(shù)器(CNT)構成。STM32的通用定時器可以被用于:測量輸入信號的脈沖長度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM)等。 使用定時器預分頻器和RCC時鐘控制器預分頻器,脈沖長度和波形周期可以在幾個微秒到幾個毫秒間調整。STM32的每個通用定時器都是完全獨立的,沒有互相共享的任何資源。 STM3的通用TIMx (TIM2、TIM3、TIM4和TIM5)定時器功能包括: 1)16位向上、向下、向上/向下自動裝載計數(shù)器(TIMx_CNT)。 2)16 位可編程(可以實時修改)預分頻器(TIMx_PSC),計數(shù)器時鐘頻率的分頻系數(shù)為1~65535之間
[單片機]