当前位置: 首页 > news >正文

STM32CubeMX 配置串口通信 HAL库

一、STM32CubeMX 配置串口

 

 

 

 

每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

 

二、重写fputc函数

​
#include <stdio.h>#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__*//*******************************************************************@brief  Retargets the C library printf  function to the USART.*@param  None*@retval None******************************************************************/PUTCHAR_PROTOTYPE{HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xFFFF);return ch;}​

三、配置接收中断函数

​
#define RXBUFFERSIZE    1                       /* 缓存大小 */
uint8_t  g_usart_rx_buf[200];  //接收缓冲,最大200个字节
uint16_t g_usart_rx_len;   	   //接收长度
uint8_t g_usart_rx_flag=0;	   //接收完成标志
uint8_t g_rx_buffer[RXBUFFERSIZE];       /* HAL库USART接收Buffer */在串口初始化函数中使能接收中断
/* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{  if(huart->Instance == USART1)     {g_usart_rx_buf[g_usart_rx_len] = g_rx_buffer[0] ;g_usart_rx_len++;if(g_rx_buffer[0]==0x0a){g_usart_rx_flag=1;}HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);}
}​

四、串口空闲中断接收数据

__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//空闲中断
#define USART1_MAX_RECV_LEN		1000				//最大接收缓存字节数
char USART1_RX_BUF[USART1_MAX_RECV_LEN]; 				//接收缓冲,最大USART3_MAX_RECV_LEN个字节
unsigned short USART1_RX_STA=0;   	/* USER CODE BEGIN 1 */
void USART1_IRQHandler(void)
{uint8_t res = 0;//接收中断if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET){HAL_UART_Receive(&huart1,&res,1,1000);//将数据放入缓冲区if( (USART1_RX_STA&0x7fff) < USART1_MAX_RECV_LEN){USART1_RX_BUF[USART1_RX_STA] = res;USART1_RX_STA++;}__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);}//空闲中断if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET){//一帧数据接收完成//USART1_IdleCallback(USART1_RX_BUF,USART1_RX_STA&0x7fff);USART1_RX_BUF[ USART1_RX_STA &0x7fff] = 0;USART1_RX_STA |= 1 << 15;  __HAL_UART_CLEAR_IDLEFLAG(&huart1);}
}
	if(USART1_RX_STA& 0x8000){printf("%s\r\n",USART1_RX_BUF);USART1_RX_STA=0;}

五、串口乱码原因之一

        乱码一般是配置串口波特率和上位机串口波特率不一致所致,如果两者一致,则说明系统时钟有问题,比如下面的外部晶振不匹配

         开发板上外部时钟的晶振与代码中的外部时钟的晶振不一致,使用cubemx配置时钟时要格外注意,选好芯片之后再看外部晶振是啥,不然随便设置可能乱码

http://www.lryc.cn/news/428633.html

相关文章:

  • GitHub的未来:在微软领导下保持独立与AI发展的平衡
  • RGB与YUV格式详解
  • JS获取当前浏览器名称
  • 学习计算机网络(五)——ICMP协议
  • request.getRequestURI()与request.getRequestURL()的区别
  • 3154. 到达第 K 级台阶的方案数(24.8.20)
  • 如何使用docker打包后端项目并部署到阿里云k8s集群上
  • ES6中解构的使用
  • 拖拽式报表设计器优点好 实现流程化办公就靠它!
  • Spring项目:文字花园(四)
  • Web开发:ORM框架之Freesql的入门和技巧使用小结
  • 软件工程(4)面向对象方法:面向对象软件工程OOSE与案例实践
  • 【数据结构篇】~链表算法题1(含快慢指针的解析)
  • 洛谷 P1135 奇怪的电梯
  • vue使用axios请求后端数据
  • 目标检测 | yolov10 原理和介绍
  • 基于Springboot 和Vue 的高校宿舍管理系统源码
  • 3:2比例的程序员专业显示器,效率提升显著,摸鱼时间又多了
  • vue3 cascader省市区三级联动如何指定字段,如何根据id查到对应的名字
  • 算法4:前缀和(上)
  • 美国政府紧急应对三星Galaxy手机安全漏洞
  • 看 逆行人生
  • 0819、0820梳理及一些面试题梳理
  • HttpUtils工具类(一)常见的HttpUtils工具类及如何自定义java的http连接池
  • 使用 Lombok 遇到一个问题
  • Linux基础环境开发工具gcc/g++ make/Makefile
  • ES 模糊查询 wildcard 的替代方案探索
  • Linux安装MQTT 服务器(图文教程)
  • 【TCP】核心机制:延时应答、捎带应答和面向字节流
  • 题解:AT_abc352_e [ABC352E] Clique Connect