STM32的延時函數可以使用SysTick定時器來實現。SysTick定時器是一個24位的計數器,它可以在每個時鐘周期自動減少計數值,直到計數值為0時觸發中斷。我們可以利用SysTick定時器的特性來實現精確的延時函數。
以下是一個實現延時函數的示例代碼:
#include "stm32xxxx.h"
void SysTick_Handler(void)
{
// 在這里可以寫一些需要周期執行的操作,但是要盡量保持簡潔
}
void delay_us(uint32_t us)
{
uint32_t ticks = us * (SystemCoreClock / 1000000); // 將微秒轉換為滴答數
SysTick- >LOAD = ticks - 1; // 設置定時器加載值
SysTick- >VAL = 0; // 清空當前計數值
SysTick- >CTRL |= SysTick_CTRL_ENABLE_Msk; // 啟動定時器
while (!(SysTick- >CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待定時器倒計數完畢
SysTick- >CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 關閉定時器
}
void delay_ms(uint32_t ms)
{
while (ms--)
{
delay_us(1000); // 延時1毫秒
}
}
int main()
{
// 你的程序邏輯
// ...
while (1)
{
// 你的程序邏輯
// ...
}
return 0;
}
在這個例子中,我們通過SysTick定時器的中斷來實現延時函數。首先,我們定義了兩個延時函數delay_us
和delay_ms
,它們分別用來延時指定的微秒數和毫秒數。
在delay_us函數中,我們首先計算需要延時的滴答數,然后設置SysTick的LOAD寄存器為滴答數減1,清空當前計數值,并啟動定時器。接著,我們使用一個循環等待直到定時器倒計數完畢,即SysTick_CTRL_COUNTFLAG位被置位。最后,我們關閉定時器并結束函數。
在delay_ms函數中,我們調用delay_us函數來實現毫秒級的延時。我們通過循環遞減ms的方式來實現毫秒級的延時,每次循環調用一次delay_us函數延時1毫秒。
在main函數中,我們可以在你的程序邏輯中調用延時函數來實現需要的延時效果。你可以在while循環中重復調用延時函數來實現周期性的延時效果。
需要注意的是,由于SysTick定時器是由SysTick_Handler中斷驅動的,所以你不能在SysTick_Handler中寫太多的代碼,以免影響延時的準確性。建議在SysTick_Handler中只加入必要的代碼,并保持簡潔。
以上是一個簡單的基于SysTick定時器的延時函數的實現。你可以根據自己的需求進行修改和改進,比如添加更多的延時函數、增加更高的精度等。
-
STM32
+關注
關注
2272文章
10924瀏覽量
357583 -
計數器
+關注
關注
32文章
2261瀏覽量
94984 -
定時器
+關注
關注
23文章
3255瀏覽量
115374 -
函數
+關注
關注
3文章
4346瀏覽量
62973
發布評論請先 登錄
相關推薦
匯總stm32 delay文件
怎樣去解決STM32F103ZET6庫函數程序移植的Delay函數異常問題
LED閃爍開發之while循環函數和delay延時函數的資料概述
![LED閃爍開發之while循環<b class='flag-5'>函數</b>和<b class='flag-5'>delay</b>延時<b class='flag-5'>函數</b>的資料概述](https://file.elecfans.com/web1/M00/6C/8F/pIYBAFvpJwmAZ21EAAEV88UEX3I049.png)
【STM32單片機-庫函數】SysTick延時—delay
![【<b class='flag-5'>STM32</b>單片機-庫<b class='flag-5'>函數</b>】SysTick延時—<b class='flag-5'>delay</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
msp430內置函數總結 __bic_SR_register(),__delay_cycles(x)
![msp430內置<b class='flag-5'>函數</b>總結 __bic_SR_register(),__<b class='flag-5'>delay</b>_cycles(x)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32 delay文件總結
![<b class='flag-5'>stm32</b> <b class='flag-5'>delay</b>文件總結](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
C語言 | 延時函數(Delay)
![C語言 | 延時<b class='flag-5'>函數</b>(<b class='flag-5'>Delay</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Systick定時器延時原理與HAL_Delay()延時函數的使用
在HAL庫中用定時器實現自定義延時函數delay_us()
STM32蜂鳴器音樂播放實例教程
![<b class='flag-5'>STM32</b>蜂鳴器音樂播放實例教程](https://file1.elecfans.com/web2/M00/C5/CA/wKgZomYCaVSAHG5SAAA5WnhfFpw591.png)
評論