【PX4-AutoPilot教程-TIPS】PX4设置DMA通道后系统无法正常启动的解决方法

PX4设置DMA通道后系统无法正常启动的解决方法

问题描述

进行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 */

重新烧录后系统即可正常启动。


参考资料:

board_dma_map

stm32h7x3xx_dmamux

STM32H7的DMA基础知识和HAL库API

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后厂村路练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值