100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Proteus仿真stm32和51单片机 串口通信调试过程记录

Proteus仿真stm32和51单片机 串口通信调试过程记录

时间:2020-01-14 03:11:13

相关推荐

Proteus仿真stm32和51单片机 串口通信调试过程记录

前言

本文所用Proteus版本为8.10,主要内容为在Proteus中仿真stm32和51单片机进行串口通信,记录了仿真过程中遇到的问题和解决办法。

这里要注意的是,在Proteus中芯片工作的频率。在实际中,比如STM32外接8MHZ的晶振的时候,在不修改时钟配置的情况下,STM32的系统频率应72MHZ。

在Protesu中,通过双击仿真的芯片打开属性栏,输入的时钟频率是多少,那么芯片仿真运行的频率就是多少,即使代码里有对时钟进行配置,但是好像在Proteus里时钟的频率就是自己设置的那个值,与代码配置时钟无关。一般选择为8MHZ,因为输入的频率如果过高,那么Proteus仿真时间就过得特别特别的慢,所以在Proteus中仿真STM32时,时钟选择8MHZ比较好。

一、遇到的问题以及解决办法

问题1:stm32串口发送的数据,在串口软件中接收到的全是 00,偶尔串口软件打开串口之后又自动关闭了

问题2:stm32接收到的来自51单片机串口数据,只有第一个字节是正常的,其余字节全部乱码

首先是调试STM32的串口,这里用到了虚拟串口软件给电脑添加了两个虚拟串口,在Proteus中用到了COMPIN这个元件。本次实验波特率选择为2400。首先遇到的问题是,在程序中配置好串口之后,通过虚拟串口软件和串口调试助手,在Proteus中串口发送数据,但是接收到的数据全是00。检测了波特率、起始位、停止位等全部正常,最后在网友的帮助下,加上以下代码之后,串口软件接收到的数据就正常了。

下面的代码加在main函数入口处即可。

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//仿真加上这一句,不然串口调试不通

解决上述问题之后,我将51单片机和stm32的波特率都设置为2400(因为一开始设置为9600,出现问题我以为是波特率的问题,所以改成2400,还是没能解决,就懒得改回去了),然后用51单片机给STM32单片机通过串口发送数据,这里奇怪的是,stm32接收到的数据中,只有第一个字节正常,其余字节全部乱码了,然后我通过虚拟串口和串口调试助手,仍然只能正常接收到第一个字节,如果一次只发送一个字节,那么串口是没问题的。

下面是我的51单片机发送字符串的函数,这里我添加了延时1ms的函数,没有添加这个函数之前,就只能正常接收到第一个字节,稍微延时一下之后,就可以正常接收到所以字节。所以这里如果遇到类似的问题,大家可以试着在这里延时一下尝试一下。

//字符串发送函数void PutString(unsigned char *TXStr) {while(*TXStr!=0) {SBUF=*TXStr;while(TI==0);//仿真这里如果不稍微延时一下,接收到的数据除了第一个字节以外将会全部乱码TI=0; TXStr++;delay_ms(1);}}

总结

这里将我调试过程中遇到的问题记录下来,如果大家有遇到类似的问题,希望这篇文章可以帮到你。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。