串口通信乱码的问题
继上次调好CAN通信之后,在做蓝牙和232通讯的过程中发现传回来的数始终是乱码,折磨了一段时间,在排除了串口协议设置本身的问题之后,最后得出结论:移植板子的过程中一定要弄清楚单片机时钟的关系。
波特率的问题归根到底是时钟的问题
首先考虑到:stm32f407和stm32f427的区别最主要是系统时钟不一样(前者是168Mhz,后者是180MHZ,所以在移植的时候也把重心放到了此处,只是当时仅仅改了一个声明,并没有考虑到硬件。
原理图硬件的重要性
32时钟的配置一般在system_stm32f4xx.c文件和stm32f4xx.h文件中表现。
首先在system_stm32f4xx.c的开头导入了stm32f4xx.h,而在stm32f4xx.h文件中定义了满足你芯片型号的晶振变量。对应代码片段为:
①高速外部晶振HSE的选择:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5G9eyin-1642315023799)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116140559004.png)]](https://img-blog.csdnimg.cn/dc4726ab0b074450973901b6d00d24f8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
其中画红线部分是你使用单片机的选型,不同的选型对应的是不同的HSE(蓝色划线部分),比如我现在使用的是stm32f427,而在这之前我使用的是正点原子的芯片,从原理图上看,正点原子用的外部晶振是8Mhz。(如下图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XYUjGje-1642314970758)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116141027485.png)]](https://img-blog.csdnimg.cn/35f45645e36841deaf25d8ff44db801d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_19,color_FFFFFF,t_70,g_se,x_16)
而我目前用的stm32427芯片原理图上看是12MHZ(如下图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sqOyuRQf-1642314970759)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116140958211.png)]](https://img-blog.csdnimg.cn/14641084657e425996987999320b58dd.png)
所以此时,我们需要把文件里定义的HSE晶振频率改为你所用单片机原理图OSC_IN和OSC_OUT对应的晶振(单位为MHZ的那个),修改如下图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wJ4gQDQp-1642314970759)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116141234489.png)]](https://img-blog.csdnimg.cn/a1d4e9e42f7a4b7989d68da5fdf9fdb0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
** 注意
①如果你在编译器的环境变量中定义了HSE(HSE_VALUE)值,那么你应该修改环境变量里的那个HSE值,比如我现在用的是IAR编译器:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LLABwakr-1642314970759)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116141512673.png)]](https://img-blog.csdnimg.cn/10f3d0fe442e42c6a641484233a64db0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
②有些定义HSE的代码是直接写在system_stm32f4xx.c文件中的,那么就在.c文件中改。
修改system_stm32f4xx.c对应的系数PLL_M PLL_N PLL_P PLL_Q
回到一开始的问题,407和427的主要区别在于二者系统时钟即SystemCoreClock不一样,你会在.c文件中看到不同型号单片机的系统时钟赋值,如下图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U1EL89AK-1642314970760)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116142041125.png)]](https://img-blog.csdnimg.cn/b685363a61144b5ea5a7d24d518b053c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
但赋值本质上只是给了一个数而已,单片机是一个硬件,真正的SystemCoreClock是通过硬件上的晶振所决定的(可以使用高速外部时钟源HSE,也可以使用高速内部时钟源HSI),这里我们一直使用的是HSE。
那么由硬件决定的HSE是如何计算得到系统时钟的呢?
在system_stm32f4xx.c文件中给出了以下公式:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xAsa5alL-1642314970760)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116142759952.png)]](https://img-blog.csdnimg.cn/db3281eeda29461e84e249d5332a8a17.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
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系列.
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRjb8wUB-1642314970760)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143214567.png)]](https://img-blog.csdnimg.cn/4c98edeb15124c188e3c6fd9ad6e8437.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLOrdutf-1642314970761)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143233559.png)]](https://img-blog.csdnimg.cn/dbfcbd0f9bb34baf9943d692d7b9d2f5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8RI72wTt-1642314970761)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143252064.png)]](https://img-blog.csdnimg.cn/03bcc7c3d97140b58dac76b9dbad99f4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gysVok5U-1642314970762)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143303363.png)]](https://img-blog.csdnimg.cn/0ada2089884f487aba0e6e837d9ff352.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7WUnTlf-1642314970762)(C:\Users\Sherlock\AppData\Roaming\Typora\typora-user-images\image-20220116143314706.png)]](https://img-blog.csdnimg.cn/ff4c7d3b3fb14eb4837141e3345a7e29.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUk9TX2hvbWVz,size_20,color_FFFFFF,t_70,g_se,x_16)
|