基于HAL库的串口通信(使用中断收发数据)

本文介绍了STM32如何通过了解串口协议、RS-232标准和TTL电平差异,利用CH340芯片实现USB转TTL,以及使用HAL库设置USART1的通信参数。重点讲述了如何使用中断和DMA方式来实现串口发送与接收,包括中断回调处理和中断触发条件。
摘要由CSDN通过智能技术生成

一、主要任务

了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。 使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,分别采用中断方式、DMA方式完成下列任务:

STM32系统给上位机(win10)连续发送“hello windows!”;当上位机给stm32发送字符“stop”后,stm32暂停发送“hello windows!”;发送一个字符“start”后,stm32继续发送;

二、关于串口

2.1串口协议

通用异步收发器UART是一种串行、异步、全双工的通信协议,将所需传输的数据一位接一位的传输,在USRT通讯
协议中信号线上的状态为高电平代表‘1’,低电平代表‘0’。其特点是通信线路简单,只要一对传输线就可以实现双向通信,大大降低成本,但传输速度较慢。
串口协议用于与其他模块之间的信息交互,包含接收模块和发送模块,信号传输线上根据波特率完成码元的接收和发送,因而接收模块主要完成串并转换,串并转换是接收和发送模块必备的基本功能,发送模块完成串并转换,接收模块完成串并转换
在这里插入图片描述

2.2RS-232标准

串口通信的物理层有很多标准及变种,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。
使用RS-232标准的串口设备间常见的通讯结构如下:
在这里插入图片描述
上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。

2.3TTL标准与RS-232标准的区别

下图为TTL电平标准与RS232电平标准
在这里插入图片描述
常见的电子电路中使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1,+15V表示逻辑0。在表示同一个信号的RS232与TTL电平的对比图:
在这里插入图片描述
由于控制器一般使用TTL电平标准,所以常常会使用MA3232芯片对TTL及RS-22电平的信号进行相互转换。

2.4USB转TTL原理

  • 串口发送

串口应用发送数据->USB串口驱动获取数据->驱动将数据经过USB通道发送给USB串口设备->USB串口设备接收到数据通过串口发送

  • 串口接收

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

  • USB转串口CH340接线

下图是USB转串口模块的一些功能模块的标示,USB转串口电路板背后还预留了一些全信号输出的接口,可以将电线直接焊接在这些引脚上来使用预留的功能
在这里插入图片描述下图是对USB转串口模块的引脚标示
在这里插入图片描述

三、使用中断实现串口发送和接受

3.1安装CH340驱动

链接:https://pan.baidu.com/s/1tSoIaN99xB_tZRAGNaxIjg?pwd=1i1y
提取码:1i1y
进入链接,点击.exe应用程序,再点击安装。跳出“驱动预安装成功”即可。打开电脑的控制管理器,在端口中看到有COM端口出现,说明安装成功。
在这里插入图片描述

3.2使用HAL库生成项目

选择STM32F103C8T6芯片
在这里插入图片描述
配置RCC
在这里插入图片描述
配置SRS
在这里插入图片描述
配置串口,并选择异步,可以看到串口的相关参数,波特率为115200,1位停止位,无检验位
在这里插入图片描述
在NVIC中勾选出串口1即USART1在这里插入图片描述
为项目命名,并选择MDK-ARM,最后将项目导出到Keil 在这里插入图片描述

3.3编写程序

重定义printf()函数,之后可以直接printf输出

命令	HAL_UART_Transmit (&huart1,(uint8_t *)&ch,1,100)
表示从发送信号,参数:
第一个参数输出的相应串口
第二个参数表示发送的信号的存储地址
第三个参数表示发送的字符个数
第四个参数是发送超时时间,单位为ms

具体实现代码:

#include "stdio.h"	
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	HAL_UART_Transmit (&huart1,(uint8_t *)&ch,1,100);	 
	return ch;
}
#endif 

使用中断实现串口

	其中命令:HAL_UART_Receive_IT(&huart1,(uint8_t *)&aRxBuffer,1)
表示在串口接收信号,参数:
第一个参数输入相应串口
第二个参数表示接收的参数的存储地址
第三个参数表示接收的字符个数
第四个参数是接收超时时间,单位为ms

中断实现串口的具体流程,这里表示如果接收到的信号为“*”则开始发送“hello world!”,如果接收的信号为“#”,则停止发送

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Receive_IT(&huart1,(uint8_t *)&aRxBuffer,1);
	if(huart->Instance == USART1)
	{
	switch(aRxBuffer)
	{
		case '#':flag=0;break;
		case '*':flag=1;break;
	}
}
}

main.c函数内容:

while (1)
  {
    printf("hello windows\r\n");
  }

3.4硬件实现

先在Flymcu上进行烧录,烧录成功
在这里插入图片描述

之后进入串口调试助手,波特率设置为115200,停止位1为,数据为8为,无校验位,输入“*”开始发送
在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32 HAL库提供了一种使用DMA和空闲中断(IDLE)来实现不定长数据接收的方法。首先,你需要下载并安装串口调试助手,然后将STM32连接到计算机上。使用串口调试助手设置串口号和波特率等参数。接下来,你需要在STM32上配置USART1,并编写一个接收字符串的函数。当STM32接收到字符"stop stm32!"时,停止持续发送"hello windows!";当接收到字符"go stm32!"时,持续发送"hello windows!"。你可以参考STM32 HAL库中的示例代码来实现这个功能。不过要注意,这个过程涉及到硬件和软件的配置和编程,所以你需要准备好相应的硬件和软件材料,包括STM32F103C8T6最小开发版、CH340USB转TTL模块、杜邦线、面包板、LED灯等。软件方面,你需要安装KEIL5、STM32CubeMX、FlyMcu和FireTools等软件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [stm32使用HAL库配置串口中断收发数据(保姆级教程)](https://blog.csdn.net/qq_52062938/article/details/130494097)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [STM32 HAL库串口+DMA空闲中断接收不定长数据](https://download.csdn.net/download/chenyongfeng123/13087603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [stm32使用hal库中断控制串口通信](https://blog.csdn.net/weixin_54435584/article/details/127468012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值