STM32普通定時(shí)器實(shí)現(xiàn)延時(shí)函數(shù)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
/* SystemFrequency / 1000 1ms中斷一次
* SystemFrequency / 100000 10us中斷一次
* SystemFrequency / 1000000 1us中斷一次
*/
#define SYSTICKPERIOD 0.000001
#define SYSTICKFREQUENCY (1/SYSTICKPERIOD)
/**
* @brief 定時(shí)器2的初始化,,定時(shí)周期1ms
* @param 無
* @retval 無
*/
void TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/SYSTICKFREQUENCY -1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM2, ENABLE);
/* 設(shè)置更新請(qǐng)求源只在計(jì)數(shù)器上溢或下溢時(shí)產(chǎn)生中斷 */
TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Global);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
}
/**
* @brief ms延時(shí)程序,1ms為一個(gè)單位
* @param
* @arg nTime: Delay_ms( 10 ) 則實(shí)現(xiàn)的延時(shí)為 10 * 1ms = 10ms
* @retval 無
*/
void Delay_ms(__IO uint32_t nTime)
{
/* 清零計(jì)數(shù)器并使能滴答定時(shí)器 */
TIM2->CNT = 0;
TIM_Cmd(TIM2, ENABLE);
for( ; nTime > 0 ; nTime--)
{
/* 等待一個(gè)延時(shí)單位的結(jié)束 */
while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != SET);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
}
TIM_Cmd(TIM2, DISABLE);
}