/* 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); }
