一、stmCubeMX串口通信的步骤
1、新建一个文件,选择自己的芯片
2、配置时钟
3、配置串口
串口的模式解析可以跳转到以下文章查看
stmCubemx——配置串口时的几种模式-CSDN博客在STM32CubeMX中配置串口(USART或UART)时,可以设置多种模式来满足不同的通信需求。https://blog.csdn.net/weixin_54210362/article/details/142490631?spm=1001.2014.3001.5502
示例配置
假设你需要配置一个异步模式的USART1,波特率为115200,8个数据位,1个停止位,无奇偶校验,并启用中断:
- 选择USART1。
- 设置模式为异步模式。
- 设置波特率为115200。
- 设置数据位为8。
- 设置停止位为1。
- 设置奇偶校验为无。
- 启用中断:在“NVIC Settings”中勾选相应的中断。
-
4、配置时钟树
5、命名,保存项目
6、选择生成文件配置
二、生成的keil文件处理过程
1、usart.c
#include "stdio.h"
extern UART_HandleTypeDef huart1; //声明串口
/*** 函数功能: 重定向c库函数printf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说 明:无*/
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;
}/*** 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说 明:无*/
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart1, &ch, 1, 0xffff);return ch;}
2、main.c文件
命名一个数组,用来接收存储数据
#include "string.h"//需要额外包含的头文件/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#define RXBUFFERSIZE 256
char RxBuffer[RXBUFFERSIZE];
uint8_t aRxBuffer; //接收中断缓冲
uint8_t Uart1_Rx_Cnt = 0; //接收缓冲计数
想要验证输出,直接main函数中的循环里面,用printf串口打印自己想要输出的内容就可以
下面的代码是用来实现串口收发功能的,直接定义在main.c文件中就可以
在main函数的循环以外线调用一次接收中断函数
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);//接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_UART_TxCpltCallback could be implemented in the user file*/if(Uart1_Rx_Cnt >= 255) //溢出判断{Uart1_Rx_Cnt = 0;memset(RxBuffer,0x00,sizeof(RxBuffer));HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF); }else{RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存if(HAL_UART_GetState(&huart1) != HAL_UART_STATE_BUSY_RX) // 检查UART状态,判断是否接收完成{HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束Uart1_Rx_Cnt = 0;memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}