问题描述
进行PX4源码移植的时候修改PX4的DMA配置,主要是对nuttx-config/include/board_dma_map.h文件进行修改。
该文件用于配置DMA。DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动,这就节省了CPU的资源来做其他操作。
/*
* DMA channel define reference to stm32h7x3xx_dmamux.h
*/
#pragma once
// DMAMUX1
#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* DMA1:37 */
#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* DMA1:38 */
#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* DMA1:39 */
#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* DMA1:40 */
// DMAMUX2
#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_0 /* DMA1:61 */
#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_0 /* DMA1:62 */
#define DMAMAP_SPI6_RX DMAMAP_BDMA_SPI6_RX /* BDMA:11 */
#define DMAMAP_SPI6_TX DMAMAP_BDMA_SPI6_TX /* BDMA:12 */
//TODO UART
#define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_1 /*DMA2:41*/
#define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_1 /*DMA2:42*/
#define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_1 /* DMA2:43 */
#define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_1 /* DMA2:44 */
#define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* DMA2:45 */
#define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* DMA2:46 */
#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_0 /* DMA1:63 */
#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_0 /* DMA1:64 */
#define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_0 /* DMA1:65 */
#define DMAMAP_UART5_TX DMAMAP_DMA12_UART5RX_0 /* DMA1:66 */
#define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_0 /* DMA1:79 */
#define DMAMAP_UART7_TX DMAMAP_DMA12_UART7TX_0 /* DMA1:80 */
在打开了多个串口通道和SPI通道的DMA后,烧录固件到飞控板中,系统无法正常启动进入PX4代码,并不断重启。
解决方法
原因是STM32H7系列的每组DMA只有8个通道,DMA1只支持8个通道!DMA2只支持8个通道!
将DMA1和DMA2的通道数设置为8个以下即可。
#pragma once
/********** DMA1只支持设置8个通道! **********/
/********** DMA2只支持设置8个通道! **********/
/********** SPI DMA 设置 **********/
#define DMAMAP_SPI1_RX DMAMAP_DMA12_SPI1RX_0 /* DMA1:37 */
#define DMAMAP_SPI1_TX DMAMAP_DMA12_SPI1TX_0 /* DMA1:38 */
#define DMAMAP_SPI2_RX DMAMAP_DMA12_SPI2RX_0 /* DMA1:39 */
#define DMAMAP_SPI2_TX DMAMAP_DMA12_SPI2TX_0 /* DMA1:40 */
#define DMAMAP_SPI3_RX DMAMAP_DMA12_SPI3RX_0 /* DMA1:61 */
#define DMAMAP_SPI3_TX DMAMAP_DMA12_SPI3TX_0 /* DMA1:62 */
/********** 串口 DMA 设置 **********/
// #define DMAMAP_USART1_RX DMAMAP_DMA12_USART1RX_0 /* DMA1:41 */
// #define DMAMAP_USART1_TX DMAMAP_DMA12_USART1TX_0 /* DMA1:42 */
#define DMAMAP_USART2_RX DMAMAP_DMA12_USART2RX_1 /* DMA2:43 */
#define DMAMAP_USART2_TX DMAMAP_DMA12_USART2TX_1 /* DMA2:44 */
// #define DMAMAP_USART3_RX DMAMAP_DMA12_USART3RX_1 /* DMA2:45 */
// #define DMAMAP_USART3_TX DMAMAP_DMA12_USART3TX_1 /* DMA2:46 */
#define DMAMAP_UART4_RX DMAMAP_DMA12_UART4RX_1 /* DMA2:63 */
#define DMAMAP_UART4_TX DMAMAP_DMA12_UART4TX_1 /* DMA2:64 */
#define DMAMAP_UART5_RX DMAMAP_DMA12_UART5RX_1 /* DMA2:65 */
#define DMAMAP_UART5_TX DMAMAP_DMA12_UART5RX_1 /* DMA2:66 */
// #define DMAMAP_USART6_RX DMAMAP_DMA12_USART6RX_0 /* DMA1:71 */
// #define DMAMAP_USART6_TX DMAMAP_DMA12_USART6TX_0 /* DMA1:72 */
#define DMAMAP_UART7_RX DMAMAP_DMA12_UART7RX_1 /* DMA2:79 */
#define DMAMAP_UART7_TX DMAMAP_DMA12_UART7TX_1 /* DMA2:80 */
// #define DMAMAP_UART8_RX DMAMAP_DMA12_UART8RX_0 /* DMA1:81 */
// #define DMAMAP_UART8_TX DMAMAP_DMA12_UART8TX_0 /* DMA1:82 */
#define DMAMAP_TIM3_CH2 DMAMAP_DMA12_TIM1CH1_0 /* DMA1:11 SLED */
重新烧录后系统即可正常启动。
参考资料: