本帖最后由 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行定义芯片型号:
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官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。
|