发新帖本帖赏金 3.00元(功能说明)我要提问
返回列表
打印
[STM32F4]

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

[复制链接]
2463|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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关于时钟配置的说明:
 *                    Supported STM32F40xxx/41xxx devices
  *-----------------------------------------------------------------------------
  *        System Clock source                    | PLL (HSE)
  *-----------------------------------------------------------------------------
  *        SYSCLK(Hz)                             | 168000000
  *-----------------------------------------------------------------------------
  *        HCLK(Hz)                               | 168000000
  *-----------------------------------------------------------------------------
  *        AHB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        APB1 Prescaler                         | 4
  *-----------------------------------------------------------------------------
  *        APB2 Prescaler                         | 2
  *-----------------------------------------------------------------------------
  *        HSE Frequency(Hz)                      | 25000000
  *-----------------------------------------------------------------------------
  *        PLL_M                                  | 25
  *-----------------------------------------------------------------------------
  *        PLL_N                                  | 336
  *-----------------------------------------------------------------------------
  *        PLL_P                                  | 2
  *-----------------------------------------------------------------------------
  *        PLL_Q                                  | 7
  *-----------------------------------------------------------------------------
  *        PLLI2S_N                               | NA
  *-----------------------------------------------------------------------------
  *        PLLI2S_R                               | NA
  *-----------------------------------------------------------------------------
  *        I2S input clock                        | NA
  *-----------------------------------------------------------------------------
  *        VDD(V)                                 | 3.3
  *-----------------------------------------------------------------------------
  *        Main regulator output voltage          | Scale1 mode
  *-----------------------------------------------------------------------------
  *        Flash Latency(WS)                      | 5
  *-----------------------------------------------------------------------------
  *        Prefetch Buffer                        | ON
  *-----------------------------------------------------------------------------
  *        Instruction cache                      | ON
  *-----------------------------------------------------------------------------
  *        Data cache                             | ON
  *-----------------------------------------------------------------------------
  *        Require 48MHz for USB OTG FS,          | Disabled
  *        SDIO and RNG clock                     |
  *-----------------------------------------------------------------------------
可知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,可以方便地配置系统时钟:



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

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



3、在system_stm32f4xx.c中修改

371行
#define PLL_M     4

384行
#define PLL_Q      4

401行

#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工具配置固件库还是挺方便的。新酒装老瓶!

使用特权

评论回复
5
mmuuss586| | 2017-11-25 20:24 | 只看该作者

期待楼主更新

使用特权

评论回复
6
dongnanxibei| | 2017-11-25 20:37 | 只看该作者
sky.sun.zz 发表于 2017-11-25 19:36
其实就是只修改几个参数,利用STM32CubeMX工具配置固件库还是挺方便的。新酒装老瓶! ...

说的是,我准备把用到的单片机的结构图和配置函数都打出来,做一张大图。

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

727

帖子

13

粉丝