• stm8L 串口收发数据错误问题


    一,项目描述

            STM8L051接收上位机下发的数据命令,做相应的数据上传;

    二,遇到的问题

            串口收发数据错误,比如用SSCOM发送个01,直接原数返回,SSCOM显示FF, 发送什么数据都错误。

    三,解决问题的过程

            电工搞了这么多年的单片机,意法半导体的系列单片机,可以说是翻了个底朝天,熟悉的不能再熟悉了,竟然出了这个幺蛾子,那就一一排查吧。

            首先我用的STM8L+CH340N,第一步,怀疑CH340N电路是不是有问题,因为我用的USB5V供电,直接和3.3V供电的STM8L通讯(以前也这么搞过,没啥问题),我把CH340N改成3.3V供电,再测试,还是有问题。说明这块没问题,排除掉。

            接着看代码,把其他所以非相关的代码全部注释掉,只保留串口初始化代码,中断函数也只接收到转发上去。波特率,停止位,校验位等没问题。排除掉。

            然后就怎么想也想不通了,,,一根烟,,,,,,两根烟,,,,,,三根烟,,,,,,关电脑,,,,,,

            百思不得其解,收人家的钱,活还得给人家干,重复上述的操作,一行一行代码,一个一个硬件电路的检查,都没问题,乍一看代码,都没问题,代码如下:

    1. void USART_Config( void )
    2. {
    3. CLK_PeripheralClockConfig( CLK_Peripheral_USART1, ENABLE ); //使能USART1时钟
    4. USART_Init( USART1, //设置USART1
    5. 9600, //波特率设置
    6. USART_WordLength_8b, //数据长度设为8
    7. USART_StopBits_1, //1位停止位
    8. USART_Parity_No, //无校验
    9. ( USART_Mode_Rx | USART_Mode_Tx ) ); //设置为发送接收双模式
    10. USART_ITConfig( USART1, USART_IT_RXNE, ENABLE ); //使能接收中断
    11. USART_Cmd( USART1, ENABLE ); //使能USART1开始工作
    12. CLK_SYSCLKDivConfig( CLK_SYSCLKDiv_2 ); //内部时钟为1分频 = 16Mhz 为系统时钟
    13. }

     

     

    诡异的问题,需要诡异的灵感来去解决,我下意识的把最后一句话,挪到第一句的上面,问题解决了,代码如下:

    1. void USART_Config( void )
    2. {
    3. CLK_SYSCLKDivConfig( CLK_SYSCLKDiv_2 ); //内部时钟为1分频 = 16Mhz 为系统时钟
    4. CLK_PeripheralClockConfig( CLK_Peripheral_USART1, ENABLE ); //使能USART1时钟
    5. USART_Init( USART1, //设置USART1
    6. 9600, //波特率设置
    7. USART_WordLength_8b, //数据长度设为8
    8. USART_StopBits_1, //1位停止位
    9. USART_Parity_No, //无校验
    10. ( USART_Mode_Rx | USART_Mode_Tx ) ); //设置为发送接收双模式
    11. USART_ITConfig( USART1, USART_IT_RXNE, ENABLE ); //使能接收中断
    12. USART_Cmd( USART1, ENABLE ); //使能USART1开始工作
    13. }

     

     

    就是这个地方的不同,造成的数据不正确。

    使能串口时钟前,要先使能系统时钟,这样,串口时钟才会正确的匹配!

    记录下来,以便遇到同样问题的电友互相交流。

    四,总结:

    电工干了10多年的电子开发,撸代码,画电路,画板子。

    框架搭好之后,写代码像是不用脑袋一样,意识流的写。

    这就应验的一句话,往往在你最熟悉,最不起眼的地方栽跟头,还不知道怎么载的。

    一定要对自己画的每个电阻,每根线,每个芯片负责。

    一定要对自己敲的每行代码负责。

  • 相关阅读:
    嵌入式Qt-做一个秒表
    Day31-计算机基础1
    Jenkins的corn表达式
    短视频解决方案,助力企业实现数字化转型升级
    如何获取 mysql 外键索引的元数据信息?
    java计算机毕业设计自驾游网站系统源码+mysql数据库+系统+lw文档+部署
    练习4
    微服务系列之授权认证(一) OAuth 2.0 和 OpenID Connect
    项目代码标准化
    傻白入门芯片设计,芯片键合(Die Bonding)(四)
  • 原文地址:https://blog.csdn.net/xuechengchang/article/details/126723615