STM32与Proteus的串口仿真详细教程与源程序

包含LCD1602显示,串口发送接收,完美实现。
文档内容齐全,包含使用说明,相关驱动等。
解决了STM32的Proteus串口收发问题。    注意:每输入一个字符后,要按一次“手动发送”按钮,才能收到正确字符。

Proteus的串口仿真

打开串口调试助手,如图11-30所示。进入串口调试助手后,需要设置相关参数,串口号为图11-29所查到的端口号,其他参数根据实际程序来确定。打开串口后,按开发板上的reset按键,显示区就能接收到从开发板发送过来的“Welcome to HBEU”,每按复位键一次,就会接收一次,如图11-31所示;在发送区输入字符,如图11-32所示,点击“手动发送”,开发板上就能收到对应的字符,根据要求,不是以“x”结束的字符串,当超过20个字符后也接收到字符串。

 

图11-29 查看串口号
   在Proteus中仿真串口时,先安装“虚拟串口”驱动,如图11-33所示,安装完之后也可以查看虚拟串口的端口号,查看方法与图11-29一致。在串口助手中设置好串口参数后,按Proteus中运行按钮,也可以在串口助手收到信息,如图11-34所示,注意串口波特率。

 

 

 

        由于Proteus没有对stm32的时钟树做仿真模型,只固定了一套时钟值,可以用GETSYS/HCLK/PCLK函数看。Proteus不是实时仿真,所以串口速率不是硬件速率对应的值,可能更高,可能更低,好在Proteus的虚拟终端是可以输入非标准波特率的,推荐波特率设为9600bit/s。另外,在Proteus仿真的程序中加了一条语句:
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
        若没有该系统配置语句,则看不到仿真效果。仿真时钟跟实际时钟存在一定的延时误差,在上位机发送数据时,一次发送一个字符串时,接收会出现乱码,因此需要一个一个字符发送,如图11-35所示,在发送区依次输入“e1x”之后(注意:每输入一个字符后,要按一次“手动发送”按钮),虚拟终端(Virtual Terminal)会显示所发送的所有字符,当STM32的串口接收到字符“x”后,表示结束,在LCD屏上显示“e1”。
        为了接收方便,将最多发送20个字符改为最多发送5个字符,当我们依次输入“123456”后(注意:每输入一个字符后,要按一次“手动发送”按钮),LCD显示收到的字符串“12345”,如图11-36所示。

 

图11-35  STM32串口遇到“x”结束接收   图11-36  STM32串口收到6个字符自动结束 

程序代码

#include "stm32f10x.h"
#include "stdio.h"
//#include "led.h"
#include "delay.h"
#include "lcd1602.h"uint8_t USART_RXBUF[5];
extern uint8_t RXOVER;
/* Private function prototypes -----------------------------------------------*/
void NVIC_Configuration(void);
//void Delay_Ms(uint32_t nTime);
void USART_Config(void);
//void USART_SendString(int8_t *str);
void USART_SendString(unsigned char *buf);int main(void)
{uint8_t i;RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//SysTick_Init();SysTick_Config(SystemCoreClock/100000);GPIO_Configuration(); LCD1602_Init();LCD1602_Show_Str(0,0,"Receive:");        USART_Config();//USART_SendString(Tx_Buf);//发送字符串USART_SendString("Welcome to HBEU\r\n");//发送字符串while(1){if(RXOVER == 1){LCD1602_Show_Str(0,2,USART_RXBUF);                for(i=0;i<5;i++){USART_RXBUF[i] =' ';  //清空接收区}RXOVER = 0;USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);/}/*if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){USART_SendData(USART1,USART_ReceiveData(USART1));delay_ms(1000);}*/}
}/*void USART_Config(void)
{GPIO_InitTypeDef  GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//NVIC_Configuration();//配置USART2 TX引脚工作模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置USART2 RX引脚工作模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);//串口2工作模式配置USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);//USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);USART_Cmd(USART1, ENABLE);
}*/void USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟//DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟//DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);NVIC_Configuration();// 将USART Tx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置串口的工作参数// 配置波特率USART_InitStructure.USART_BaudRate = 9600;// 配置 针数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;// 配置校验位USART_InitStructure.USART_Parity = USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置工作模式,收发一起USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(USART1, &USART_InitStructure);// 使能串口USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);USART_Cmd(USART1, ENABLE);            
}/*** @说明     USART2字符串发送函数* @参数     str: 指向字符串的指针* @返回值   None*/
/*void USART_SendString(int8_t *str)
{uint8_t index = 0;do{USART_SendData(USART1,str[index]);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);index++;        }while(str[index] != 0);  //检查字符串结束标志}*/void USART_SendString(unsigned char *buf)
{while (*buf != '\0'){while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);USART_SendData(USART1, *buf++);}
}/*** @说明     配置中断向量控制器* @参数     None* @返回值   None*/
void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* Enable the RTC Interrupt */NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/645296.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NoC片上网络 On-Chip Network】应用程序的网络流量 合成网络流量

应用程序的网络流量 and 合成网络流量 1. 应用程序的网络流量 APPLICATION TRAFFIC2. 合成网络流量 SYNTHETIC TRAFFIC3. 合成网络流量的具体介绍 应用程序的网络流量 and 合成网络流量 1. 应用程序的网络流量 APPLICATION TRAFFIC 在 MPSoC(多处理器片上系统) 中&#xff…

【leetcode面试经典150题】63. 删除链表的倒数第 N 个结点(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件

实现日志收集服务的客户端 前言 从这篇文章开始我们就正式进入了日志收集系统的编写&#xff0c;后面几篇文章我们将学习到如何编写日志收集服务的客户端,话不多说,让我们进入今天的内容吧&#xff01; 需要实现的功能 我们要收集指定目录下的日志文件&#xff0c;将它们发…

补充:js 制作qq、微信 的表情 缺少的微信表情图片

这篇文章是补充一下 这个csdn&#xff1a;js 制作qq、微信 的表情缺少的微信表情图片

Vue+Echarts 实现中国地图和飞线效果

目录 实现效果准备 实现效果 在线预览&#xff1a;https://mouday.github.io/vue-demo/packages/china-map/dist/index.html 准备 高版本的echarts&#xff0c;不包含地图数据&#xff0c;需要自己下载到项目中 1、地图数据下载 https://datav.aliyun.com/portal/school/at…

行为监控软件监控什么 行为监控软件下载

行为监控软件主要用于监控和分析用户的行为模式。这类软件可以监控的内容相当广泛&#xff0c;安企神作为典型的行为监控软件&#xff0c;可以从中窥见软件监控的内容&#xff1a; 找客服咨询价格 1、应用程序与上网行为管理 应用程序监控&#xff1a;跟踪员工使用各类软件的…

云渲染100的优惠活动有哪些?渲染100邀请码1a12

现在的云渲染平台有很多&#xff0c;每个平台都有各种活动&#xff0c;以广受好评的云渲染平台渲染100为例&#xff0c;我们来说下设计师怎样才能省钱又方便吧。 1、新用户福利 渲染100对新用户很友好&#xff0c;注册时填邀请码1a12有新手大礼包&#xff0c;可以渲染20多张小…

Redis底层数据结构之IntSet

目录 一、概述二、IntSet结构三、自动升级 上一篇 redis底层数据结构之Dict 下一篇 Redis底层数据结构之ZSkipList 一、概述 IntSet是一个存储整数值的集合&#xff0c;内部使用有序、无重复的数组保存数据。优点:节省内存空间。高效的查找、插入和删除操作。使用场景: 在集合…

StarRocks最佳实践经验

目录 一、部署 1.1 容量规划 1.2 基础环境配置 1.3 机器配置 1.3.1 FE节点 1.3.2 BE节点 1.4 部署方案 二、建模 2.1 建表规范 2.2 模型选择 2.3 排序列和前缀索引选择 2.4 分区选择 2.5 分桶选择 2.6 字段类型 2.7 索引选择 2.7.1 Bitmap索引 2.7.2 Bloom fi…

Element-plus DatePicker 日期选择器【正则校验时间范围】

效果图&#xff1a; 利用element-plus中的form表单验证完成效果。 <el-form-item label"检查计划截止日期&#xff1a;" prop"deadline"><el-date-pickerv-model"form.deadline"value-format"YYYY-MM-DD"style"width: …

【复现】金和OA-jc6 RCE漏洞_74

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 金和C6协同管理平台包括协同办公管理,人力资源管理,项目管理,客户关系管理,企业目标管理,费用管理,移动办公,微信办公等多个业务范…

2024年【北京市安全员-B证】模拟考试题库及北京市安全员-B证操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-B证模拟考试题库是安全生产模拟考试一点通总题库中生成的一套北京市安全员-B证操作证考试&#xff0c;安全生产模拟考试一点通上北京市安全员-B证作业手机同步练习。2024年【北京市安全员-B证】模拟考试…