这篇文章将详细介绍 串口 发送数据,接受数据。
前言
- 实验开发板:STM32F103C8T6。
- 所需软件:keil5 , cubeMX 。
- 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。
- 实验:串口发送数据点亮 led。
一、串口的基础知识
如果想了解串口的基础知识可以参考我之前的文章:
STM32Cube串口USART发送接收数据
STM32CubeMX串口USART中断发送接收数据
二、cubeMX 配置
- 选择芯片,开始创建工程。
- 设置 仿真。
- 配置时钟,选择 HSE, 高速时钟。
- 设置时钟频率。
直接设置为 最大频率 72 ,然后双击 enter 即可。
- 设置工程的名字,工具链选择 MDK。
- 点击自动生成 .c / .h 文件。
- 这里我使用串口2 ,USART2。然后选择异步模式。
对于 USART2 可以是 同步也可以是异步。而 UART 只可以是 同步。
- 点击 NVIC, 使能中断。
- 设置 相关参数(波特率,数据长度,校验位,停止位)
- 可以看到这里出现了两个 PA2, PA3 引脚,分别是 发送引脚,接收引脚。
- 点击生成即可。
这样就可以生成 keil 的工程文件。
三、自动生成代码解析
使用 cubeMX 生成的 串口代码都放在 usart.c 中。
-
首先还是 先定义一个 串口对象,这是一个结构体。
-
初始化这个结构体中的相关参数。然后调用
HAL_UART_Init(&huart2)
对其初始化。 -
之后自动调转到
HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
执行。 -
__HAL_RCC_USART2_CLK_ENABLE()
; 开启串口 2
由于 PA2, PA3 引脚,所以使用__HAL_RCC_GPIOA_CLK_ENABLE();
使能 gpio 端口。 -
配置引脚:
这里 PA2 作为复用引脚(除了作为串口发送端,可能还具有其他的功能),它的工作模式 是GPIO_MODE_AF_PP复用推挽输出。 -
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0)
设置优先级
HAL_NVIC_EnableIRQ(USART2_IRQn);
使能中断
四、串口发送数据函数
- 发送数据。串口发送数据有 2 种写法。(有无中断)
这里我主要介绍最后一个参数 超时时间 Timeout 。 当使用这个函数 发送数据时,如果超过该时间,则直接返回错误,不再执行该函数。
HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
以中断的方式发送数据。这里就不需要超时时间了。
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
- 接收数据。
- 开启串口中断接收函数:
每次接收到数据后,都要再次开启中断接收函数。这样才可以多次接收数据。
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- 串口中断接收回调函数:
当接收到数据时,就会调用该函数。
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
五、使用串口收发数据点亮 led
这里如果要点亮 led ,要在cubeMX 中配置 led 引脚。
uint8_t rx_buff = 0; // 存放接收的数据
/* 每次接收到数据后都会调用该串口回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart2)
{
if(rx_buff == 0xa1) // 发送 a1 点亮 led
{
printf("LED ON\r\n"); // 使用 printf 发送数据,需重定向 fputc 函数
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
}
else if(rx_buff == 0xa2) // 发送 a2 熄灭 led
{
printf("LED OFF\r\n");
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
}
}
HAL_UART_Receive_IT(&huart2,&rx_buff,1); // 再次开启接收
}
重定向函数:
发送数据,可使用 printf 。
由于 printf 依赖于 fputc 函数
,所以可以重定向 fputc 来实现 printf 串口发送数据。
int fputc(int ch, FILE* f)
{
while(HAL_UART_Transmit(&huart2,(uint8_t*)&ch,sizeof(ch)-1,300) != HAL_OK);
return 0;
}
接收数据可以使用 scanf 。
int fgetc( FILE *f) /* scanf 输入 */
{
char c = 0;
while(HAL_UART_Receive(&huart1, (uint8_t *)&c, 1, 300) != HAL_OK);
return c;
}
总结
下一篇文章为大家介绍 STM32 超声波 模块的使用。
转自:
https://blog.csdn.net/wuyiyu_/article/details/133975425