stm32f407 基本定时器 计算方法

简单来说,基本定时器(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。 我踩了两天的坑。

求助无门。

硬抗了两天。。我的神。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值