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

本文主要是介绍【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

这篇关于【PX4-AutoPilot教程-TIPS】PX4设置DMA通道后系统无法正常启动的解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971165

相关文章

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇