STM32 Cubemx配置串口收发

文章目录

前言

最近学到了串口收发,简单记录一下注意事项。

注意事项

Cubemx配置

以使用USART1为例。

USART1需配置成异步工作模式Asynchronous

并且需要使能NVIC

printf重定向

我偏向于在stm32f1xx_it.c文件中对printf进行重定向,重定向函数如下。

cpp 复制代码
int fputc(int ch,FILE * fp)
{
	HAL_UART_Transmit(&huart1,(uint8_t * )&ch,1,0xffff);
	return ch;
}

同时需包含头文件路径#include "stdio.h"

修改工程属性

在工程属性Target下,勾选Use MicroLIB

至此,可以由printf语句经USART1发送数据了。

修改源码

  1. 添加变量定义
cpp 复制代码
/* USER CODE BEGIN Private defines */
#define USART_REC_LEN 200
#define RXBUFFERSIZE 1
extern	uint16_t	USART_RX_STA;  
extern	uint8_t		USART_RX_BUF[USART_REC_LEN];
extern	uint8_t		aRxBuffer[RXBUFFERSIZE];
/* USER CODE END Private defines */
  1. 在Cubemx生成的串口初始化函数MX_USART1_UART_Init增加如下语句
cpp 复制代码
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE);
  
  1. 在stm32f1xx_it.c文件中添加如下函数
cpp 复制代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)//
	{
		if((USART_RX_STA&0x8000)==0)//
		{
			if(USART_RX_STA&0x4000)//
			{
				if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//
				else USART_RX_STA|=0x8000;	//
			}
			else //
			{	
				if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//
				}		 
			}
		}
	}
}
  1. 在stm32f1xx_it.c文件中找到USART1_IRQHandler并修改为如下函数:
cpp 复制代码
void USART1_IRQHandler(void)
{
	uint32_t timeout=0;
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	timeout=0;
	while (HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY)//
	{
		timeout++;//
		if(timeout>HAL_MAX_DELAY) break;		

	}

	timeout=0;
	while(HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//Ò>>´Î´¦ÀíÍê³ÉÖ®ºó£¬ÖØÐ¿ªÆôÖжϲ¢ÉèÖÃRxXferCountΪ1
	{
		timeout++; //³¬Ê±´¦Àí
		if(timeout>HAL_MAX_DELAY) break;	
	}
  /* USER CODE END USART1_IRQn 1 */
}

测试函数

cpp 复制代码
while (1)
  {
		uint8_t len=0;
		static uint16_t times = 0;
		printf("%d\r\n",times++);
		HAL_Delay(500);
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
		HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
		if(USART_RX_STA&0x8000)
		{					    
			len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
			printf("\r\nÄú·¢Ë͵ÄÏûϢΪ:\r\n");
			HAL_UART_Transmit(&huart1,(uint8_t*)USART_RX_BUF,len,1000);	//·¢ËͽÓÊÕµ½µÄÊý¾Ý
			while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);		//µÈ´ý·¢ËͽáÊø
			printf("\r\n\r\n");//²åÈë>>>>ÐÐ
			USART_RX_STA=0;
		}
		else
		{
			if(times%20==0)printf("ÇëÊäÈëÊý¾Ý,ÒÔ>>سµ¼ü½áÊø\r\n");  
			if(times%2==0);//LED0=!LED0;//ÉÁ˸LED,ÌáʾϵͳÕýÔÚÔËÐÐ.
		} 
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
相关推荐
智购科技无人售货机工厂店1 分钟前
2026自动售货机大屏交互设计原则:从信息层级到视觉动线的工程实践~YH
运维·python·单片机·嵌入式硬件·自动化·交互
艾芯微科技3 小时前
SKY13370‑374LF|0.5‑6GHz SPDT 射频开关,WLAN/LTE 射频前端实用器件
网络·单片机·嵌入式硬件·集成测试·51单片机
jianqiang.xue4 小时前
收官:从v0.1到“研发新常态“,一套嵌入式智能体的落地与边界
stm32·单片机·物联网·架构·esp32
HUI-4745 小时前
EG1131|SOT23‑6 30V/1.5A 电流模式同步降压 DC‑DC,小体积消费类电源优选
嵌入式硬件·硬件工程
天空'之城5 小时前
单片机基础核心知识点汇总(三十)
单片机·嵌入式硬件
笨笨饿5 小时前
#137_死机恢复现场_Armino平台AP系统swd调试
git·python·stm32·单片机·嵌入式硬件·物联网·vim
linnux领域5 小时前
面包板供电“插哪都不亮“?一个暗断点引发的排查——硬件新手三板斧
单片机·嵌入式硬件·esp32·arduino·面包板·硬件入门
Jaixln_HRF5 小时前
芯维尔CN8010 1.2A/6V同步降压转换器芯片,集成350/230mΩ MOSFET与1.5MHz高频,用于汽车电子/IoT/便携仪器
嵌入式硬件·物联网·硬件工程
ACP广源盛139246256737 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#IX6024 PCIe2.0 交换芯片在轻量化 AI 服务中的机会与应用场景
大数据·数据库·人工智能·嵌入式硬件·macos·开源
深圳市恒锐丰科技杨生7 小时前
EG2124A 260V 三相独立半桥栅极驱动芯片|BLDC 外置 MOS 三相桥驱动方案
嵌入式硬件·硬件工程