STM32-CubuMX-HAL库学习(五)-- 串口的基础收发实现

硬件平台:正点原子STM32MINI开发板(STM32RCT6)
软件平台:STM32CubeMX
KEIL5
实现功能:串口控制LED灯亮灭
串口向电脑发送数据
硬件连接: PA8 ->LED0
说明:有时候程序下载后不实现,可试着复位一下,也可在魔术棒配置中打开下载后复位。
(仅仅写了串口部分,其余初始化未做说明)
在这里插入图片描述
1、选择串口1,选择模式为异步通讯
在这里插入图片描述
2、配置串口相关数据,波特率此处配置115200,字长此处配置8位,无奇偶校验位,一个停止位,接收和发送都打开。
在这里插入图片描述
3、打开串口中断
在这里插入图片描述
4、查看引脚是否为想要的引脚,假如引脚和实际引脚对不上,则需在图中修改
在这里插入图片描述
5、假如PB6才为板子硬件实际连接的串口输出,则需通过此步修改,注意此步尤为重要,有的时候引脚不对便实现不了功能,此处就是实际PA9连接不做修改。
在这里插入图片描述
6、配置中断优先级组数,并设置串口中断优先级,生成代码
在这里插入图片描述
7、使能串口的接收中断
在这里插入图片描述
8、在stm32f1xx_it.c文件中有串口一的接收中断服务函数,HAL_UART_IRQHandler(&huart1);转到该函数定义。
在这里插入图片描述
9、该函数有很多处理,可找到接收中断函数UART_Receive_IT(huart);,然后转到该函数定义,
在这里插入图片描述
10、里面也有很多处理,找到HAL_UART_RxCpltCallback(huart);,接收中断的回调函数。转到该函数定义
在这里插入图片描述
11、可看到该函数定义,__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart),是个虚函数,用户可重新定义
在这里插入图片描述
12、在main.c函数中重新定义该回调函数,需注意,使用回调函数的接收,必须要先初始化一个接收的数据,HAL_UART_Receive_IT(&huart1,&res,1);此函数要在最开始初始化的时候初始化,而且每次中断执行完毕后也需要一个这个函数,重新定义一个接收空间吧(自己的理解,可能不对)。HAL_UART_Transmit(&huart1,&res,sizeof(res),100);将接收到的数据又发送到上位机
可以用串口调试助手测试代码

uint8_t res;//定义一个全局变量
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)//假如有串口1触发接收中断
	{
		res = huart->Instance->DR;//保存接收到的数据
		if(res == 0x01)//假如接收到的数据是0x01翻转电平
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);
	}
   //重新定义一个接收,&res是定义的接收数据的地址,1是指1个数据,多个数据接收暂时
   //不会处理
	HAL_UART_Receive_IT(&huart1,&res,1);
   //将接收到的数据发送到上位机
	HAL_UART_Transmit(&huart1,&res,sizeof(res),100);
}

在这里插入图片描述
13、在WHILE(1)前记得初始化一个接收地址空间,记得res是全局变量,发送的str是提前定义的一个“hello_world”字符串

//使能接收中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); 

//初始化一个接收的地址空间
HAL_UART_Receive_IT(&huart1,&res,1);

//发送一个字符串
//str:数组起始地址
//sizeof(str):发送的个数
//100时间间隔,好像是100ms后还未触发跳出函数
HAL_UART_Transmit(&huart1,str,sizeof(str),100);

用串口回调函数写我感觉要调用的函数太多了,而且有些配置也不是很方便,所以我常选择不使用回调函数,若有相关需求,可按以下配置。
在这里插入图片描述
1、在NVIC的code generation 中取消勾选USART1的中断服务函数编写,但还是要使能中断,然后生成代码。
在这里插入图片描述
2、在main.c中重新写串口中断函数,记得清除中断标志位,这样写,不使用回调函数,就不需要像之前那样定义一个接收的数据地址。

uint8_t res;
if(huart1.Instance->SR & UART_FLAG_RXNE)//判断是否满足接收中断
{
    res = huart1.Instance->DR;//获取接收到的数据
    if(res == 0x01)
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);
    __HAL_UART_CLEAR_PEFLAG(&huart1);//清除中断标志位
}
HAL_UART_Transmit(&huart1,&res,sizeof(res),100);//发送接收到的数据,做测试

在这里插入图片描述
3、初始化也只需要打开串口的接收中断就好了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!关于STM32收发数据包的问题,可以使用串口通信来实现。下面是一个简单的示例代码,演示了如何使用STM32串口收发数据包。 首先,你需要初始化串口。在STM32的库函数中,可以使用HAL库来进行串口的初始化和配置。下面是一个初始化串口的示例代码: ```c UART_HandleTypeDef huart; void UART_Init(void) { huart.Instance = USART2; huart.Init.BaudRate = 115200; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart); } ``` 接下来,你可以使用HAL库提供的函数来实现数据包的发送和接收。例如,使用`HAL_UART_Transmit()`函数发送数据包,使用`HAL_UART_Receive()`函数接收数据包。下面是一个简单的示例代码: ```c uint8_t txData[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}; uint8_t rxData[10]; void sendPacket(void) { HAL_UART_Transmit(&huart, txData, 10, 100); } void receivePacket(void) { HAL_UART_Receive(&huart, rxData, 10, 100); } ``` 以上代码演示了如何发送一个长度为10字节的数据包,并接收一个长度为10字节的数据包。 需要注意的是,以上只是一个简单的示例,实际应用中可能需要根据具体的需求进行修改和优化。同时,还需要根据具体的硬件连接和配置来进行相应的调整。 希望能对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年、潜行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值