737|2

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【NUCLEO-WB09KE评测】2、UART中断方式串口通信 [复制链接]

目标

为NUCLEO-WB09KE搭建基本环境,驱动LED、UART,实现UART中断方式串口通信。

跑通编译、下载流程,建立信心,为后面评测做好准备。

 

一、STM32CubeMX配置

MX新建一个工程,选择NUCLEO-WB09KE开发板

由于选择了开发板,涉及BSP的部分已经配置好了,缺省的引脚也做了预留。

 

1、BSP配置

勾选了LED,BUTTON,因为要用中断方式实现UART,所以没有勾选VCOM。

 

2、USART1配置

设置了中断方式

生成代码

 

二、代码修改

1、实现printf重定向

据说ARM官方推荐用retarget.c的方式实现printf重定向

从keil/arm/startup/拷贝一份retarget.c到Core\Src下

为了支持ARM6.xx编译,将retarget.c做如下修改
//#pragma import(__use_no_semihosting_swi)
__asm(".global __use_no_semihosting");

//extern int  getkey(void);      /* in Serial.c */

//struct __FILE { int handle; /* Add whatever you need here */ };

//int fgetc(FILE *f) {
//  return (sendchar(getkey()));
//}

main.c中增加:

/* USER CODE BEGIN 0 */
int sendchar(int ch)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
	return ch;
}


/* USER CODE END 0 */

 

2、配置USART中断接收

USART1初始化完成后,使能接收中断。

  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	
	// 使能UART中断
  if (HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
    Error_Handler();
  }

增加中断接收处理回调函数:

HAL_UART_RxCpltCallback在aRxBuffer缓存接收满后一次。因此RXBUFFERSIZE被设置为1,这样每接收一个字符,HAL_UART_RxCpltCallback被调用一次。

当接收到1时,翻转绿灯。

为了下一次中断,需要再次设置HAL_UART_Receive_IT。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
	
	if (UartHandle->Instance == USART1)
  {
    // 处理接收到的数据
    // aRxBuffer 是存储接收数据的缓冲区
		if(aRxBuffer[0]==1)
		{
			//printf("HAL_UART_RxCpltCallback\r\n");
			BSP_LED_Toggle(LED_GREEN);
			aRxBuffer[0]=0;
		}
    // 重新使能中断以继续接收数据
		if (HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
		{
			Error_Handler();
		}		
  }
}

三、运行效果

1、串口收到信息。2、通过串口向MCU发送1,绿灯翻转。

此帖出自RF/无线论坛

最新回复

学习了,感谢大佬分享!   详情 回复 发表于 2024-9-19 20:11
点赞 关注
 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

UART中断方式串口通信测试比较完美

此帖出自RF/无线论坛
 
 

回复

119

帖子

1

TA的资源

一粒金砂(高级)

板凳
 

学习了,感谢大佬分享!

此帖出自RF/无线论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表