硬汉哥的啦,每次找烦的很。
/*-----------------------------------------------------------------------
system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:
HCLK = SYSCLK / 1 (AHB1Periph)
PCLK2 = HCLK / 2 (APB2Periph)
PCLK1 = HCLK / 4 (APB1Periph)
因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;
APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13,TIM14
APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
----------------------------------------------------------------------- */
if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10) || (TIMx == TIM11))
{
/* APB2 定时器时钟 = 168M */
TIM_CLK= SystemCoreClock;
}
else
{
/* APB1 定时器 = 84M */
TIM_CLK= SystemCoreClock / 2;
}
if (needFreq < 100)
{
PSC = 10000 - 1; /* 分频比 = 10000 */
ARR = (TIM_CLK/ 10000) / needFreq- 1; /* 自动重装的值 */
}
else if (needFreq < 3000)
{
PSC = 100 - 1; /* 分频比 = 100 */
ARR = (TIM_CLK / 100) / needFreq - 1; /* 自动重装的值 */
}
else /* 大于4K的频率,无需分频 */
{
PSC = 0; /* 分频比 = 1 */
ARR = TIM_CLK / needFreq - 1; /* 自动重装的值 */
}