| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32USART串口通信 -> 正文阅读 |
|
[嵌入式]STM32USART串口通信 |
目录 一、串口通信协议? 1、UART简介嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。
2、 UART通信协议(1)起始位当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。 (2)数据帧紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 (3)奇偶校验位资料为加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 (4)停止位它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 (5)下个起始位处于逻辑“1”状态,表示当前线路上没有资料传送,进入空闲状态。 处于逻辑“0”状态,表示开始传送下一数据段。 (6)波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。 常用的波特率有:9600、115200…… 时间间隔计算:1秒除以波特率得出的时间,例如,波特率为9600的时间间隔为1s / 9600(波特率) = 104us。 这些就是UART对通信协议的一些理解,如果想详细了解请参考:基于STM32之UART串口通信协议(一)详解 - LLLIN000 - 博客园 (cnblogs.com) 二、STM32的USART串口通信(中断)3、要求2、完成一个STM32的USART串口通讯程序,要求: 1)设置波特率为115200,1位停止位,无校验位; 2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。 2、工程的建立在我们前面的学习中已经介绍过两种建立工程的方式,分别是STM32CubeMX生成基础代码和使用大佬的工程模板文件。这里我们还是选择用大佬"洋桃电子"编写好的工程文件来完善即可。 我们要实现的功能是USART串口通信,所以我们也照葫芦画瓢创建一个usart.c文件并添加到我们的Basic文件夹里,然后我们下一步该做什么呢,相信你心中一定有答案了,初始化!接下来我们就来看看我们的代码怎么写。 usart.c:
可以看到咱们的代码中用了 NVIC ,那么这个 NVIC 是个什么玩意儿呢,这就是我们之前说到过的中断,这时候肯定就有小伙伴要问了,我们为什么要用到中断呢,中断的作用是啥呢。首先我们要知道我们的串口发送数据可以用中断方式和扫描方式,那么二者的区别在哪儿呢。在这里我举一个通俗易懂的例子大家就可以明白了。咱们班上有人捡到100块钱,我们把钱交给辅导员希望辅导员找到失主并归还给他。 扫描方式:扫描方式就相当于辅导员找到咱们班然后一个一个问,这钱是不是你的,丢了多少,一个一个排查下去最后找到失主并完成我们的任务(归还财务)。这种方式听起来很傻而且很麻烦,所以接下来我们就要讲到中断的方式啦。 中断方式:辅导员不再主动,而是被动地等着失主自己去办公室询问他,确认失主以后归还钱财。是不是觉得这种方式才是我们的惯性思维,好了,相信大家也能了解中断和扫描的却别了吧。 还记得我们上次说过的咱们的板子上TX是PA.9,RX是PA.10吗,所以我们需要做些啥呢,是的,就是要初始化这两个管脚并开启USART功能,配置好我们需要用的管脚以后我们就需要开启中断,设置中断模式并编写中断函数。相信学过51单片机的小伙伴都接触过中断,当咱们的程序收到中断的信号时就会跳到咱们的中断函数中并执行中断函数,咱们这次需要完成的功能是串口通信,所以咱们的中断信号是接收完成或者是接收错误,大家可以看看上面的注释,也可以参考一下:浅谈USART_RX_STA各位的描述以及是如何实现数据接收的_JackCrum的博客-CSDN博客 好了,说了这么多,既然咱们有了usart.c文件就要有一个usart.h文件来声明咱们刚刚定义的函数,然后方便我们在main.c文件中调用,那么现在我们就来创建这个文件吧。 usart.h:
这个文件里装的都是一些函数声明以及一些变量的定义。现在俺们就需要把这两个文件保存并添加进俺们的Basic文件夹里啦,上次我忘了说如何将.h文件添加进咱们的工程中,有的小伙伴就向我反应咱们的编译有问题,今天我就来教教大家如何将.h文件添加进来。 首先咱们还是点击“仙女棒”,然后选择 C/C++?。 看到下面有个路径选择没有(Include Paths),?咱们点击后面的省略号。 ?可以看到此时我们就需要选择路径了,我们只需要点击添加并找到我们放.h的文件夹添加进来就OK啦。 在介绍完我们的usart文件之后,我们再来讲讲我们的main.c文件该如何编写,相信大家现在都知道咱们的第一步是啥啦,没错,就是调用我们的初始化函数,然后剩下的只需要将咱们的串口输出函数写在while循环中就OK啦。 main.c:
大家可以看到我们将波特率设置为了题目要求的“115200”?,这也可以根据大家的需求来更改也是没问题的,但是在这里我们一定要记住这个数字,因为后面要用到。各位小伙伴一定发现了一个问题,这里咱们的串口输出用的函数是“printf”,是不是大家对这个函数格外亲切呀。在这里我要说的是,我们尤其要注意这个“printf”函数,当我们只开启一个串口通信时,我们可以直接用“printf”函数输出到我们的串口助手界面。但是如果我们要使用多个串口时,咱们的芯片就无法区分我们要输出的是哪个了,所以这个时候我们就要自己创建每个串口对应的输出函数了。但是在这里我们只开启了USART1,所以可以直接用“printf”函数就足够啦。 现在我们编译并运行咱们的程序,准备好烧录进咱们的板子中,烧录过程如果还有不清楚的小伙伴可以参考我之前的博客(25条消息) 用STM32F103C8T6制作流水灯_txmnQAQ的博客-CSDN博客,由于我们这次实现的功能不像之前的流水灯能通过咱们的LED直接表现出来,我们要借助一定的工具才能观察到我们的实验结果。 三、建立STM32与PC之间的通信基础在我们之前的学习中就已经建立过板子与我们的PC之间的通信了,也许你还没反应过来,但是这是我们已经做过的事情啦。仔细回想一下我们是怎样将USB-TTL与板子连接并且烧录程序的呢,实际上这就是一种通信连接啊,将板子的发送接到PC的接收,板子的接收接到PC的发送。只是我们之前没有实现UASAT串口发送功能而已。 1、串口助手的使用所以我们现在暂时不要动烧录时的接线,咱们直接打开咱们的串口助手。(我这里用的是“洋桃电子”家的串口助手,我将它放入百度网盘供大家下载。 链接:https://pan.baidu.com/s/1QsM4UWR557wzmJqYCL2hcw? 咱们现在打开安装好的串口助手,如下图: 端口号我们可以参考咱们FlyMCU中烧录程序那个端口,我的是COM4端口,大家根据自己的来。是否还记得之前程序编写的时候我让大家记得波特率为 115200 ,我说后面咱们要用的,现在就派上用场啦?。然后我们是在PC上接收来自板子上的“hello windows”,所以我们选择接受模式中的“字符”,设置完成后如下图: 2、效果呈现现在我们只需要最后一步,打开端口,神奇的事情就会发生啦! 咱们的对话框中会间隔一秒发送一个“hello windows”?,咱们本次实验就完成啦!
?参考资料:(25条消息) 浅谈USART_RX_STA各位的描述以及是如何实现数据接收的_JackCrum的博客-CSDN博客 基于STM32之UART串口通信协议(一)详解 - LLLIN000 - 博客园 (cnblogs.com) 百度网盘链接: 链接:https://pan.baidu.com/s/1QsM4UWR557wzmJqYCL2hcw? |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:47:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |