STM32串口通信入门

一. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。

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

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

2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;
三. 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
1:串口协议
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单、便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通 讯方式输出调试信息。
在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层
2:RS-232标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(EIA)联合贝尔系统公司、调制解调厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。
TL电平标准

TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。

RS232标准

在TXD和RXD数据线上:
  (1)逻辑1为-3~-15V的电压
  (2)逻辑0为3~15V的电压
在RTS、CTS、DSR、DTR和DCD等控制线上:
  (1)信号有效(ON状态)为3~15V的电压
  (2)信号无效(OFF状态)为-3~-15V的电压
这是由通信协议RS-232规定的。
RS-232:标准串口,最常用的一种串行通讯接口。有三种类型(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。
3:USB/TTL转232“模块
USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备。
USB虚拟串口的实现在系统上依赖于USB转串口驱动,一般由厂家直接提供,也可以使用操作系统自带的CDC类串口驱动等。驱动主要分为2个功能,其一注册USB设备驱动,完成对USB设备的控制与数据通讯,其二注册串口驱动,为串口应用层提供相应的实现方法。
STM32CubeMX实现串口通信
配置STM32CubeMX

设置串口。这里选择USART1。串口配置的引脚为PA9、PA10。并设置MODE为 异步通信(Asynchronous),以及参数设置:波特率为115200 Bits/s,传输数据长度为8Bit,奇偶检验无,停止位1。
在这里插入图片描述
keil工程中的几个函数

UART函数库介绍

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_int *data, uint16_t Size)
 
/*
	huart:使用哪个串口进行通信
	data: 一个地址,用于保存接受到的数据
	Size: 接收的数据个数`在这里插入代码片`
*/

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

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

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

代码编写
在main.c文件的while循环中添加如下代码:

while (1)
{
/* USER CODE END WHILE /
/
USER CODE BEGIN 3 */
//添加下面两行代码
HAL_UART_Transmit(&huart1, (uint8_t *)“hello windows!\r\n”, 16 , 0xffff);
HAL_Delay(1000); //延时1s
}

点击Code Generator 勾选第二个方框中的第一项,即可生成keil工程文件,如下

在这里插入图片描述
烧录过程:
打开flymcu软件,将编译时生成的hex文件烧录上去
在这里插入图片描述
点击编译烧录完成
在这里插入图片描述

效果图

在这里插入图片描述
STM32CubeMX实现串口中断通信
下面介绍使用中断来实现上位机控制核心板的数据发送。具体目标:当上位机给stm32发送一个字符“#”后,核心板暂停发送“hello windows!”;发送一个字符“*****”后,核心板继续发送。

配置STM32CubeMX

该任务只是在前面串口通信的基础上,多了个开启串口中断使能。在这里插入图片描述

串口中断函数:

HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数
HAL_UART_ErrorCallback(); // 串口接收错误函数

代码编写

在main.c文件的main函数外部定义如下变量:

#define LENGTH 1     //接收缓冲区大小
uint8_t	RxBuffer[LENGTH];   //接收缓冲区 
uint8_t RxFlag = 0;       //接收完成标志;0表示接受未完成,1表示接收完成

在main函数外部定义中断回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1 && *RxBuffer == '#') // 发生接收中断的串口为USART1且接收到的字符为'#'
	{
		RxFlag = 1; // 停止发送
	} else if (huart->Instance == USART1 && *RxBuffer == '*')  // 接收到的字符为'*'
    {
		RxFlag = 0; // 继续发送
	}
}

在while循环内添加代码:

while (1)
{
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,LENGTH); //使能接收中断
    if(RxFlag == 0) // 如果是0,才发送
    {
        HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
        HAL_Delay(1000);  //延时1s
    }
}

实际效果

如图,程序一开始,核心板每隔1秒给上位机发送“hello windows!”。当上位机给stm32发送一个字符“#”后,核心板暂停发送;发送一个字符“*****”后,核心板继续发送。

在这里插入图片描述
仿真实现
点击魔法棒,按如下所示配置
在这里插入图片描述
最终仿真结果如下在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值