这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » NUCLEO-U083RC学习历程20-串口使用中断的方式与PC端通讯

共2条 1/1 1 跳转至

NUCLEO-U083RC学习历程20-串口使用中断的方式与PC端通讯

助工
2025-01-15 18:39:52     打赏

在之前的帖子里,分享了一下使用DMA的方式,实现串口与外设通讯的方式,今天和大家分享一下使用中断的方式,实现开发板与外设之间的传输(发送/接收)

主要了解中断的发送方式,函数如下所示:

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)

一:使用硬件连接:

板载PA2引脚连接到开发板的串口接收端

板载PA3引脚连接到开发板的串口发送端

二:程序编写流程:

2.1:程序开始运行时,调用 HAL_Init() 函数来重置所有外围设备,

2.2 初始化 Flash 接口和系统,

2.3 调用SystemClock_Config() 配置CPU主频为 48 MHz 运行。

2.4 初始化串口的外设部分

2.5 编写串口的通讯部分

注释:

串口UART 外设配置由 HAL_UART_Init() 函数确保。在程序中调用 HAL_UART_MspInit() 函数,在该函数中初始化串口的一些基本参数可以(CLOCK、GPIO 和 NVIC)实现所需 UART 资源的配置。你可以更新此功能以更改 UART 配置。

串口发送/接收到基本思路:

启动 UART/超级终端通信。HAL_UART_Receive_IT() 和 HAL_UART_Transmit_IT() 函数分别允许从超级终端接收数据和传输预定义的数据缓冲区。

UART 的异步通信方面清楚地突出,因为与超级终端之间的数据缓冲区传输/接收是同时完成的。

定义发送接收的缓冲区,TxBuffer (aTxStartMessage) 是预定义的,并且 RxBuffer (aRxBuffer) 大小限制为 10 个数据,即接收好10个数据后完成数据回传。

第一步,TxBuffer 缓冲区内容将显示在超级终端界面中,接收到的数据将存储在 RxBuffer 缓冲区中。在第二步中,RxBuffer 缓冲区中接收到的数据将被发送回超级终端并显示。

三:程序代码如下所示:

  if(HAL_UART_Transmit_IT(&huart2, (uint8_t*)aTxStartMessage, TXSTARTMESSAGESIZE)!= HAL_OK)
  {
    /* Transfer error in transmission process */
    Error_Handler();
  }

  if(HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
    /* Transfer error in reception process */
    Error_Handler();
  }

  while (HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY)
  {
  }

  if(HAL_UART_Transmit_IT(&huart2, (uint8_t*)aRxBuffer, RXBUFFERSIZE)!= HAL_OK)
  {
    /* Transfer error in transmission process */
    Error_Handler();
  }
  while (HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY)
  {
  }

  if(HAL_UART_Transmit_IT(&huart2, (uint8_t*)aTxEndMessage, TXENDMESSAGESIZE)!= HAL_OK)
  {
    /* Transfer error in transmission process */
    Error_Handler();
  }
  while (HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY)
  {
  }

实现效果截图:

01-15-2.png

避坑经验:

1:启用奇偶校验后,计算出的奇偶校验将插入到传输数据的 MSB 位置。

2:使用 HAL_Delay() 时必须小心,此函数根据 SysTick ISR 中递增的变量提供准确的延迟(以毫秒为单位)。这意味着,如果 HAL_Delay() 是从外围 ISR 进程调用的,则 SysTick 中断必须具有比外围中断更高的优先级(数值上更低)。否则,调用方 ISR 进程将被阻止。要更改 SysTick 中断优先级,您必须使用 HAL_NVIC_SetPriority() 函数。

3:应用程序需要确保 SysTick 时基始终设置为 1 毫秒,才能执行正确的 HAL 操作。





关键词: NUCLEO-U083RC     串口     中断发送    

院士
2025-01-15 20:41:21     打赏
2楼

我一直觉得 Hal库提供的这个API函数在实际应用中发挥不出来啥效果


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]