/******************************************************************************* * 名 称: 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 T4_Init(void) { TIM4_ARRPreloadConfig(1); TIM4_PrescalerConfig(TIM4_PRESCALER_32,TIM4_PSCRELOADMODE_IMMEDIATE); //128分频 TIM4_SetAutoreload((F_CPU/32/OS_TICKS_PER_SEC)); TIM4_Cmd(1); TIM4_ITConfig(TIM4_IT_UPDATE,1); }
void resetTim4For500us(void) { TIM4_DeInit(); TIM4_TimeBaseInit(TIM4_PRESCALER_32,250); TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE); TIM4_ARRPreloadConfig(ENABLE); TIM4_Cmd(ENABLE); }