引言
目前開發(fā)STM32普遍使用HAL庫,但 HAL 庫封裝的延時(shí)函數(shù)目前僅支持 ms 級(jí)別的延時(shí),日常很多情況下會(huì)用到 us 延時(shí),特別是一些傳感器的數(shù)據(jù)讀取過程,對(duì)時(shí)序要求比較嚴(yán)格,us 延時(shí)必不可少,因此我們今天來介紹STM32如何使用定時(shí)器實(shí)現(xiàn)微秒(us)級(jí)延時(shí)。
前期準(zhǔn)備
- Keil 5
- STM32CubeMX
- STM32F407MCU
介紹
系統(tǒng)時(shí)鐘
可通過多個(gè)預(yù)分頻器配置 AHB 頻率、高速 APB (APB2) 和低速 APB (APB1)。AHB 域的最 大頻率為 168 MHz。高速 APB2 域的最大允許頻率為 84 MHz。低速 APB1 域的最大允許頻 率為 42 MHz。
定時(shí)器時(shí)鐘
STM32的定時(shí)器大致分為三種:基本定時(shí)器、通用定時(shí)器和高級(jí)定時(shí)器。各個(gè)定時(shí)器和其時(shí)鐘源的對(duì)應(yīng)關(guān)系為:
其中,TIM1和TIM8是高級(jí)定時(shí)器;TIM2-TIM5、TIM9-TIM14是通用定時(shí)器;TIM6和TIM7為基本定時(shí)器。
- 高級(jí)控制定時(shí)器(TIM1 和 TIM8)包含一個(gè) 16 位自動(dòng)重載計(jì)數(shù)器,該計(jì)數(shù)器由可編程預(yù)分頻器驅(qū)動(dòng)。此類定時(shí)器可用于各種用途,包括測(cè)量輸入信號(hào)的脈沖寬度(輸入捕獲),或者生成輸出波形(輸出比較、PWM 和帶死區(qū)插入的互補(bǔ) PWM)。使用定時(shí)器預(yù)分頻器和 RCC 時(shí)鐘控制器預(yù)分頻器,可將脈沖寬度和波形周期從幾微秒調(diào)制 到幾毫秒。
- 通用定時(shí)器包含一個(gè) 16 位或 32 位自動(dòng)重載計(jì)數(shù)器,該計(jì)數(shù)器由可編程預(yù)分頻器驅(qū)動(dòng)。它們可用于多種用途,包括測(cè)量輸入信號(hào)的脈沖寬度(輸入捕獲)或生成輸出波形(輸出比較和 PWM)。使用定時(shí)器預(yù)分頻器和 RCC 時(shí)鐘控制器預(yù)分頻器,可將脈沖寬度和波形周期從幾微秒調(diào)制 到幾毫秒。
- TIM9 到 TIM14 通用定時(shí)器包含一個(gè) 16 位自動(dòng)重載計(jì)數(shù)器,該計(jì)數(shù)器由可編程預(yù)分頻器 驅(qū)動(dòng)。它們可用于多種用途,包括測(cè)量輸入信號(hào)的脈沖寬度(輸入捕獲),或者生成輸出波形(輸出比較、PWM)。使用定時(shí)器預(yù)分頻器和 RCC 時(shí)鐘控制器預(yù)分頻器,可將脈沖寬度和波形周期從幾微秒調(diào)制到幾毫秒。
- 基本定時(shí)器 TIM6 和 TIM7 包含一個(gè) 16 位自動(dòng)重載計(jì)數(shù)器,該計(jì)數(shù)器由可編程預(yù)分頻器驅(qū)動(dòng)。此類定時(shí)器不僅可用作通用定時(shí)器以生成時(shí)基,還可以專門用于驅(qū)動(dòng)數(shù)模轉(zhuǎn)換器 (DAC)。實(shí) 際上,此類定時(shí)器內(nèi)部連接到 DAC 并能夠通過其觸發(fā)輸出驅(qū)動(dòng) DAC。
項(xiàng)目
項(xiàng)目介紹
實(shí)現(xiàn)一個(gè)us級(jí)延時(shí)
STM32CubeMX
-
配置時(shí)鐘
-
配置定時(shí)器
定時(shí)器頻率為 =TIMxCLK/(TIM_Prescaler+1)。定時(shí)器按照此頻率計(jì)數(shù),累計(jì) TIM_Period 個(gè)后產(chǎn)生一個(gè)更新或者中斷。
程序
定時(shí)器相關(guān)配置程序都由STM32CubeMX幫助我們生成了,我們主要來編寫一下微秒級(jí)延時(shí)函數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-663184.html
void delay_us(uint32_t us)
{
// Set timer period for desired delay in microseconds
__HAL_TIM_SET_AUTORELOAD(&htim2, us - 1);//定時(shí)器響應(yīng)時(shí)間為period*定時(shí)器頻率
HAL_TIM_Base_Start(&htim2);//start the timer
//通過輪詢的方式等待定時(shí)器的更新事件
//當(dāng)定時(shí)器溢出并計(jì)數(shù)器更新時(shí),TIM_FLAG_UPDATE標(biāo)志會(huì)被置位。
while(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE)==RESET);
__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE);//清楚更新標(biāo)志位
HAL_TIM_Base_Stop(&htim2);//Stop the timer
}
上述程序首先通過__HAL_TIM_SET_AUTORELOAD設(shè)定延時(shí)周期,之后打開定時(shí)器,等待事件標(biāo)志位更新后關(guān)閉定時(shí)器。文章來源地址http://www.zghlxwxcb.cn/news/detail-663184.html
到了這里,關(guān)于STM32使用定時(shí)器實(shí)現(xiàn)微秒(us)級(jí)延時(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!