二维码网站建设源码,工程项目管理系统,舆情信息,山东省建设从业人员管理系统入口这篇文章将详细介绍 串口 发送数据#xff0c;接受数据。 文章目录 前言一、串口的基础知识二、cubeMX 配置三、自动生成代码解析四、串口发送数据函数五、使用串口收发数据点亮 led重定向函数#xff1a; 总结 前言
实验开发板#xff1a;STM32F103C8T6。所需软件#xf… 这篇文章将详细介绍 串口 发送数据接受数据。 文章目录 前言一、串口的基础知识二、cubeMX 配置三、自动生成代码解析四、串口发送数据函数五、使用串口收发数据点亮 led重定向函数 总结 前言
实验开发板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 超声波 模块的使用。