简单来说,基本定时器(TIM6,TIM7) 与时间相关的两个参数是 PSC 与 ARR.
代码如下,解释也在代码中。
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 开启TIMx_CLK,x[6,7]
RCC_APB1PeriphClockCmd( BASIC_TIM_CLK, ENABLE );
/*
累计 TIM_Period个后产生一个更新或者中断
当定时器从0计数到4999,即为5000次,为一个定时周期
*/
TIM_TimeBaseStructure.TIM_Period = 5000- 1;
/*
HCLK,提供给高速总线AHB的时钟信号; 16800 000 - 168MHZ
PCLK,提供给低速总线APB的时钟信号;
TIM6,7 挂载在APB1上, PCLK1 的时钟是 42M. 由RCC_GetClocksFreq(&RCC_Clocks) 取得
另
●
如果 RCC_DKCFGR 寄存器的 TIMPRE 位清 0:
如果 APB 预分频器分频系数是 1,则定时器时钟频率 (TIMxCLK) 为 PCLKx。否则,定
时器时钟频率将为 APB 域的频率的两倍:TIMxCLK = 2xPCLKx。
●
如果 RCC_DKCFGR 寄存器的 TIMPRE 位置 1:
如果 APB 预分频器配置分频系数是 1、2 或 4,则定时器时钟频率 (TIMxCLK) 将设置为
HCLK。否则,定时器时钟频率将为 APB 域的频率的四倍:TIMxCLK = 4xPCLKx。
现查看 rcc-dkcfgr , 此寄存器仅适用于 STM32F42xxx 和 STM32F43xxx 设备。
RCC 专用时钟配置寄存器 (RCC_DCKCFGR)
RCC_DCKCFGR_TIMPRE = ((uint32_t)0x01000000)
默认值是 0 ,即2分频
如果不是1, 则是4分频
那么定时器TIM6/7的 时钟就是 42M * 2 = 84M
*/
/*
eg,psc=8400 频率为 TIM6/7的时钟为 84 000 000 / 8400 = 10000 即 10K HZ ,即 每秒 10 K
然 arr 设置为 5000 即 5000/10K *1s = 0.5s 即 500ms
*/
TIM_TimeBaseStructure.TIM_Prescaler = 8400- 1;
// 初始化定时器TIMx, x[2,3,4,5]
TIM_TimeBaseInit( BASIC_TIM, &TIM_TimeBaseStructure );
// 清除定时器更新中断标志位
TIM_ClearFlag( BASIC_TIM, TIM_FLAG_Update );
// 开启定时器更新中断
TIM_ITConfig( BASIC_TIM, TIM_IT_Update, ENABLE );
// 使能定时器
TIM_Cmd( BASIC_TIM, ENABLE );
定时计算方法为: ARR * PSC / (PCLKx *y) ,x 定时器所在的APBx频率 ,y 为RCC 分频系数(2,4)
附图:
500ms 处上升,1000ms处下降。频率为 1HZ
增加:STM32F4xx_Clock_Configuration_V1.1.0.xls 部分 图解
HSE OSC : 外部晶振频率
HCLK: 时钟频率
在上图的配置下, TM6 在APB1 下, PCLK1 对应 21MHZ,但是有2倍频(查看上面的介绍RCC_DCKCFGR_TIMPRE)。所以。 TM6 的时钟是 42MHZ
使用时: 选择 run ,选择内部还是外部时钟。
点动Generate 生成 system_stm32f4xx.c 文件。
然后工程中,使用生成的这个文件和stm32f4xx.h文件
最后,请确认 stm32f4xx.h 中 HSE_VALUE 这个值是你外部晶振的数值。。
我踩了两天的坑,在野火开发板中测试正常,在工作中的板子上测试不正常。最后才发现野火的晶振是 25M,而工作中的板子的是 8MHZ。 我踩了两天的坑。
求助无门。
硬抗了两天。。我的神。