STM32H7使用串口DMA避坑指南
缓冲区设定 使用RAM_D2作为读写缓冲区配置 STM32H7 _ _ _ _ _ x_FLASH.ld配置 .dma_buffer : /* 冒号前有一个空格 */ { *(.dma_buffer) } >RAM_D2 然后在需要进行读写缓冲区的文件中添加以下定义: /// 这里通过宏定义来定义DMA_BUFFER /// __ICCARM__:表示 IAR EWARM 编译器 /// 所以如果是GCC的话就使用else块中的定义了 #if defined( __ICCARM__ ) #define DMA_BUFFER \ _Pragma("location=\".dma_buffer\"") #else #define DMA_BUFFER \ __attribute__((section(".dma_buffer"))) #endif #define BUFFER_SIZE 256 DMA_BUFFER uint8_t tx_buffer[BUFFER_SIZE]; static uint8_t tx_idx = 0; DMA_BUFFER uint8_t rx_buffer[BUFFER_SIZE]; 串口异常处理函数 如果不对串口异常进行处理,清理相关错误标记,可能无法继续执行中断函数 /// 错误码是定义如下 #define HAL_UART_ERROR_NONE (0x00000000U) /*!< No error */ #define HAL_UART_ERROR_PE (0x00000001U) /*!< Parity error */ #define HAL_UART_ERROR_NE (0x00000002U) /*!< Noise error */ #define HAL_UART_ERROR_FE (0x00000004U) /*!< Frame error */ #define HAL_UART_ERROR_ORE (0x00000008U) /*!< Overrun error */ #define HAL_UART_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ #define HAL_UART_ERROR_RTO (0x00000020U) /*!< Receiver Timeout error */ /// 下面错误处理函数中把奇偶校验错误以及数据溢出错误标志清除 /// 可以直接在调试时打断点查看huart->ErrorCode的值 void HAL_UART_ErrorCallback(UART_HandleTypeDef* huart) { if (huart->Instance == USART6) { __HAL_UART_CLEAR_OREFLAG(huart); __HAL_UART_CLEAR_PEFLAG(huart); huart->RxState = HAL_UART_STATE_READY; HAL_UARTEx_ReceiveToIdle_DMA(huart, rx_buffer, BUFFER_SIZE); __HAL_DMA_DISABLE_IT(&hdma_usart6_rx, DMA_IT_HT); } } 关闭半中断 在调用HAL_UARTEx_ReceiveToIdle_DMA函数时默认打开“半中断”,数据在接收到一半(左右)时会触发HAL_UARTEx_RxEventCallback回掉函数, 如果仅需要处理完整数据的可以在调用HAL_UARTEx_ReceiveToIdle_DMA函数后直接执行__HAL_DMA_DISABLE_IT(&hdma_usart6_rx, DMA_IT_HT);,即可关闭半中断 ...