当前位置: 首页 > article >正文

STM32(hal库)中,__HAL_LINKDMA 函数使用时候,串口的handler DMA_HandleTypedef 为什么前面要加extern

        在STM32 HAL库中,__HAL_LINKDMA是一个宏,用于将特定的外设(如UART、SPI等)的句柄(Handle)与其对应的DMA(直接内存访问)句柄链接起来。这样做的目的是让HAL库内部能够自动管理DMA传输,从而简化代码并减少出错的可能性。

        当你在使用__HAL_LINKDMA链接串口的handler (UART_HandleTypeDef) 和DMA的handler (DMA_HandleTypeDef) 时,如果看到示例代码中DMA_HandleTypeDef前面加了extern关键字,这通常意味着DMA_HandleTypeDef的定义是在另一个源文件中完成的,而不是在当前文件中。

使用extern的原因

  1. 跨文件引用extern关键字用于声明一个变量或对象是在其他地方定义的。当你需要在多个文件中访问同一个变量或对象时,你通常在一个文件中定义它(不提供extern),而在其他需要访问该变量的文件中声明它(使用extern)。

  2. 模块化设计:在嵌入式系统开发中,模块化设计是非常重要的。通过将不同的硬件外设的初始化和管理代码放在不同的源文件中,可以提高代码的可读性和可维护性。对于DMA和串口这样的外设,可能会在不同的源文件中使用它们,因此需要使用extern来跨文件引用它们的句柄。

示例

假设你有两个源文件:main.cuart_dma.c

  • uart_dma.c中,你定义了DMA的句柄并初始化了它:

    DMA_HandleTypeDef hdma_usartx_tx;
    
    void MX_DMA_Init(void) {
        // 初始化DMA句柄
        hdma_usartx_tx.Instance = DMAx_Channely; // 替换为实际的DMA实例和通道
        // 其他初始化代码...
    }

  • main.c中,你需要链接串口的handler到DMA的handler,但因为你是在main.c中引用hdma_usartx_tx,而它是在uart_dma.c中定义的,所以你需要在main.c的顶部声明它:

    extern DMA_HandleTypeDef hdma_usartx_tx;
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_USARTx_UART_Init(void);
    
    int main(void) {
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        MX_DMA_Init(); // 确保DMA初始化在链接之前完成
        MX_USARTx_UART_Init();
    
        // 链接DMA句柄到UART句柄
        __HAL_LINKDMA(&huartx, hdmatx, hdma_usartx_tx);
    
        // 其他代码...
    }
    
    static void MX_USARTx_UART_Init(void) {
        huartx.Instance = USARTx; // 替换为实际的USART实例
        huartx.Init.BaudRate = 115200;
        // 其他初始化代码...
    }

在这个例子中,extern关键字允许main.c访问在uart_dma.c中定义的hdma_usartx_tx变量。

总结

extern的使用是为了在多个源文件之间共享变量。在STM32 HAL库中使用__HAL_LINKDMA时,如果DMA句柄是在另一个文件中定义的,你需要在当前文件中使用extern来声明它,以便能够链接到串口的handler。


http://www.kler.cn/a/401275.html

相关文章:

  • 网络协议(4)拥塞控制
  • jvm原理介绍
  • vue-office:word(.docx)、pdf、excel(.xlsx,.xls)格式文件预览
  • 【FL0021】基于SpringBoot和微信小程序的高校就业招聘系统
  • 私域流量与视频号直播的融合创新:以 2+1 链动模式 S2B2C 商城小程序为例
  • 大型语言模型综述 A Survey of Large Language Models
  • M3-拟时序分许-3. 数据预处理、对齐和降维
  • 2024华为java面经
  • 光伏电站的方案PPT总结
  • .NET 9.0 LINQ 完全指南:从基础到高级应用场景
  • Excel表数学于三角函数、统计函数
  • 交换排序——快速排序3 针对LeetCode某OJ的优化
  • 基于ToLua的C#和Lua内存共享方案保姆级教程
  • STM32 的 DCMI 接口与 ESP32 的 DVP 接口的区别与作用
  • 在Ubuntu上部署Open WebUI和Ollama,打造你的私人GPT
  • LabVIEW 2024 安装教程
  • 深入理解 Maven 生命周期与常用命令:从编译到安装
  • 基于Excel项目计划生成Gantt甘特图 - Python源码
  • 5G 现网信令参数学习(3) - RrcSetup(2)
  • 【氮化镓】用于低压射频电源的具有80.4% PAE的Si基E-Mode AlN/GaN HEMT