STM32CubeMX串口接收数据(中断方式,HAL库)

本文介绍如何使用STM32CubeMX和SW4STM32配置STM32F103RCT6及STM32F407VET6芯片,实现通过USART1和USART2两个串口进行数据回显的功能。文中详细记录了配置步骤,并提供了一个包含串口中断回调的示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统:linux mint 18.3 xfce 64bit
软件:
STM32CubeMX 4.24
SW4STM32 2.4

链接:https://pan.baidu.com/s/1nxgh1VF 密码:rvzu

开发板芯片:STM32F103RCT6,STM32F407VET6
实现效果:打开两个串口助手窗口,一个是USART1的,一个是USART2的,任意一个串口(串口1或者串口2)发送数据过去就会马上通过该串口返回来。
开篇语:

使用STM32CubeMX和SW4STM32具有的优点:
(1)跨平台开发的优势,win和linux系统都有现成的安装包,安装sw4stm32过程会提升自动安装STLINK驱动
(2)版本升级积极,我觉得这是一个好现象,说明开发者很重视
(3)最重要的是免费!!!不用到处找破解激活


(1)使用STM32CubeMX在Pinout配置好TIM3,PA8、PD2(LED灯)、USART1、USART2,

这里写图片描述

(2)时钟配置保持默认
这里写图片描述

(3)设置TIM1时钟,效果是1s进入一次中断
这里写图片描述

(4)USART1、USART2波特率等置保持不变,设置NVIC,如下图,注意优先级
这里写图片描述
这里写图片描述
(5)然后生成SW4STM32工程
这里写图片描述

(6)使用sw4stm32打开工程
main.c 添加三处代码,具体位置请大家看提示,整个main.c文件太多就不贴了

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t aTxBuffer[]="*********串口发送数据××××××××××××\r\n";
uint8_t aRxBuffer1[1];		// 用来接收串口1发送的数据
uint8_t aRxBuffer2[1];		// 用来接收串口2发送的数据
/* USER CODE END PV */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	HAL_UART_Receive_IT(&huart1,aRxBuffer1,1);			// Enable the USART1 Interrupt
	HAL_UART_Receive_IT(&huart2,aRxBuffer2,1);			// Enable the USART2 Interrupt
	HAL_UART_Transmit(&huart1,aTxBuffer,sizeof(aTxBuffer),100);
	HAL_UART_Transmit(&huart2,aTxBuffer,sizeof(aTxBuffer),100);
	HAL_TIM_Base_Start_IT(&htim3);						// 启动定时器3
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	if(huart->Instance == USART1)	// 判断是由哪个串口触发的中断
	{
		HAL_UART_Transmit(&huart1,aRxBuffer1,1,100);	// 接收到数据马上使用串口1发送出去
		HAL_UART_Receive_IT(&huart1,aRxBuffer1,1);		// 重新使能串口1接收中断
	}
	if(huart->Instance == USART2)
	{
		HAL_UART_Transmit(&huart2,aRxBuffer2,1,100);	// 接收到数据马上使用串口1发送出去
		HAL_UART_Receive_IT(&huart2,aRxBuffer2,1);		// 重新使能串口2接收中断
	}
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM3)		// 判断是由哪个定时器触发的中断
	{
		HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);
	}

}
/* USER CODE END 4 */

如果发现无法实现效果,请检查自己的硬件连接是否正确,还有就是检查USB转TTL是否正常,我就遇到了我的USB转TTL竟然能接收STM32发来的数据但是发送不出去数据,折腾了一晚上,第二天换了个串口线测试是正常的。

与本博客相关联的还有使用freertos实现不定长数据的接收,使用串口中断和邮箱队列实现,该案例更加贴近实际开发,详细视频教程请参考:
(1)9.freertos中断与邮箱队列
(2)10.freertos串口接收不定长数据

### STM32G030F6P6 HAL使用教程 #### 下载与安装 对于STM32G030F6P6微控制器,意法半导体提供了全面的支持资源,包括STM32CubeMX配置工具和HAL等[^1]。这些工具能够帮助开发者更便捷地初始化硬件设置并编写应用代码。 为了获得最新的HAL版本以及配套的中间件组件: - 访问ST官方网站或通过STM32CubeMX图形界面下载对应系列的固件包。 - 安装过程中按照提示完成必要的环境搭建工作。 #### 配置过程 利用STM32CubeMX可以简化项目创建流程,在此期间可以选择所需的外设功能模块,并自动生成初始框架代码。具体步骤如下所示(注意:此处描述不涉及顺序指导): - 启动STM32CubeMX软件; - 输入目标器件型号为`STM32G030F6P6`; - 设置系统时钟频率及其他参数; - 添加需要使用的外设接口,比如IIC用于连接OLED显示屏[^2]; - 导出工程至指定IDE平台准备编译链接。 #### 示例代码展示 针对如何基于HAL实现对1.54英寸OLED屏的控制,下面给出了一段简单的C语言源码片段作为参考。这段代码展示了基本的数据传输逻辑,即通过模拟IIC协议来发送命令给显示器芯片[^3]: ```c #include "stm32g0xx_hal.h" // 假定已经定义好了GPIO端口映射关系 #define OLED_SDA_PIN GPIO_PIN_7 #define OLED_SCL_PIN GPIO_PIN_6 #define OLED_I2C_PORT hsi2c1 void OLEDDisplay_Init(void){ // 初始化IIC通信总线... } uint8_t WriteByteToOLED(uint8_t data){ uint8_t status=0; /* Start condition */ HAL_I2C_Master_Transmit(&OLED_I2C_PORT,&data,1,HAL_MAX_DELAY); return status; } ``` 以上仅是一个非常基础的例子,实际开发中可能还需要考虑更多细节处理,例如错误检测机制、数据缓冲区管理等方面的内容。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值