STM32
直播中

YYXIAO

9年用户 1238经验值
擅长:接口/总线/驱动
私信 关注
[问答]

STM32CubeMX串口中断自收自发怎么写?


核心板主控芯片是STM32F103ZET6,开发环境是EWARM 6.40.1
用STM32CubeMX配置好芯片的相关功能和管脚,各个模块初始化代码是自动生成的

  • UART_HandleTypeDef huart1;
  • /* USART1 init function */
  • void MX_USART1_UART_Init(void)
  • {
  •   huart1.Instance = USART1;
  •   huart1.Init.BaudRate = 115200;
  •   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  •   huart1.Init.StopBits = UART_STOPBITS_1;
  •   huart1.Init.Parity = UART_PARITY_NONE;
  •   huart1.Init.Mode = UART_MODE_TX_RX;
  •   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  •   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  •   HAL_UART_Init( huart1);
  • }

现在想调试一下串口发送和接收,实测HAL_UART_Transmit ( huart1, "Hello World!rn", 14, 1);函数可以正常发送字符串
然而使用中断方式接收字符不知道该怎么写了,函数HAL_UART_RxCpltCallback不会用。。。
想做一个自收自发的功能,给单片机发送的字符串,单片机再发送回来,不知道该怎么做
求各位过路大侠,大神,大仙指教!


回帖(1)

陈博

2024-5-13 18:15:48
要实现STM32F103ZET6的串口中断自收自发功能,我们需要按照以下步骤进行操作:

1. 初始化串口(USART1)并配置相关参数。
2. 配置中断服务函数。
3. 启动串口接收中断。

以下是详细的实现步骤:

1. 初始化串口(USART1)并配置相关参数:

```c
UART_HandleTypeDef huart1;

void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    // Initialization Error
  }
}
```

2. 配置中断服务函数:

```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if (huart->Instance == USART1)
  {
    // 接收到数据后的处理
    // 例如:将接收到的数据发送回去
    HAL_UART_Transmit(&huart1, huart1.pRxBuffPtr, huart1.RxXferSize, HAL_MAX_DELAY);
  }
}

void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
}
```

3. 启动串口接收中断:

```c
int main(void)
{
  // System Initialization
  HAL_Init();
  SystemClock_Config();
  MX_USART1_UART_Init();

  // 配置接收缓冲区
  uint8_t RxBuffer[10];
  huart1.pRxBuffPtr = RxBuffer;
  huart1.RxXferSize = sizeof(RxBuffer);

  // 启动接收中断
  if (HAL_UART_Receive_IT(&huart1, huart1.pRxBuffPtr, huart1.RxXferSize) != HAL_OK)
  {
    // Receive Error
  }

  // 主循环
  while (1)
  {
    // 其他任务
  }
}
```

这样,当STM32F103ZET6接收到数据时,中断服务函数会被调用,并将接收到的数据通过串口发送回去,实现自收自发功能。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分