STM32使用HAL库中断控制串口通信

目录

一、解决的问题

二、串口通讯协议和RS-232的介绍以及USB/TTL转232模块的工作原理

1、 串口协议和RS-232标准:

 (1)串口协议:

(2)RS-232 标准:

 2、RS232电平与TTL电平的区别

 3、USB/TTL转232“模块(CH340芯片为例)

 (1)基本原理:

 (2)CH340模块介绍:

 三、搭建STM32开发环境(HAL库环境)

四、利用HAL库新建一个工程 

 五、完善keil5工程

  (1)本工程中几个函数简介:

(2)编写代码思路:

(3)完善keil5工程代码:

六、电路连接与烧录运行

 1、电路连接:

2、 USB转TTL环境配置:

 3、下载烧录软件与串口通信软件:

4、keil5工程里面对于USB转TTL的配置:

 5、编译生产hex文件,用于后面的烧录步骤:

 6、烧录:

 7、配置XCOM,打开XCOM软件,按下图所示进行配置:

 8、运行结果演示:

 七、仿真调试

1、进入keil5仿真:

 2、开始仿真:

​编辑​编辑 3、仿真结果分析:

八、总结

九、参考文献


一、解决的问题

       1、安装 stm32CubeMX,配合Keil,使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,完成下列任务:

1)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。

2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;

      2、在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。

二、串口通讯协议和RS-232的介绍以及USB/TTL转232模块的工作原理

1、 串口协议和RS-232标准:

 (1)串口协议:

      串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单、便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通 讯方式输出调试信息。
       在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。

名称组成作用
物理层具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输
协议层规定通讯逻辑,统一收发双方的数据打包、解包标准。

在串口通讯的物理层有很多标准及变种,下面主要讲解 RS-232 标准!

(2)RS-232 标准:

RS-232 标准主要规定了信号的用途通讯接口以及信号的电平标准。 

      在上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号,才能实现通讯。    

 2、RS232电平与TTL电平的区别

根据通讯使用的电平标准不同,串口通讯可分为 TTL标准和 RS-232标准:

标准名称逻辑1逻辑0
TLL2.4V~5V0~0.5V
RS-232-15V~3V+3V~+15V

 从表格中不难看出,两种标准划分的逻辑电压不同。在电子电路中常使用 TTL 的电平标准,理想状态下,使用 5V 表示二进制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑 1,+15V 表示逻辑 0。

 下图为用RS232与TTL电平校准表示同一个信号时的对比:

 3、USB/TTL转232“模块(CH340芯片为例)

 (1)基本原理:

      USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备。

      USB主机检测到USB转串口设备插入后,首先会对设备复位,然后开始USB枚举过程。USB枚举时过程会获取设备描述符、配置描述符、接口描述符等。描述符中会包含USB设备的厂商ID,设备ID和Class类别等信息。操作系统会根据该信息为设备匹配相应的USB设备驱动。

      USB虚拟串口的实现在系统上依赖于USB转串口驱动,一般由厂家直接提供,也可以使用操作系统自带的CDC类串口驱动等。驱动主要分为2个功能,其一注册USB设备驱动,完成对USB设备的控制与数据通讯,其二注册串口驱动,为串口应用层提供相应的实现方法。

串口收发对应的驱动数据流向一览表:

发送or接收数据流向
串口发送串口应用发送数据→USB串口驱动获取数据→驱动将数据经过USB通道发送给USB串口设备→USB串口设备接收到数据通过串口发送
串口接收USB串口设备接收串口数据→将串口数据经过USB打包后上传给USB主机→USB串口驱动获取到通过USB上传的串口数据→驱动将数据保存在串口缓冲区提供给串口应用读取

 (2)CH340模块介绍:

CH340电路与实物图:

TXD:发送端,一般表示为自己的发送端,正常通信必须接另一个设备的RXD。

RXD:接收端,一般表示为自己的接收端,正常通信必须接另一个设备的TXD。

正常通信的时候本身的TXD永远接设备的RXD。

 

 USB转TTL串口模块与单片机连接电路图如下所示:

 三、搭建STM32开发环境(HAL库环境)

 请参考我的这篇博客:STM32使用HAL库点亮流水灯-CSDN博客

四、利用HAL库新建一个工程 

   (1)打开STM32CubeMX,在主界面点击:ACCESS TO MCU SELECTOR:

 (2)选择的单片机型号以及点击开始工程项目: 

   (3)配置GPIO:PA0。如果仅仅是完成串口通信的话,这一步可以跳过。但是根据实验要求,为了区分串口通信的开启与关闭,要使用一个LED灯来显示。当串口通信开启(STM32向电脑发送信息)的时候,LED灯亮,当串口通信关闭(STM32停止向电脑发送消息)的时候,LED灯灭。 

 (4)配置USART1,我们使用USART1进行数据传输。在这个界面按下图进行配置。我们对USART1的配置要做的只有两件事:一是选择串口工作模式为异步,二是开启USART1全局中断 

 (5)进入Project Manager(工程管理),进行工程设置点击生成工程与代码:

注意:路径不能包含中文和空格,不然生成的工程文件无法在Keil中打开;

 五、完善keil5工程

  (1)本工程中几个函数简介:

HAL_UART_Receive_IT:

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_int *data, uint16_t Size)

/*
	huart:使用哪个串口进行通信
	data: 一个地址,用于保存接受到的数据
	Size: 接收的数据个数
*/

      在调用此函数后,程序会将对应串口的接收中断开启,当我们向单片机发送数据时会触发这个中断。在触发这个中断后,程序会接收数据到你传入的地址中,会读取Size个数据。读取完成后,关闭接收中断使能。

      由于程序在接收完数据后会关闭接收中断。因此这个函数我们要写在main的死循环中,保证接收中断可以一直开启。

HAL_UART_Transmit_IT:

HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_int *data, uint16_t Size)

/*
	huart:使用哪个串口进行通信
	data: 一个地址,里面是要发送的数据通常是数组
	Size: 发送的数据个数
*/

      使用这个函数开启发送中断,发送寄存器为空时触发中断,将要发送的数据送入发送寄存器并发送。发送完成后关闭中断。在此实验中,我们把它当做普通的发送函数即可。

HAL_GPIO_WritePin:

HAL_GPIO_WritePin(GPIOX,GPIO_PIN_X,GPIO_PIN_STATUS)
/*
	GPIOX:目标GPIO的组号
	GPIO_PIN_X: 目标GPIO的引脚编号 
	GPIO_PIN_STATUS: 引脚状态
*/

使用这个函数修改GPIO_ODR寄存器,将非复用输出的GPIO引脚输出电平设置成自己想要的。 

 HAL_Delay(uint ms):

HAL_Delay(uint ms)

延时ms函数。 

(2)编写代码思路:

main函数中用一个uint8类型的变量,接收发过来的字符(*/#),默认为*
进入死循环,调用HAL_UART_Receive_IT使能接收中断
如果电脑发送了字符,接收变量的值会变
如果接收变量为*,led阴极置低电平,led亮,向电脑发数据“hello windows”
如果接收变量为#,led阴极置高电平,led灭,不向电脑发送数据

(3)完善keil5工程代码:

首先,点击刚刚生成的keil5工程文件,双击main.c文件,然后再main.c中找到图示框住的函数, 接着右击此函数,进入其定义的地方处:

 (2)将图中框住的部分改为SET即可:此步骤是将这个GPIO口设置为高电平,初始时不亮! 

 (3)回到main.c文件中,在main函数里把while(1)那一块替换成如下代码:

uint8_t rcData = '*';
  	while (1)
  	{
  	//接收中断使能
		HAL_UART_Receive_IT(&huart1,&rcData,1);
		if(rcData == '#')
		{//如果接收#
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
		}
		else if(rcData == '*')
		{//如果接收*				 
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
			uint8_t hello[20]="hello world\n";
			HAL_UART_Transmit_IT(&huart1,hello,20);
			HAL_Delay(500);
		}
  	}

六、电路连接与烧录运行

 1、电路连接:

USB转TTL与STM32的连接,参考下图:
 

 PA0——黄灯;

连接好的实物图如下所示:

2、 USB转TTL环境配置:

需要在电脑上安装CH340驱动(USB串口驱动)或者CH341驱动(USB串口驱动):

在网上下载好所需的CH340驱动(USB串口驱动)或者CH341驱动(USB串口驱动),如下图所示:

 点击CH341SER_2.EXE进行安装CH341驱动,会弹出一下弹窗,点击安装,等待安装成功即可:

 3、下载烧录软件与串口通信软件:

烧录软件推荐使用:FLYMCU,如下图所示图样:

串口通信软件推荐使用:XCOM,如下图所示图样:

请自行在网上把这两个软件下载好,为后面的烧录运行做好准备! 

4、keil5工程里面对于USB转TTL的配置:

 5、编译生产hex文件,用于后面的烧录步骤:

 6、烧录:

(1)将USB转TTL插上电脑的USB接口上去,打开刚刚下载好的FLYMCU软件,按照下图所示进行相关配置,其中的第二步就是选择刚刚上一步编译生成的hex文件:

 (2)改变STM32最小系统板子的跳线帽连接方式:BOOTO的跳线帽连接方式由0——>1:

 (3)点击FLYMCU的开始编程(P),接着马上点击STM32最小系统板子的复位键即可完成烧录:

第一步:

第二步:

烧录成功示意图:

烧录完成之后还需要下面的关键一步,把STM32最小系统板子的跳线帽连接方式还原:BOOTO的跳线帽连接方式由1——>0:

 7、配置XCOM,打开XCOM软件,按下图所示进行配置:

 8、运行结果演示:

 打开串口,并且同时点击STM32最小系统板子的复位键即可开始运行:

注:输入“*”:让STM32单片机继续向电脑发送信息;

输入“#”:让STM32单片机停止向电脑发送消息;

 七、仿真调试

1、进入keil5仿真:

(1)点击第一步,Target界面中,选择跟正确的晶振大小,使用8MHz的外部晶振:

(2)接着进行Debug页的设置:  

 (3)点击图示圈住的地方进入仿真调试界面: 

  (4)选择逻辑分析仪: 

 (5)点击Setup设置添加要进行观察的引脚:

 添加引脚信息:添加引脚信息时候,PA脚输入:PORTA,PB脚输入PORTB,PC脚输入PORTC;接着输入".",接着在“.”后面输入对应引脚号,最后回车即可;例如:我这里要输入PA0这个引脚的信息:添加一个引脚,添加一个引脚信息:PORTA.0,最后回车完成添加!!!

 接着对引脚的配置信息进行修改,如下图所示: 

我这里选择的引脚仿真波形对应的颜色为:PA0——红色;

 2、开始仿真:

(1)点击图示圈住的部分,进行仿真  

  (2)仿真结果: 

 3、仿真结果分析:

      下图中的红色波形线表示开始仿真之后PA0一直处于低电平状态,LED黄灯亮,也表示STM32一直在向电脑发送消息。直到电脑发送“#”才会使得PA0上升到高电平状态,LED黄灯灭,STM32停止向电脑发送信息:

      因为PA0被我们设置为用来完成这个功能:当串口通信开启(STM32向电脑发送信息)的时候,LED灯亮,当串口通信关闭(STM32停止向电脑发送消息)的时候,LED灯灭。

      所以由刚刚的分析与图示情况来看,串口PA0的输出波形正确,完全符合本人板子设置与仿真预期的效果,而且通过观察发现PA0时序状态也是正常的,仿真效果非常成功!!!

八、总结

        通过本次实验本人成功入门掌握了STM32基础的中断控制的串口通信,串口通信是一个有趣的实验,做了之后一方面感觉到了自己在STM32的学习上又进步了;另一方面,感受到了在自己的操作与设置之下,电脑与STM32通过串口通信成功进行“对话”,感受真的很不一般咯!希望看完本文章的你也能成功做出来,同时也能体会到我的愉悦感受。完!!!

九、参考文献

1、【精选】【嵌入式05】串口协议+RS-232、485标准+CH430芯片的“USB/TTL转232”-CSDN博客 

2、 stm32使用hal库中断控制串口通信_stm32 hal库串口中断接收_终极末影龙的博客-CSDN博客

3、

HAL库中断方式进行串口通信_醉意丶千层梦的博客-CSDN博客

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的 STM32 串口接收中断例程,使用的是 HAL 库: ```c #include "stm32f1xx_hal.h" #include <string.h> UART_HandleTypeDef huart1; char rx_buffer[50]; uint8_t rx_data; int rx_count = 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (rx_data == '\n') // 如果接收到换行符,则表示接收结束 { rx_buffer[rx_count] = '\0'; // 末尾加上字符串结束符 rx_count = 0; // 接收计数器清零 // 处理接收到的数据 // ... } else // 如果没有接收完成,则继续接收下一个字符 { rx_buffer[rx_count++] = rx_data; } HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 重新开启接收中断 } int main(void) { HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); HAL_UART_Receive_IT(&huart1, &rx_data, 1); // 开启接收中断 while (1) { // 主程序循环 } } ``` 在这个例程中,我们使用了 `HAL_UART_RxCpltCallback()` 回调函数来处理接收中断。当接收到一个字符时,我们判断是否为换行符,如果是,则表示接收结束,我们将接收到的数据进行处理。如果不是,则继续接收下一个字符,并将接收计数器加一。最后,我们重新开启接收中断。在 `main()` 函数中,我们调用了 `HAL_UART_Receive_IT()` 函数来开启接收中断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值