在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; } }}
|