打印
[STM32F1]

STM32F103ZET6 HAL库使用串口1DMA空闲中断接收数据时CNDTR寄存器问题,该如何解决?

[复制链接]
372|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
豌豆爹|  楼主 | 2023-10-23 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32F103ZET6开发过程中,用到HAL库中的串口1DMA空闲中断处理数据时发现:

当接收数据长度超过16字节后,(__HAL_DMA_GET_COUNTER(&huart1.hdmarx))也就是串口1的CNDTR寄存器会首先减16,然后恢复到给定长度,再次进入中断减去剩余长度(又或当长度超过16字节后空闲中断再次进入) 例如限定接收数据长度为0xFFF,当接收数据超过0x0F(例0x12)后,CNDTR寄存器会首先变为0xFF0,然后回到0xFFF,再变为0xFFE。

程序波特率115200,数据位8,停止位1。如何解决呢?

以下是部分代码块

#define UART_RX_LEN 4096
uint8_t UART_RX_BUF[UART_RX_LEN];
__IO uint16_t UART_RX_STA = 0;

/************串口中断代码***********/
void USART1_IRQHandler(void)
{
  if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)  // 空闲中断标记被置位
  {
      __HAL_UART_CLEAR_IDLEFLAG(&huart1);  // 清除中断标记
      HAL_UART_DMAStop(&huart1);           // 停止DMA接收
      UART_RX_STA = UART_RX_LEN - huart1.hdmarx->Instance->CNDTR;  // 总数据量减去未接收到的数据量为已经接收到的数据量
      UART_RX_STA |= 0X8000;         // 标记接收结束
      HAL_UART_Receive_DMA(&huart1, UART_RX_BUF, UART_RX_LEN);  // 重新启动DMA接收
      __HAL_UART_ENABLE_IT((&huart1), UART_IT_IDLE);    //重新开启串口接收帧中断
  }
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  HAL_UART_Receive_DMA(&huart1, UART_RX_BUF, UART_RX_LEN);  // 启动DMA接收
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);              // 使能空闲中断
  while (1)
  {  
    if(UART_RX_STA & 0X8000)
    {
      /**********接收数据处理代码*****************/
      UART_RX_STA = 0;  // 清除标记
      UART_RX_FLAG=0;
    }
  }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

508

主题

1941

帖子

5

粉丝