STM32 產生us延遲的方法
使用一個空閑不用的定時器,做如下設置,預分頻設為0, 周期設置為 55520-1
/* TIM7 init function */
static void MX_TIM7_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
htim7.Instance = TIM7;
htim7.Init.Prescaler = 0;
htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
htim7.Init.Period = 65519;
htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
另外編寫一個 delay_us的函數
/* 最大us數為 1356us */
inline void Delay_us(uint16_t us){
TIM7->CNT = 0;
HAL_TIM_Base_Start(&htim7);
while(TIM7->CNT < ((uint16_t)48 * us - 1));
}
調用時,將定時計數器清零,然后啟動定時器,等待計數器達到設定的值后返回。
這里的時鐘頻率 PCLK為48M,計數器設定值為 48*us數。使用時注意這個數不要超過在period中的設定值。 程序運行時如果被中斷,會損失精度。調用函數,函數返回也需要時間。如果需要高精度延遲時,需要將這些問題考慮進去。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。











