STM32简单串口通信(HAL)

一、实验原理准备

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

1.1、RS-232标准

串口通信接口标准主要有RS-232、RS-422、RS-485。RS是推荐标准的缩写,232为标识号。RS232可实现全双工通信,最大传送距离为15米,最高速率为20kbps。RS-232是对电气特性以及物理特性的规定,只作用于数据的传输通路上,它并不内含对数据的处理方式。

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

串口的4种电气标准比较表

比较项TTLRS232RS422RS485
信号类型电平信号电平信号,负逻辑差分信号差分信号
电压范围0~3.3v/5.0v+/-15v-0.25v~+6v-7v~+12v
抗干扰性较强
传输距离1m10m1.2Km1.2Km
传输带宽100Kb/s100Kb/s10Mb/s10Mb/s
负载个数111032
传输模式全双工,点对点全双工,点对点全双工,点对点半双工,多对多
导线根数3342

1.3、USB/TTL转232模块

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

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

二、连续发送“hello windows!”

2.1、创建工程及配置

先选择你的芯片类型然后进行配置(此处省略选择过程,只展示配置过程)

2.1.1 RCC配置

在这里插入图片描述

2.1.2 时钟配置

配置最大时钟为72MHz,APB2为72MHz,APB1为36MHz
在这里插入图片描述

2.1.3 串口配置

在这里插入图片描述

2.1.4 串口引脚参数设置

在这里插入图片描述
最后配置工程名称,保存位置,编译器等,生成工程即可

2.2、添加程序

while (1)
  {
    /* USER CODE END WHILE */
	  HAL_UART_Transmit(&huart1, "hello windows!\r\n",16,100);//发送hello windows!
	  HAL_Delay(2000);//延时2秒
    /* USER CODE BEGIN 3 */
  }

这里我直接使用的hello windows字符串,你还可以先定义变量指向字符串

//在private variable处定义,或者也可以在main中定义,与c差不多
uint8_t message[]="hello windows!\r\n";

//在while中代码
while (1)
  {
    /* USER CODE END WHILE */
	  HAL_UART_Transmit(&huart1, message,16,100);
	  HAL_Delay(2000);
    /* USER CODE BEGIN 3 */
  }

2.3、烧录运行结果

在这里插入图片描述
在这里插入图片描述

三、扩展(使用字符控制)

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

3.1、创建工程及配置

创建工程步骤大致一样,只是还需要打开串口中断,接着上面的步骤即可

3.1.1 开启串口USART1的中断

在这里插入图片描述

3.1.2 选择NVIC中断优先级分组

在这里插入图片描述
最后配置工程名称,保存位置,编译器等,生成工程即可

3.2 添加程序

程序运行大致流程:
在while循环中使用串口接收中断函数接收数据,如果接收完成(数据位满足)则进入接收完成回调函数中,判断串口类型以及接收字符是否为#或者*,如果为#则将接收标志置为1,即接受到#,需要将hello windows暂停。如果接收到的是*,则将接受标志置位0,表示没有接收到#,不会暂停hello windows的输出。其实回调函数中只改变flag的值,在while循环中,根据flag的值进行判断是否继续输出
代码如下:

// 添加定义
#define LENGTH 1 //接收字符数目
uint8_t RxBuffer[LENGTH];//接收数据
uint8_t RxFlag = 0; //0表示没有收到`#`收到`*`,1表示收到了`#`

//main.c中while循环
HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); //使能接收中断
while (1)
  {
    /* USER CODE END WHILE */
	  if(RxFlag==0){
		  HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16, 0xffff);
		  HAL_Delay(1000);
	  }
    /* USER CODE BEGIN 3 */
  }
//接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
	if(huart->Instance == USART1 && *RxBuffer == '#'){
		RxFlag = 1;
	}else if (huart->Instance == USART1 && *RxBuffer == '*'){
		RxFlag = 0;
	}
	HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); //因为它有效性只有一次,所以在接收完成后需要重新使能
}

3.3、烧录运行

在这里插入图片描述
在这里插入图片描述

四、仿真逻辑分析仪功能观察串口输出波形

hello windows!\r\n一共有16个字符,所以波形图
在这里插入图片描述
一个char型为8bit,起始位1bit,结束未1bit,故一个数据帧有10bit。
在这里插入图片描述
由上图可以看出,传递10bit需要86.93056微秒,那么1bit就需要8.693056微秒,波特率大约为115034HZ。

参考资料:
https://blog.csdn.net/qq_45945548/article/details/121720676
https://blog.csdn.net/m0_70536801/article/details/134042199
https://blog.csdn.net/ScilogyHunter/article/details/107135703

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!关于STM32的USART串口通信,您可以使用HAL库来实现。HAL库提供了一系列的函数,可以方便地进行串口的初始化、发送和接收操作。 首先,您需要在CubeMX中配置串口相关的引脚和参数。然后在代码中包含相应的头文件,例如"stm32f4xx_hal.h"。 接下来,您可以使用HAL_UART_Init函数初始化串口,并设置波特率、数据位、停止位等参数。例如,以下代码将USART1初始化为波特率为9600,数据位为8位,无校验位,停止位为1位: ```c UART_HandleTypeDef huart1; void USART1_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; 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_Transmit函数发送数据。例如,以下代码将发送一个字节的数据到USART1: ```c uint8_t data = 0x55; HAL_UART_Transmit(&huart1, &data, 1, HAL_MAX_DELAY); ``` 最后,您可以使用HAL_UART_Receive函数接收数据。例如,以下代码将接收USART1收到的数据,并存储到一个缓冲区中: ```c uint8_t buffer[10]; HAL_UART_Receive(&huart1, buffer, 10, HAL_MAX_DELAY); ``` 这样,您就可以通过HAL库来实现USART串口通信了。当然,还有其他更多的函数和功能可以使用,您可以参考HAL库的文档或示例代码进行更详细的了解和使用。希望对您有帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值