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