硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1051|回复: 6
收起左侧

[技术讨论] STM32L4串口收发问题

[复制链接]

24

主题

50

回帖

122

积分

初级会员

积分
122
发表于 2024-8-9 15:09:45 | 显示全部楼层 |阅读模式
现在程序有一个问题,就是我的接收中断为

[C] 纯文本查看 复制代码
void USER_USART1_IRQHandler(void)
{
  uint8_t data = 0;
  if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
  {
    data = (uint8_t)USART1->RDR & (uint8_t)0x00fff;
    wrEleQueue(&uart[_COM1].Rx, data);
    uart[_COM1].active = true;
    // __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);
  }
  // if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
  // {
  //   uart[_COM1].flag = 1;
  //   __HAL_UART_CLEAR_IDLEFLAG(&huart1);
  // }
}

然后我有一个发送数据的函数,但是现在我的接收中断接收不到数据,里面一直为空,为什么?主函数里面也调用了__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
[C] 纯文本查看 复制代码
int SendDataUART(const char *s, uint32 number, COM_TypeDef com)
{
  UART_HandleTypeDef *p;
  uint8_t *data = NULL;
  p = getUARTPtr(com);
  if (!p)
    return _ERR;
  wrBlockQueue(&uart[com].Tx, (uint8_t *)s, number);//将s写入到环形缓冲区中,写number个数据
  int len = QueueLen(uart[_COM1].Tx);//求环形缓冲区的长度
  data = (uint8_t *)calloc(len + 1, sizeof(uint8_t));
  if (!data)
    return _ERR;
  rdBlockQueue(data, &uart[com].Tx, len);//将环形缓冲区中的数据读出来,读len个长度
  HAL_UART_Transmit(&huart1, data, len, 500);
  free(data);
  return _OK;


/* 本意是想使用这个来触发HAL_UART_TxCpltCallback回调函数,但是最后测试也不行 */
  // UART_HandleTypeDef *p;
  // p = getUARTPtr(com);
  // if (!p)
  //   return _ERR;
  // wrBlockQueue(&(uart[com].Tx), (uint8_t *)s, number);
  // if ((__HAL_UART_GET_FLAG(p, UART_FLAG_BUSY) == RESET) || (__HAL_UART_GET_FLAG(p, UART_FLAG_TXE)))
  // {
  //   uint8_t dat = 0;
  //   rdEleQueue(&(uart[com].Tx), &dat);
  //   // p->Instance->CR1 = (p->Instance->CR1 & (~(1 << 3))) | (1 << 3);
  //   HAL_UART_Transmit_IT(p, &dat, 1);
  //   // USART1->TDR = (uint8_t)dat;
  // }
  // return _OK;
}

[C] 纯文本查看 复制代码
回调函数为
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  uint8_t dat;
  if (huart->Instance == USART1)
  {
    if (!isEmptyQueue(uart[_COM1].Tx))
    {
      rdEleQueue(&(uart[_COM1].Tx), &dat);//从环形缓冲区中读取一个元素
      // huart->Instance->CR1 = (huart->Instance->CR1 & (~(1 << 3))) | (1 << 3);
      HAL_UART_Transmit_IT(&huart1, &dat, 1);
      // USART1->TDR = (uint8_t)dat;
    }
    // else
    //   huart->Instance->CR1 = (huart->Instance->CR1 & (~(1 << 3)));
  }
}

微信图片_20240809150838.png

微信图片_20240809150859.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-8-10 10:18:31 | 显示全部楼层
这个关键的函数USER_USART1_IRQHandler,没有在楼主的描述里面看到调用的地方,是直接把这个函数做中断入口了?
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-8-10 14:57:46 | 显示全部楼层
应该是中断向量函数没有配置好吧
回复

使用道具 举报

34

主题

206

回帖

308

积分

高级会员

积分
308
发表于 2024-8-12 11:42:00 | 显示全部楼层
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);

确认下中断有没有开起来
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-8-14 08:40:18 | 显示全部楼层
eric2013 发表于 2024-8-10 10:18
这个关键的函数USER_USART1_IRQHandler,没有在楼主的描述里面看到调用的地方,是直接把这个函数做中断入口 ...

USER_USART1_IRQHandler这个函数在没有写接收回调函数HAL_UART_TxCpltCallback的时候是在stm32l4xx_it.c文件的USART1_IRQHandler()里面调用的
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-8-14 16:10:30 | 显示全部楼层
顺便再问一个问题,为什么串口刚开始初始化后就会接收一个数据'\0'?普通串口,不是485的
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-14 17:03:34 | 显示全部楼层
应该是初始化程序有问题,你先按照硬汉哥的串口例程来,都用的hal库,不会差太多,把程序跑通再搞那些骚操作
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:36 , Processed in 0.042458 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表