[STM32F4] ST分享大集结+STM32F407在stm32f4xx固件库中时钟的正确配置

[复制链接]
3171|5
 楼主| sky.sun.zz 发表于 2017-11-25 18:03 | 显示全部楼层 |阅读模式
本帖最后由 sky.sun.zz 于 2017-11-25 19:43 编辑

ST分享大集结+STM32F407在stm32f4xx固件库中时钟的正确配置

   开发一项目,使用芯片型号:STM32F407VG,需要与上位机串口通讯交换数据:
    系统时钟:外部晶振8MHZ,倍频到168MHZ;
    固件库:stm32f4xx_DSP_StdPeriph_Lib_V1.8.0;
    在MDK5中运行stm32f4xx_DSP_StdPeriph_Lib_V1.8.0串口通讯,进行软件预先评估,结果发现串口发送和接收数据都是乱码;
故障分析:
查阅system.stm32f4xx.c关于时钟配置的说明:
  1. *                    Supported STM32F40xxx/41xxx devices
  2.   *-----------------------------------------------------------------------------
  3.   *        System Clock source                    | PLL (HSE)
  4.   *-----------------------------------------------------------------------------
  5.   *        SYSCLK(Hz)                             | 168000000
  6.   *-----------------------------------------------------------------------------
  7.   *        HCLK(Hz)                               | 168000000
  8.   *-----------------------------------------------------------------------------
  9.   *        AHB Prescaler                          | 1
  10.   *-----------------------------------------------------------------------------
  11.   *        APB1 Prescaler                         | 4
  12.   *-----------------------------------------------------------------------------
  13.   *        APB2 Prescaler                         | 2
  14.   *-----------------------------------------------------------------------------
  15.   *        HSE Frequency(Hz)                      | 25000000
  16.   *-----------------------------------------------------------------------------
  17.   *        PLL_M                                  | 25
  18.   *-----------------------------------------------------------------------------
  19.   *        PLL_N                                  | 336
  20.   *-----------------------------------------------------------------------------
  21.   *        PLL_P                                  | 2
  22.   *-----------------------------------------------------------------------------
  23.   *        PLL_Q                                  | 7
  24.   *-----------------------------------------------------------------------------
  25.   *        PLLI2S_N                               | NA
  26.   *-----------------------------------------------------------------------------
  27.   *        PLLI2S_R                               | NA
  28.   *-----------------------------------------------------------------------------
  29.   *        I2S input clock                        | NA
  30.   *-----------------------------------------------------------------------------
  31.   *        VDD(V)                                 | 3.3
  32.   *-----------------------------------------------------------------------------
  33.   *        Main regulator output voltage          | Scale1 mode
  34.   *-----------------------------------------------------------------------------
  35.   *        Flash Latency(WS)                      | 5
  36.   *-----------------------------------------------------------------------------
  37.   *        Prefetch Buffer                        | ON
  38.   *-----------------------------------------------------------------------------
  39.   *        Instruction cache                      | ON
  40.   *-----------------------------------------------------------------------------
  41.   *        Data cache                             | ON
  42.   *-----------------------------------------------------------------------------
  43.   *        Require 48MHz for USB OTG FS,          | Disabled
  44.   *        SDIO and RNG clock                     |
  45.   *-----------------------------------------------------------------------------
可知STM32F40xxx/41xxx在固件库的默认配置:
HSE Frequency(Hz)  :   使用外部25MHZ晶振;
System Clock source:  PLL (HSE),
SYSCLK                    :  168MHZ.
PLL_M                     :25
PLL_N                     :336
PLL_P                     :2
PLL_Q                    :7

    由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。
借助STM32CubeMX,可以方便地配置系统时钟:

无标题.png

根据上图配置系统时钟所需正确参数:
M=4      PLL_M
N=168  PLL_N
P=2      PLL_P
Q=4      PLL_Q
接下来修改相关文件:
1、在stm32f4xx.h的70行定义芯片型号:
  1. #define STM32F40_41xxx

2、在144行定义晶振频率
  1. #define HSE_VALUE    ((uint32_t)8000000)



3、在system_stm32f4xx.c中修改

  1. 371行
  2. #define PLL_M     4

  3. 384行
  4. #define PLL_Q      4

  5. 401行

  6. #define PLL_N     168
串口代码请参考ST官方的,就不贴出来了。经过以上修改,编译运行,已经能够正常进行串口通讯了。
总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。








打赏榜单

21ic小管家 打赏了 3.00 元 2017-12-13

一路向北lm 发表于 2017-11-25 19:04 | 显示全部楼层
感谢分享,等楼主更新。
dongnanxibei 发表于 2017-11-25 19:33 | 显示全部楼层
如果能做成Excel就爽了。
 楼主| sky.sun.zz 发表于 2017-11-25 19:36 | 显示全部楼层
本帖最后由 sky.sun.zz 于 2017-11-25 19:45 编辑
dongnanxibei 发表于 2017-11-25 19:33
如果能做成Excel就爽了。

其实就是只修改几个参数,利用STM32CubeMX工具配置固件库还是挺方便的。新酒装老瓶!
mmuuss586 发表于 2017-11-25 20:24 | 显示全部楼层

期待楼主更新
dongnanxibei 发表于 2017-11-25 20:37 | 显示全部楼层
sky.sun.zz 发表于 2017-11-25 19:36
其实就是只修改几个参数,利用STM32CubeMX工具配置固件库还是挺方便的。新酒装老瓶! ...

说的是,我准备把用到的单片机的结构图和配置函数都打出来,做一张大图。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

732

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部