STM32基于HAL庫(kù)實(shí)現(xiàn)微秒延時(shí)
HAL只提供了ms級(jí)的延時(shí),但有些特殊場(chǎng)景,比如與通信速率較慢的設(shè)備通信時(shí),會(huì)需要用到us級(jí)延時(shí)。STM32標(biāo)準(zhǔn)庫(kù)一般是使用系統(tǒng)嘀嗒定時(shí)器來(lái)進(jìn)行微妙級(jí)別的延時(shí),而HAL庫(kù)將SysTick定時(shí)器用做了庫(kù)函數(shù)的超時(shí)定時(shí)器,使用的地方非常多,自己修改代碼使用嘀嗒定時(shí)器的話就會(huì)引起錯(cuò)亂,所以此時(shí)就需要自己實(shí)現(xiàn)一個(gè)us級(jí)別延時(shí)函數(shù)。
這里介紹一種使用定時(shí)器設(shè)計(jì)us級(jí)延時(shí)函數(shù)的方法。
思路:我們將定時(shí)器設(shè)置為1MHZ的計(jì)數(shù)頻率,這樣定時(shí)器計(jì)一個(gè)數(shù)就是1us,我們就可以通過(guò)定時(shí)器計(jì)數(shù)值得知計(jì)時(shí)時(shí)間。
以使用TIM1為例,這里我們采用STM32F103內(nèi)部8MHz晶振,故需要設(shè)置預(yù)分頻系數(shù)PSC為8-1=7。同時(shí)配置PA1為GPIO輸出模式,之后用于測(cè)試延時(shí)函數(shù)的效果。
Untitled
編寫微秒延時(shí)函數(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í)函數(shù)測(cè)試程序,使PA1高低電平間隔100us轉(zhuǎn)換一次:
/* 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 */
燒錄程序,通過(guò)邏輯分析儀觀察PA1電平變化:
可以看到PA1高電平持續(xù)時(shí)間和低電平持續(xù)時(shí)間都和符合100us的預(yù)設(shè),延時(shí)效果較好。
-
STM32
+關(guān)注
關(guān)注
2273文章
10926瀏覽量
357767 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115443 -
GPIO
+關(guān)注
關(guān)注
16文章
1217瀏覽量
52434 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13160 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
121瀏覽量
6385
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
如何利用SysTick實(shí)現(xiàn)微秒延時(shí)函數(shù)?
怎么實(shí)現(xiàn)STM32CubeIDE HAL庫(kù)微秒us的延時(shí)Delay?
HAL庫(kù)如何實(shí)現(xiàn)us延時(shí)?
HAL庫(kù)微秒級(jí)的延時(shí)實(shí)現(xiàn)
STM32標(biāo)準(zhǔn)庫(kù)改為HAL庫(kù)的程序實(shí)現(xiàn)
STM32單片機(jī)使用定時(shí)器中斷方式實(shí)現(xiàn)毫秒級(jí)延時(shí)的設(shè)計(jì)
![<b class='flag-5'>STM32</b>單片機(jī)使用定時(shí)器中斷方式<b class='flag-5'>實(shí)現(xiàn)</b>毫秒級(jí)<b class='flag-5'>延時(shí)</b>的設(shè)計(jì)](https://file.elecfans.com/web1/M00/95/4F/pIYBAFz2F-qAetlzAAB-55EyDOc695.jpg)
通用定時(shí)器實(shí)現(xiàn)STM32單片機(jī)微秒級(jí)延時(shí)函數(shù)
![通用定時(shí)器<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>STM32</b>單片機(jī)<b class='flag-5'>微秒</b>級(jí)<b class='flag-5'>延時(shí)</b>函數(shù)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeMX 配置STM32F407 實(shí)現(xiàn)HAL庫(kù)延時(shí)微妙方案
![<b class='flag-5'>STM32</b>CubeMX 配置<b class='flag-5'>STM32</b>F407 <b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b><b class='flag-5'>延時(shí)</b>微妙方案](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32之HAL庫(kù)實(shí)現(xiàn)us延時(shí)方法
![<b class='flag-5'>stm32</b>之<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b><b class='flag-5'>實(shí)現(xiàn)</b>us<b class='flag-5'>延時(shí)</b>方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32 HAL 庫(kù)延時(shí)函數(shù) HAL_Delay 解析
![<b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b> <b class='flag-5'>庫(kù)</b><b class='flag-5'>延時(shí)</b>函數(shù) <b class='flag-5'>HAL</b>_Delay 解析](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論