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的句柄并初始化了它:

    cpp 复制代码
    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的顶部声明它:

    cpp 复制代码
    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。

相关推荐
ID20241013220637 分钟前
单电源运放
单片机·嵌入式硬件
Matlab程序猿小助手1 小时前
【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·嵌入式硬件·算法·matlab·机器人·无人机
linux_carlos4 小时前
#lwIP 的 Raw API 使用指南
stm32·单片机·mcu·物联网·rtdbs
Graceful_scenery4 小时前
STM32F103系统时钟配置
stm32·单片机·嵌入式硬件
姓刘的哦4 小时前
MCU中的定时器
单片机·嵌入式硬件
xcx0035 小时前
应用于各种小家电的快充协议芯片
单片机·嵌入式硬件·物联网
what&&why6 小时前
stm32与ht7038的项目
stm32·单片机·嵌入式硬件
TeYiToKu7 小时前
笔记整理—linux驱动开发部分(13)块设备
linux·c语言·驱动开发·笔记·嵌入式硬件·arm
BigShark8887 小时前
2025蓝桥杯(单片机)备赛--扩展外设之NE555的使用及定时器1的详细讲解(十)
单片机·职场和发展·蓝桥杯
lucy153027510797 小时前
【青牛科技】芯麦 GC2003:白色家电与安防领域中 ULN2003 的理想替代者
人工智能·科技·单片机·物联网·机器学习·安防·白色家电