串口通信乱码的问题
继上次调好CAN通信之后,在做蓝牙和232通讯的过程中发现传回来的数始终是乱码,折磨了一段时间,在排除了串口协议设置本身的问题之后,最后得出结论:移植板子的过程中一定要弄清楚单片机时钟的关系。
波特率的问题归根到底是时钟的问题
首先考虑到:stm32f407和stm32f427的区别最主要是系统时钟不一样(前者是168Mhz,后者是180MHZ,所以在移植的时候也把重心放到了此处,只是当时仅仅改了一个声明,并没有考虑到硬件。
原理图硬件的重要性
32时钟的配置一般在system_stm32f4xx.c文件和stm32f4xx.h文件中表现。
首先在system_stm32f4xx.c的开头导入了stm32f4xx.h,而在stm32f4xx.h文件中定义了满足你芯片型号的晶振变量。对应代码片段为:
①高速外部晶振HSE的选择:
其中画红线部分是你使用单片机的选型,不同的选型对应的是不同的HSE(蓝色划线部分),比如我现在使用的是stm32f427,而在这之前我使用的是正点原子的芯片,从原理图上看,正点原子用的外部晶振是8Mhz。(如下图
而我目前用的stm32427芯片原理图上看是12MHZ(如下图
所以此时,我们需要把文件里定义的HSE晶振频率改为你所用单片机原理图OSC_IN和OSC_OUT对应的晶振(单位为MHZ的那个),修改如下图:
** 注意
①如果你在编译器的环境变量中定义了HSE(HSE_VALUE)值,那么你应该修改环境变量里的那个HSE值,比如我现在用的是IAR编译器:
②有些定义HSE的代码是直接写在system_stm32f4xx.c文件中的,那么就在.c文件中改。
修改system_stm32f4xx.c对应的系数PLL_M PLL_N PLL_P PLL_Q
回到一开始的问题,407和427的主要区别在于二者系统时钟即SystemCoreClock不一样,你会在.c文件中看到不同型号单片机的系统时钟赋值,如下图:
但赋值本质上只是给了一个数而已,单片机是一个硬件,真正的SystemCoreClock是通过硬件上的晶振所决定的(可以使用高速外部时钟源HSE,也可以使用高速内部时钟源HSI),这里我们一直使用的是HSE。
那么由硬件决定的HSE是如何计算得到系统时钟的呢?
在system_stm32f4xx.c文件中给出了以下公式:
PLL_VCO input clock = (HSE_VALUE or HSI_VALUE / PLL_M),
根据手册,这个值被建议在 1~2MHz,间接可以算出M范围
PLL_VCO output clock = (PLL_VCO input clock) * PLL_N
根据手册,这个值被建议在 192~432MHz,间接可以算出M范围
System Clock = (PLL_VCO output clock)/PLL_P
根据手册,系统时钟应小于等于120M,间接可以算出P范围
OTHER Clock = (PLL_VCO output clock)/PLL_Q ,
这个系数用来配置SD卡读写,USB等功能,应小于等于48M,间接可以算出Q范围
所以具体的赋值是根据以上公式得来的,最终得出的System Clock即为你单片机的系统时钟。而你的目的就是要让System Clock等于你想要的值(比如我的是180MHZ)
以下是不同单片机型号的时钟配置:包括stm32f40_41系列、stm32f42_43系列.
|