/** * @brief Delay x sec * @param Seconds : number of seconds to delay * @retval None. * Note : TIM4 is configured for a system clock = 2MHz */ void Delay_Seconds(uint8_t Seconds) { uint8_t i = 0; /* Enable TIM4 Clock */ CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE); /* Configure TIM4 to generate an update event each 1 s */ TIM4_TimeBaseInit(TIM4_Prescaler_16384, 123); /* Enable TIM4 */ TIM4_Cmd(ENABLE); /* Clear the Flag */ TIM4_ClearFlag(TIM4_FLAG_Update); for (i = 0; i < Seconds; i++) { /* Wait 1 sec */ while ( TIM4_GetFlagStatus(TIM4_FLAG_Update) == RESET ) {} /* Clear the Flag */ TIM4_ClearFlag(TIM4_FLAG_Update); } /* Disable TIM4 */ TIM4_Cmd(DISABLE); /* Disable TIM4 Clock */ CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, DISABLE); }
/******************************************************************************* * 名 称: TIM4_Config * 功 能: 配置TIM4,为定时中断10ms, 频率100Hz * 入口参数: 无 * 出口参数: 无 * 作 者: Roger-WY * 创建日期: 2014-08-20 * 修 改: * 修改日期: * 备 注: *******************************************************************************/ static void TIM4_Config(void) { #if 1 /* 空间不足,优化代码 */ /* TIM4是自动重载的8位定时器,计数方向为递增,当递增到0时可以产生定时器中断,并自动重装定时器初值 */ /* 计算期望的计数时钟个数, 由于TIM4是8位的定时器,因此如果该值大于255,则需要进行分频 */ TIM4_DeInit(); /* 复位TIM4所有寄存器 */ TIM4_ARRPreloadConfig(ENABLE); /* 预先装载使能 */ TIM4_TimeBaseInit(TIM4_PRESCALER_128, (16000000u / (1000 / SYSTICK_PERIOD)) / 128); /* 设置预分频和定时器重载 */ /* Clear TIM4 update flag */ TIM4_ClearFlag(TIM4_FLAG_UPDATE); TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); /* 使能TIM4中断 */ //TIM4_UpdateDisableConfig(ENABLE); /* 使能TIM4自动溢出事件 */ TIM4_Cmd(ENABLE); /* 使能TIM4 */ #else /* 下面这个分支,可以根据时钟自动计算TIM4定时器初值 */ uint32_t uiSysClkFreq; uint32_t uiCount; uiSysClkFreq = CLK_GetClockFreq(); /* 获得当前的系统时钟频率 */ TIM4_DeInit(); /* 复位TIM4所有寄存器 */ TIM4_ARRPreloadConfig(ENABLE); /* 预先装载使能 */ /* TIM4是自动重载的8位定时器,计数方向为递增,当递增到0时可以产生定时器中断,并自动重装定时器初值 */ /* 计算期望的计数时钟个数, 由于TIM4是8位的定时器,因此如果该值大于255,则需要进行分频 */ uiCount = uiSysClkFreq / (1000 / SYSTICK_PERIOD); if (uiCount <= (1u << 8)) { TIM4_TimeBaseInit(TIM4_PRESCALER_1, uiCount); /* 设置预分频和定时器重载 */ } else if (uiCount <= (1u << 9)) { TIM4_TimeBaseInit(TIM4_PRESCALER_2, uiCount / 2); /* 设置预分频和定时器重载 */ } else if (uiCount <= (1u << 10)) { TIM4_TimeBaseInit(TIM4_PRESCALER_4, uiCount / 4); /* 设置预分频和定时器重载 */ } else if (uiCount <= (1u << 11)) { TIM4_TimeBaseInit(TIM4_PRESCALER_8, uiCount / 8); /* 设置预分频和定时器重载 */ } else if (uiCount <= (1u << 12)) { TIM4_TimeBaseInit(TIM4_PRESCALER_16, uiCount / 16); /* 设置预分频和定时器重载 */ } else if (uiCount <= (1u << 13)) { TIM4_TimeBaseInit(TIM4_PRESCALER_32, uiCount / 32); /* 设置预分频和定时器重载 */ } else if (uiCount < (1u << 14)) { TIM4_TimeBaseInit(TIM4_PRESCALER_64, uiCount / 64); /* 设置预分频和定时器重载 */ } else if (uiCount < (1u << 15)) { TIM4_TimeBaseInit(TIM4_PRESCALER_128, uiCount / 128); /* 设置预分频和定时器重载 */ } else { while (1); /* 异常,死机等待排错 */ } /* Clear TIM4 update flag */ TIM4_ClearFlag(TIM4_FLAG_UPDATE); TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); /* 使能TIM4中断 */ //TIM4_UpdateDisableConfig(ENABLE); /* 使能TIM4自动溢出事件 */ TIM4_Cmd(ENABLE); /* 使能TIM4 */ #endif }
void MOD_TIM_Config(Mod_Master_Frame_TypeDef* aFrame) { TIM2_DeInit(); TIM2_TimeBaseInit(0x0F, 1500); //2ms comm response time TIM2_UpdateRequestConfig(TIM2_UPDATESOURCE_REGULAR); TIM2_GenerateEvent(TIM2_EVENTSOURCE_UPDATE); TIM2_Cmd(DISABLE); TIM2_ClearITPendingBit(TIM2_IT_UPDATE); TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE); TIM2_ClearFlag(TIM2_FLAG_UPDATE); TIM4_DeInit(); TIM4_TimeBaseInit(0x07, 126); //128 * 126 = 16128 = 2ms (8MHz), frame check TIM4_UpdateRequestConfig(TIM4_UPDATESOURCE_REGULAR); TIM4_GenerateEvent(TIM4_EVENTSOURCE_UPDATE); TIM4_Cmd(DISABLE); TIM4_ClearITPendingBit(TIM4_IT_UPDATE); TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); TIM4_ClearFlag(TIM4_FLAG_UPDATE); }
void CAN_Node_Clock_init(void) { /* Configure TIM4 to run every 2 ms at 8 MHz clock. */ TIM4_TimeBaseInit(TIM4_PRESCALER_128, Tim4Period); TIM4_ClearFlag(TIM4_FLAG_UPDATE); //TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); TIM4_Cmd(ENABLE); }
void Init_Timer4(void) { //1ms中断一次 TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124); /* Clear TIM4 update flag */ TIM4_ClearFlag(TIM4_FLAG_UPDATE); /* Enable update interrupt */ TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); TIM4_Cmd(ENABLE); }
bool CAN_Node_Clock_check_pending(void) { if (TIM4_GetFlagStatus(TIM4_FLAG_UPDATE) == RESET) return FALSE; TIM4_ClearFlag(TIM4_FLAG_UPDATE); if (--clock_counter == 0) { clock_counter = ClockPostscaler; return TRUE; } //bool result = clock_pending; //clock_pending = FALSE; //return result; return FALSE; }
/** * @brief Wait 1 sec for LSE stabilisation . * @param None. * @retval None. * Note : TIM4 is configured for a system clock = 2MHz */ void LSE_StabTime(void) { CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE); /* Configure TIM4 to generate an update event each 1 s */ TIM4_TimeBaseInit(TIM4_Prescaler_16384, 123); /* Enable TIM4 */ TIM4_Cmd(ENABLE); /* Wait 1 sec */ while ( TIM4_GetFlagStatus(TIM4_FLAG_Update) == RESET ); TIM4_ClearFlag(TIM4_FLAG_Update); /* Disable TIM4 */ TIM4_Cmd(DISABLE); CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, DISABLE); }
/** * @brief Configure TIM4 to generate an update interrupt each 1ms * @param None * @retval None */ void TIM4_Config(void) { /* TIM4 configuration: - TIM4CLK is set to 16 MHz, the TIM4 Prescaler is equal to 128 so the TIM1 counter clock used is 16 MHz / 128 = 125 000 Hz - With 125 000 Hz we can generate time base: max time base is 2.048 ms if TIM4_PERIOD = 255 --> (255 + 1) / 125000 = 2.048 ms min time base is 0.016 ms if TIM4_PERIOD = 1 --> ( 1 + 1) / 125000 = 0.016 ms - In this example we need to generate a time base equal to 1 ms so TIM4_PERIOD = (0.001 * 125000 - 1) = 124 */ /* Time base configuration */ TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD); /* Clear TIM4 update flag */ TIM4_ClearFlag(TIM4_FLAG_UPDATE); /* Enable update interrupt */ TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); /* Enable TIM4 */ TIM4_Cmd(ENABLE); }