標籤:
/* SystemFrequency / 1000 1ms中斷一次 * SystemFrequency / 100000 10us中斷一次 * SystemFrequency / 1000000 1us中斷一次 */#define SYSTICKPERIOD 0.000001#define SYSTICKFREQUENCY (1/SYSTICKPERIOD)/** * @brief 定時器2的初始化,,定時周期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); /* 設定更新要求源只在計數器上溢或下溢時產生中斷 */ TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Global); TIM_ClearFlag(TIM2, TIM_FLAG_Update);}/** * @brief ms延時程式,1ms為一個單位 * @param * @arg nTime: Delay_ms( 10 ) 則實現的延時為 10 * 1ms = 10ms * @retval 無 */void Delay_ms(__IO uint32_t nTime){ /* 清零計數器並使能滴答定時器 */ TIM2->CNT = 0; TIM_Cmd(TIM2, ENABLE); for( ; nTime > 0 ; nTime--) { /* 等待一個延時單位的結束 */ while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != SET); TIM_ClearFlag(TIM2, TIM_FLAG_Update); } TIM_Cmd(TIM2, DISABLE);}
STM32普通定時器實現延時函數