ESE模块7 UART 通用异步收发传输器
本节讨论了与PC电脑的通信。对于许多嵌入式系统来说,与其他系统通信是必不可少的。为此,有各种不同的通信方式。其中一种最重要的通信方式是老式的串行接口。我们中的年长者还记得它,我们以前用它连接鼠标。对于这种通信接口,有不同的名称。根据所处的环境,串行接口可能被称为 COM、TTY、RS232、RS485、UART、USART、USIC 或 SERCOM。
在我们的微控制器中,它被称为 UART(通用异步接收器/发送器)或 USART(通用同步异步接收器/发送器)。在个人电脑上,尽管我们使用 USB 接口,但它会出现为 COM 端口。您可以在设备管理器的端口(COM 和 LPT)下查看它。这得益于一个小型控制器,称为 USB-UART 桥接器。设备管理器中的 COM 端口仅通过相应的设备驱动程序进行模拟。人们也称之为虚拟 COM 端口(VCP)。我们将使用此 COM 端口进行本次的学习。
任务
通过UART将数据发送到PC。 接收到的数据显示在终端程序中。 通过将计数器加1来生成更改数据 并发送此值。
解决方案要求:
- 数据传输速度19200波特
- 针脚A9 / A10上的USB UART桥(已连接)
- 使用8位计数器
- 每秒最多发送100个值
准备工作
进行以下准备工作:
- 创建一个新的类图
- 目标语言ARM C ++
- 目标平台STM32F042 mySTM32板灯HAL
- 为PEC应用程序(XMC,STM32,AVR)的下载图模板应用程序基本结构
- 为STM32F0分配驱动程序包
- (可选)stm32F042_48Mhz
解决路径
任务是将 UART 配置为在引脚 A9/A10 上以 19200 波特率进行通信,并通过该接口向个人电脑发送数据。USB-UART 桥接器与控制器的 A9 和 A10 引脚的连接在板上已经固定安装好了。您已经一直在使用它们通过引导加载程序进行编程。
对于接收串行数据,人们使用所谓的终端。在较早版本的 Windows 操作系统中,您可以在“附件”下找到一个叫做 HyperTerminal 的终端程序。该程序来自于一种使用调制解调器通过普通的模拟电话网络在计算机之间建立通信连接的时代。然后互联网出现了,HyperTerminal 作为操作系统组件就消失了。
对于嵌入式开发人员来说,这样的程序仍然很重要,以便与其微控制器进行通信。因此,在 SiSy 中有一个特殊的终端程序,名为 ControlCenter。我们将 UART 连接到我们的终端作为一个新的系统模块进行抽象,如下所示:
PEC 框架提供了一个名为 PecUart 的模板,用于通过串行接口发送和接收数据,并针对不同的传输速率提供了配置。
我们需要UART软件包中的PecUart和baudrate19200作为配置的库模块。数据传输的配置必须在PC终端和微控制器上完全匹配。 如果设置不一致,则数据传输就会出错。
我们使用以下配置进行数据传输:
- 19200波特
- 8数据位(默认)
- 无奇偶校验(默认)
- 1停止位(默认)
此解决方案的设计图如下所示:
注意:UART =始终以BAUD配置数据传输速度
实现
实现应包括上述设计图中描述的元素,和正确添加UART配置。ARM控制器具有总线矩阵。这意味着如UART之类的内部组件不会一直连接到相应的引脚,但硬件/软件开发人员可以从几种可能的引脚配置中进行选择。相应的信息可以在控制器的文档中找到(数据表,参考手册等)。在开始本教程时,我们建议打印出该参考卡Referenzkarte 放在旁边。现在就需要查看参考卡。请找到相关信息,正确配置UART。
可以通过资源管理器找到uart1portA9_stm32f0库块,也可以点击PecUart [?]上的小问号。
我们要发送到个人电脑的数据是由一个简单的计数器生成的。我们将为这个计数器的变量作为 Controller 类的属性。
在相应的工作步骤之后,类模型应如以下设计图。
现在打上可执行代码。
Controller::onWork():void// continous event from the Mainloop | 来自主循环的连续事件 counter++; terminal.writeByte(counter); waitMs(10);
这段代码的作用是:
1. counter++:这行代码递增计数器变量 `counter` 的值。这个计数器是一个用来生成要发送到个人电脑的数据的简单计数器。
2. terminal.writeByte(counter):这行代码将计数器的当前值作为一个字节发送到终端(或串行接口)。这意味着将计数器的值作为一个字节的数据发送给连接到 UART(串行接口)的个人电脑。
3. waitMs(10):这行代码让程序暂停执行 10 毫秒。是为了控制发送速率,以确保数据发送不会太快而导致接收端无法处理。
比较上下俩种做法。
Controller::onWork():void// continous event from the Mainloop 来自主循环的连续事件 counter++; String txt; txt.format("\n Hallo mySTM32, counter= %d",counter); terminal.writeString(txt); waitMs(10);
这段代码的功能是:
1. counter++;:递增计数器 counter 的值。这个计数器用于追踪发送的消息数量或者作为计数器的一部分,以便生成消息的一部分。
2. String txt;:声明一个名为 txt 的字符串变量,用于存储格式化后的消息。
3. txt.format(“\n Hallo mySTM32, counter= %d”,counter);:将格式化的字符串存储到 txt 中。这一行代码将 “Hallo mySTM32, counter=” 与 counter 的当前值格式化为字符串,并将结果存储在 txt 中。
4. terminal.writeString(txt);:将格式化后的消息通过终端发送出去。这里的 terminal 代表终端,可以使用 writeString 方法来发送字符串。
5. waitMs(10);:等待 10 毫秒。这个延迟可能是为了控制发送消息的速率,或者为了确保消息能够正确地发送和接收。
测试
翻译程序。将可执行程序传送到控制器的程序存储器中。
- 1.创建(编译和链接)
- 2.烧录
- 3.连接…
翻译程序。将可执行程序传输到控制器的程序存储器中,然后启动控制中心ControlCenter工具。
- 1. 创建(编译和链接)
- 2. 烧录
- 3. 工具菜单,ControlCenter
在ControlCenter中设置与板的连接参数。 请注意正确的COM端口和正确的波特率。 COM端口可以在设备管理器中找到。
现在可以从控制器中接收到所需的数据。
总结
- 1.创建并打开类图
- 2.选择用于PEC应用程序的图模板,为STM32F0加载并插入驱动程序包
- 3.在资源管理器/导航器中搜索所需的类,然后将它们拖到图中
- 4.将类和模板组装成组件
- 5.在操作中创建必要的源代码
- 6.在类图中创建并刻录ARM应用程序
- 7.使用PecUart库块
- 8.配置和使用SiSy控制中心
视频总结
练习
将一个按钮添加到系统解决方案作为发送按钮。调整解决方案,使数据传输在按下发送按钮时在100毫秒系统事件 onEvent100ms() 中进行。