STM32串口发送注意问题

发布者:InspiredDreamer最新更新时间:2017-11-07 来源: eefocus关键字:STM32  串口发送 手机看文章 扫描二维码
随时随地手机看文章

使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。错误依旧。

    故障排除过程:

    1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。

    2、使用单步调试,单步运行各个发送指令,都正常。能收到0x01 0x02 0x03 0x04的数据。间接的排除了不是电脑软件的问题,而是其他的错误。

    3、单步调试运行虽然正常了,但连续运行时,错误依旧。现在有点摸不到头绪了,单步运行正常,看起来编程没有出错,那故障在哪里呢?测试程序如下

   USART_SendData(USART2, 0x01);                                 //A

   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);   //B

   USART_SendData(USART2, 0x02);                                 //C

   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);

   USART_SendData(USART2, 0x03);

   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);

   USART_SendData(USART2, 0x04);

   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);

    4、猜测,也许是因为某个特殊原因,使第二个数据覆盖了首个数据,使得首个数据丢失。假设:在执行B指令时,USART的 TC 状态位==SET,那么就会紧接着执行C指令,也就有可能发生数据的覆盖。于是,在A指令前,加入如下指令:

   USART_ClearFlag(USART2,USART_FLAG_TC);

    5、加入上一条指令后,运行,错误消失了。说明上一个假设,应该是成立的。

    6、查阅stm32f10x参考手册,找到这样一句话:

TC:发送完成

当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。

0:发送还未完成;

1:发送完成。

    7、注意到这一句:由软件序列清除该位(先读USART_SR,然后写入USART_DR)。 也就是说,要先read USART_SR,然后write USART_DR,才能完成TC状态位的清除。而硬件复位后,串口发送的首个数据之前没有read SR的操作,是直接write DR,也就是说,TC没有被清除掉。 说明第4步的猜测是对的。

    8、那么,应该把指令A前面加的USART_ClearFlag(USART2,USART_FLAG_TC); 改为USART_GetFlagStatus(USART2, USART_FLAG_TC);,应该也能消除错误。测试后证实,确实如此,在发送首个数据之前,先读取一下USART_SR,那么就不会出现首个数据丢失的情况了。

    9、总结:硬件复位后,串口发送首个数据之前,先读取一下USART_SR,则能够保证首个数据发送时,不出现覆盖的情况。当然,也有别的方法,比如先清除TC状态位,或是,在write USART_DR之后,加入一个小延时,让数据发送完毕,应该也能间接排除这个错误。


关键字:STM32  串口发送 引用地址:STM32串口发送注意问题

上一篇:STM32串口通信:串口通信库
下一篇:使用STM32F4的CCM内存

推荐阅读最新更新时间:2024-03-16 15:43

stm32上移植了ucos,现在需要使用到DS18B20采集温度
DS18B20的操作时序要使用到延时,我是用ucos的延时函数还是自己循环写一个延时? 现在有个问题:假如用ucos的延时函数,如果出现更高优先级的任务,那么会将读DS18B20这个任务挂起,会破坏DS18B20的时序操作,读不出来温度。这个延时我应该怎么处理? 分享到: 2012-08-14 08:40提问者采纳 第一 读取18B20的时候关闭任务切换,不进行任务调度 第二 通过任务通讯 互斥量 或者邮箱 让其他任务挂起 第三 关闭中断 第四 将操作18b20的任务优先级设置高点或者操作时提升其任务优先级 延时的话可以用ucos的延时函数 也可以自己写,不过还是用ucos的好 追问 谢
[单片机]
STM32上移植FreeModbus RTU的一点经验总结
这几天因为工作需要,移植了modbus RTU到STM32来,之前也听说过modbus,但是没有深入了解过,还以为会像usb 那样复杂的,经过这几天的折腾,发现真的太简单了。为了防止过段时间又忘记了怎么移植,在这里把移植过程记录下来,也为了方便初次接触modbus的人。 废话少说,首先去下载源码,我下载的是 freemodbus-v1.5.0 ,解压后如图所示: 在demo文件夹中有很多移植好的例子,但是没有STM32的,不要紧,我们参考已有的例子来操作就可以了。在demo文件夹下新建一个文件夹,命名为STM32,将BARE文件夹里的文件全部复制过来。 然后,我们建立一个STM32的工程,我用的是mdk4.72,关于怎
[单片机]
STM32之USART(one)
USART我们一般是用在调试程序时输出调试信息,或者是用来做串行通讯。 看到ST的手册USART的功能有多么强大,其实我们很少用到那么多功能,再者我对那些部分也不是很熟,所以我们先说一下我们最常用最简单的部分,以后如果用到其他的模式我们再来看,我们的内存是有限的,所以将这些最常用的知识常驻内存吧。 好了,那我们下边来看USART: 使USART正常使用,我们总结下步骤吧 1.要使用一个模块第一我们就要先时能相应的时钟,相应的,如果某个模块不再使用了要关闭相应的始终,这样的点点滴滴我们就能降低我们系统的功耗。 2.配置相应的引脚 3.配置USART的波特率,帧格式等 4.然后就是发送接收的事了
[单片机]
<font color='red'>STM32</font>之USART(one)
STM32 usb_core.c分析
usb_core.c这个c文件是个庞大的文件,主要是定义了usb2.0的标注协议处理函数。 下面是这个文件的所有函数: /******************************************************************************* * Function Name : Standard_GetConfiguration. * Description : 返回当前配置变量的地址 * Input : Length -需要的字节 How many bytes are needed. * Output : None. * Return : 如果'Length
[单片机]
基于STM32的实收实发超声波检测系统研究
1、引言 在高频的超声波数据采集及频率分析的应用中,通常会采用实收实发的系统来模拟收到信号,目前最经常采用的模式是使用下位机高速连续采样,上位机进行数据分析的模式,然后在将检测的信号通过D/A发送出去。这种模式可以完成M级甚至于G级的数据连续采样,目前已经在高速的工业信号采集中得到了广泛的应用。 提出基于STM32的实收实发系统,主控芯片采用目前最新的STM32F407芯片,属于ARM公司推出的最新一代低功耗高性能片上系统,内核为CORTexM4,最高主频可以到168MHz,内部采用ARM的精简指令集,单周期指令,并且集成了ARM公司的浮点DSP指令集,可以对数据进行信号滤波以及FFT运算,计算能力超过TI的200M主频的DS
[单片机]
基于<font color='red'>STM32</font>的实收实发超声波检测系统研究
stm32的ucosII加上ucGUI学习
一、学会使用Keil调试工具。 单步调试,跳过函数,跳出函数 可以快速定位到程序的bug位置 二、系统板级驱动要加载需要的函数 三、怎么一步步根据具体需要添加系统功能 程序开发过程 1、加入所用到的封装库 2、写板级驱动BSP 包括GPIO配置 时钟配置 所用到的各种初始化函数用同一的void BSP_Init(void)函数调用 3、编写stm32f10x_it.c文件,设置中断服务函数 4、建立任务,包括定义任务名(函数名),堆栈空间(一个数组),任务优先级(一个宏定义) 5、任务优先级的选择,不合理的优先级,会导致程序无法正常运行,例如有7个任务,界面任务,触摸任务,三个L
[单片机]
STM32 FSMC LCD 液晶的驱动—ILI9320
原来老早知道 STM32 具有 带4个片选的静态存储器控制器。支持CF卡、SRAM、PSRAM、NOR和NAND存储器 并行LCD接口,兼容8080/6800模式 这个其实就是FSMC 在这之前我一直使用IO口模拟8080时序感觉操作简单速度也很不错,而且ST官方上的FSMC的说明文档看得实在很晕找不到重点一直没试过FSMC。最近有机会尝试驱动驱动一块2.4的ILI9320由于要接线为了省力气直接使用了 FSMC的接法,顺便整理下写点东西出来。 我想使用12864液晶可能是每个会单片机的基本功了通常用个P0口发送8Bit数据在用一些控制线产生时钟信号,12864使用6800通信方式而小的彩色FTF 或CSTN屏流行8080通信
[单片机]
基于STM32设计的四轴飞行器飞控系统
引言 四轴飞行器是一种结构紧凑、飞行方式独特的垂直起降式飞行器,与普通的飞行器相比具有结构简单,故障率低和单位体积能够产生更大升力等优点,在军事和民用多个领域都有广阔的应用前景,非常适合在狭小空间内执行任务。因此四旋翼飞行器具有广阔的应用前景,吸引了众多科研人员,成为国内外新的研究热点。 本设计主要通过利用惯性测量单元(IMU)姿态获取技术、PID电机控制算法、2.4G无线遥控通信技术和高速空心杯直流电机驱动技术来实现简易的四轴方案。整个系统的设计包括飞控部分和遥控部分,飞控部分采用机架和控制核心部分一体设计增加系统稳定性,遥控部分采用模拟摇杆操作输入使操作体验极佳,两部分之间的通信采用2.4G无线模块保证数据稳定传输。飞
[单片机]
基于<font color='red'>STM32</font>设计的四轴飞行器飞控系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved