我們在寫代碼的時候避免不了要使用延時函數(shù),很多延時函數(shù)都是使用中斷或者tick來實現(xiàn)的,tick的方式最大到毫秒ms級別,通過中斷方式的通用定時器來實現(xiàn),如果實現(xiàn)1us的延時那么每1us就來一次中斷,很影響cpu的效率。
本文提供一種不使用中斷,并且很簡單的方式實現(xiàn)的微秒級精確定時。
通過使用通用定時器來實現(xiàn)
代碼如下(基于stm32f103)
static void us_delay(uint32_t us)
{
uint32_t count = us;
TIM_SetCounter(TIM3, count);
TIM_Cmd(TIM3, ENABLE);
while (count > 1)//一般改為>= 1,只是 > 1延時偶爾會不夠
{
count = TIM_GetCounter(TIM3);
}
TIM_Cmd(TIM3, DISABLE);
}
static void timer_init(void)//2us
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseStructure.TIM_Period = 1;
TIM_TimeBaseStructure.TIM_Prescaler = 71;//72Mhz
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_Cmd(TIM3, DISABLE);
}
示波器測試抓到的5us延時如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-848119.html
當然如果要實現(xiàn)毫秒級別的要是就很簡單了,代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-848119.html
void ms_delay(uint32_t ms)
{
us_delay(ms * 1000);
}
到了這里,關于STM32不使用中斷實現(xiàn)定時器微秒級精確延時的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!