STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!
目录
- 一、stm32串口通信
- 1.1 串口通信协议
- 1.2 通信接口
- 1.3 串口通信分类
- 1.4 STM32串行通信的通信方式
- 1.5 STM32串行通信
- 1.6 功能引脚
- 1.7 数据寄存器
- 2.1 RS-232通信协议
- 2.2 RS-232串口简介
- 3.1 USB转串口CH341接线
- 二、STM32的USART串口通信
- 1.1 题目要求
- 1.2 器件准备
- 1.3 USB转TTL与C8T6相连
- 1.4 CH341驱动安装
- 三、用寄存器地址实现stm32串口通信
- 四、 用HAL库的方式
- 4.1 创建工程,配置参数
- 4.2 代码编写
- 4.3 烧录编译
- 五、总结
- 六、参考链接
一、stm32串口通信
1.1 串口通信协议
- 串口是显控设备与信号处理板之间通信的主要接口,也是显控设备与其他设备、设备与设备之间的协议数据帧通信传输的重要接口。 [2] 串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。串口通信协议是基于串口使得通信双方能够相互沟通信息的一种约定,其定义了双方遵循的协议数据帧格式和其传输方式。 [2] 在串口通信中,常用的协议包括RS-232、RS-422和RS-485。
1.2 通信接口
1.3 串口通信分类
![在这里插入图片描述](https://img-blog.csdnimg.cn/2dfde6bd517c49a2b8f0e892624ac244.png
1.4 STM32串行通信的通信方式
1.5 STM32串行通信
1.6 功能引脚
TX: 发送数据输出引脚。
RX: 接收数据输入引脚。
SW_RX: 数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引 脚。
nRTS: 请求以发送(Request To Send),n表示低电平有效。如果使能 RTS流控制,当 USART 接收器准备好接收新数据时就会将 nRTS变成低电平;当接收寄存器已满时, nRTS将被设置为高电平。该引脚只适用于硬件流控制。
nCTS: 清除以发送(Clear To Send),n 表示低电平有效。如果使能 CTS流控制,发送 器在发送下一帧数据之前会检测 nCTS引脚,如果为低电平,表示可以发送数据,如果为 高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。 SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。
1.7 数据寄存器
USART 数据寄存器(USART_DR)只有低 9位有效
一般使用 8位数据字长。
USART_DR 包含了已发送的数据或者接收到的数据。
2.1 RS-232通信协议
若是芯片与PC机(或上位机)相连,除了共地之外,就不能这样直接交叉连接了。
尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口(通常为DB9封装),因此不能直接交叉连接。
RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。因此,要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成rs232类型,再交叉连接。
经过电平转换后,芯片串口和rs232的电平标准是不一样的:
单片机的电平标准(TTL电平):+5V表示1,0V表示0;
Rs232的电平标准:+15/+13 V表示0,-15/-13表示1。
RS-232通讯协议标准串口的设备间通讯结构图如下:
因此,单片机串口与PC串口通信遵循下面的连接方式:
在单片机串口与上位机给出的rs232口之间,通过电平转换电路,实现TTL电平与RS232电平之间的转换。
2.2 RS-232串口简介
RS232接口(封装D89)
通信过程中只有两个脚参与通信,电路连接时,连接三个脚即可。
2脚:电脑的输入RXD
3脚:电脑的输出TXD 通过2 ,3 脚就可以实现全双工(可同时收发)的串行异步通信
5脚:接地
PC串口与单片机串口连接方式:
其中,DB91是在电脑上的 DB92是在单片机实验板上焊接着的
如果电脑没有rs232口,只有USB口,可以用串口转接线转出串口,在电脑上位机上需要安装驱动程序。
用串口通信比USB简单,因为串口通信没有协议,使用方便简单。
3.1 USB转串口CH341接线
USB转串口模块可以使用5V电压供电,需要将跳帽按下图安装。
USB转串口模块可以使用3.3V电压供电,需要将跳帽按下图安装。
可以对USB转串口模块进行测试,将USB的电压引脚用跳帽接上,然后将RXD和TXD两个引脚用跳帽或者杜邦线接上。
然后打开串口终端,点击“手动发送”或者“自动发送”,如果在接收区可以接收到数据,说明USB转串口模块工作正常,否则需要检查接线是否正确、电路板元器件是否损坏。
USB转串口电路板与单片机的接线图,VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连。
二、STM32的USART串口通信
1.1 题目要求
完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式),要求:
(1)设置波特率为115200,1位停止位,无校验位;
(2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
(3)在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察串口输出波形,并分析其波形反映的时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。
1.2 器件准备
STM32F103C8T6最小核心板
USB转TTL
CH340驱动(USB串口驱动)_XP_WIN7共用
串口调试助手XCOM V2.3
1.3 USB转TTL与C8T6相连
连接示意表
实际连接图如下
1.4 CH341驱动安装
下载链接:
CH340/CH341
Windows 驱动链接:https://www.wch.cn/download/CH341SER_EXE.html/
打开网页,点击下载
下载好后,点击应用程序,再点击安装
在电脑设备管理器处查看有无com端口出现,有即可证明成功。
三、用寄存器地址实现stm32串口通信
建立模板要用到的SYSTEM文件及启动文件,包括点灯时需要的C8T6数据手册,以及烧录用到的FlyMcu,网盘自取。
链接:https://pan.baidu.com/s/1jxbVCa_filfR9ZRlmP6SMw
提取码:k4lv
以下步骤都在keil下操作
- 新建工程light
- 将startup_stm32f10x_md.s这个启动文件复制你所建的工程目录下,然后双击Source Group1添加(add))即可在新建USER和DAIMA文件和复制SYSTEM启动文件到工程目录下。
- 点击Target 1,再点击Manage Project ltems…
在上面对话框的中间栏,点新建(用红圈标出)按钮(也可以通过双击下面的空白处实现),新建 USER 和 SYSTEM 两个组。然后点击 Add Files 按钮,把 SYSTEM 文件夹三个子文件夹里面的:sys.c、usart.c、delay.c 加入到 SYSTEM 组中。注意:此时 USER 组下还是没有任何文件,我们只添加SYSTEM的三个。
- 点击 OK,退出该界面返回 IDE。
此时界面如图所示
- 接着,我们新建一个 test.c 文件,并保存在 USER 文件夹下。然后双击 USER 组,会弹出加载文件的对话框,此时我们在 USER 目录下选择 test.c 文件,加入到 USER 组下。
- 注意编译之前点击魔法棒,设置output生成.hex文件,路径放在OBJ文件里
- 接着,再设置 Listings 文件路径,在图 3.2.16 的基础上,打开 Listing 选项卡→点击 Select
Folder for Listings→找到 OBJ 文件夹→点击 OK
注:OBJ自己是新建的文件,用于存放编译器编译时后产生的 c/汇编/链接的列表清单
生成的.hex文件也放在里面便于寻找和后面烧录,主要是方便管理和查找。
- 加入sys、delay、usart的include路径:
在下载的SYSTEM组下,只需修改usart.c和编写写test.c文件即可。
在usart.c修改的代码如下
void uart_init(u32 pclk2,u32 bound)
{ float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIVmantissa=temp; //得到整数部分fraction=(temp-mantissa)*16; //得到小数部分 mantissa<<=4;mantissa+=fraction; RCC->APB2ENR|=1<<2; //使能PORTA口时钟 RCC->APB2ENR|=1<<14; //使能串口时钟 GPIOA->CRH&=0XFFFFF00F;//IO状态设置GPIOA->CRH|=0X000008B0;//IO状态设置 RCC->APB2RSTR|=1<<14; //复位串口1RCC->APB2RSTR&=~(1<<14);//停止复位 //波特率设置USART1->BRR=mantissa; // 波特率设置 USART1->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART1_RX //如果使能了接收//使能接收中断 USART1->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
}
在test.c中修改的代码:
#include "sys.h"
#include "usart.h"
#include "delay.h"
int main(void)
{ u16 t; u16 len; u16 times=0;Stm32_Clock_Init(9); //系统时钟设置delay_init(72); //延时初始化uart_init(72,115200); //串口初始化为115200while(1){if(USART_RX_STA&0x8000){ len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度printf("\r\n Hello Windows! \r\n\r\n");for(t=0;t<len;t++){USART1->DR=USART_RX_BUF[t];while((USART1->SR&0X40)==0);//等待发送结束}printf("\r\n\r\n");//插入换行USART_RX_STA=0;}else{times++;if(times%200==0)printf("Hello Windows!\r\n"); delay_ms(10); }}
}
编译结果
没有报错!
那么就可以进行烧录了。借助Flymou进行烧录
百度云盘资源
链接:https://pan.baidu.com/s/1VxMUZFOVvpAf-L_YbATMag
提取码:fasf
用XCOM串口观察助手
打开XCOM串口助手,弹出界面点击打开串口,即可以接收到C8T6发送的数据Hello Windows!
四、 用HAL库的方式
4.1 创建工程,配置参数
打开Stm32CubeMX并创建工程
选择stm32F103C8开发板,开始工程
Mode选择异步通信(Asynchronous):
勾选Enabled:
配置项目设置(名称、位置、环境):
生成项目:
4.2 代码编写
- Stm32CubeMX设置好后跳转到keil上
- 在main.c中定义STM32需要给上位机发送的消息:
uint8_t hello[20]="hello windows!\n";
- 在main.c中定义一个延时函数,来使设置发送的时间间隔:
void Delay_wxc( volatile unsigned int t)
{unsigned int i;while(t--)for (i=0;i<800;i++);
}
- 在while循环中调用查询,并调用延时函数:
while (1){HAL_UART_Transmit(&huart1,hello,20,100000);Delay_wxc(3500); //这里每个人电脑不一样发送的间隔时延需要自己调整尝试/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
- 执行结果
4.3 烧录编译
打开FlyMcu 选择刚刚程序编译生成的hex文件,并搜索串口并烧录
打开XCOM串口观察小助手
五、总结
keil没有成功build的话,可能是代码本身问题,也可使魔法棒里的一些设置问题。烧录没成功可能是实验操作时的一些没有注意到的小问题,一步一步的找出问题,实践出真知,都能解决的。
六、参考链接
https://blog.csdn.net/qq_43328313/article/details/106439088
https://blog.csdn.net/qq_46467126/article/details/120841504?spm=1001.2014.3001.5502
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!相关推荐
- STM32 IAP升级--内部FLASH和外部FLASH两种方式实现
芯片型号STM32F103RET6,flash大小512K,起始地址0x08000000 一般说STM32内部FLASH就是指主存储器区域 [注]此实验中启动方式设置为复位后从主闪存存储器启动(BOO ...
- STM32 Systick实现us和ms定时的两种方式
第一种方式是正点原子的,正点原子的SysTick->LOAD=(u32)nms*fac_ms,应该再减1,作者程序未减,第二种方式是野火的,第三种是慧净的,与原子一样多计1us,第四种是小马飞控 ...
- 网页调用服务器视频代码,PPVOD视频系统调用视频地址播放的两种方式
PPVOD视频系统系统的设计目标就是把各种格式的视频丢进去,系统自动处理变成可以在网页播放的的视频地址,为了用户个性化需要,我们系统生成了两种视频地址: 第一种就是分享地址 这个分享地址类似于优酷.奇 ...
- U-boot mkimage指定Linux内核地址时的两种方式
uImage的制作是使用的u-boot工具mkimage,build完u-boot后也会将mkimage build出來到/tools目录下,可以直接拿來用,它的作用就是在zImage的前面加上64个 ...
- ROS话题通信中创建自定义数据类型的两种方式
一.在同一个功能包下创建.msg文件 1.在功能包目录下创建msg文件夹 2.在文件夹中创建.msg文件 3.在该功能包的package.xml文件中加入: <build_depend>m ...
- Ardunio下的STM32串口通信
文章目录 任务要求 Ardunio下的STM32串口通信 软件准备 编译烧录 标准库函数与HAL库函数的stm32编程方式差异 国人版的MCU集成开发平台 stduino IDE 总结 任务要求 安装 ...
- 安装STM32CubeMX,stm32串口通信
目录 一.串口通信和RS-232标准 1.串口通信 波特率 数据位 停止位 奇偶校验 2.RS-232标准 二.安装STM32CubeMX,搭建STM32的开发环境 1.安装jdk 2.安装STM32 ...
- STM32串口通信详解(嵌入式学习)
STM32串口通信 1.通信基础知识 1.1 时钟信号区分 同步通信 异步通信 波特率 总线协议(电气协议) 1.2 通信方式划分 串行通信 并行通信 1.3 通信方向划分 单工通信 半双工通信 全双 ...
- stm32串口通信(初学者对于串口通信的理解)
stm32串口通信(初学者对于串口通信的理解) 标签: stm32串口通信单片机 2015-01-24 10:12 987人阅读 评论(0) 收藏 举报 分类: stm32 版权声明:本文为博主原创 ...
- STM32串口通信详解以及通信异常或者卡死常见问题分析
STM32串口通信详解以及通信异常或者卡死常见问题分析 目录 STM32串口通信详解以及通信异常或者卡死常见问题分析 一.常见的异常问题 二.STM32的串口简介 1.串口的通讯方式 ①按数据传输方向 ...
最新文章
- 打开,保存文件框的文本溢出排查
- 熟悉scala命令,scala语言运行超级素数和猴子大王
- ZooKeeper内部原理
- Linux Shell常用技巧(九)
- python曲线拟合_python如何实现数据的线性拟合
- pandas 第一行_Pandas数据预处理相关经验
- Qt/C++工作笔记-对vector与QVector中erase操作的进一步认识(区别与联系)
- 浙大 PAT b1022
- 人人都是产品经理 笔记
- AtCoder 杂题训练
- 51单片机模拟交通灯c语言程序,51单片机protues仿真——LED模拟交通灯
- 删除了电脑硬盘的数据能恢复吗,硬盘数据删除了还能恢复吗
- Sass系统技术选型笔记(1)OS
- window.history详细解析
- 人们有时对机率存在的错误的认识
- 【私藏】开发APP必须知道的API集合
- AIR开发ios游戏总结
- 遇到的文件从本地上传HDFS失败
- Gitlab的介绍及使用
- IQ正交调制及星座图
热门文章
- Android 蓝牙 BLE扫描、广播、连接、数据收发源码分析(2)- inquiry扫描周围设备
- 如何使用安卓+qq邮箱+腾讯企业邮箱发送邮件
- JavaWeb——动态 web 资源开发
- 一次性餐巾行业调研报告 - 市场现状分析与发展前景预测
- Tushare财经数据调取方法(行情数据)
- scipy.ndimage.measurements.find_objects()
- RestAssured实现POST请求
- 大数据压缩处理:数据分卷压缩和分卷压缩解压
- pytest -------- 生成测试报告+ 定制报告(allure生成报告)测试报告生成工具Allure 集成到pytest中【十三】
- RecorderManager安卓仿微信自定义音视频录制第三方库