stm8L 串口收发数据错误问题

一,项目描述

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

二,遇到的问题

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

三,解决问题的过程

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

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

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

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

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

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

 

 

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

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

 

 

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

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

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

四,总结:

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

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

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

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

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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值