STM32
直播中

席毖庸

9年用户 1114经验值
擅长:596874
私信 关注
[问答]

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

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 4096uint8_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;    }  }}


回帖(1)

周奕

2024-3-12 14:41:25
库中串口的中断处理与你写的代码有些许差异。
如果楼主觉得串口等逻辑是正确的,不妨看看计算时是不是数据类型转换的问题。
举报

更多回帖

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