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。

相关推荐
weixin_11223310 小时前
基于STM32闭环步进电机控制系统设计说明
stm32·单片机·嵌入式硬件
机器视觉知识推荐、就业指导11 小时前
STC89C52系列单片机简介
单片机·嵌入式硬件·51单片机
qq_259297247312 小时前
STM32
嵌入式硬件
qq_21513832713 小时前
【51单片机-B020】【protues仿真】基于51单片机智能晾衣架仿真
单片机·嵌入式硬件
小猪写代码13 小时前
STM32 GPIO的八种工作模式
stm32·单片机·嵌入式硬件·gpio
1+2单片机电子设计13 小时前
STM32 单片机的停车场管理系统设计与实现
stm32·单片机·嵌入式硬件·51单片机
如愿小李14 小时前
STM32之土壤湿度传感器模块
stm32·单片机·嵌入式硬件
weixin_5803820615 小时前
UART Hal库与寄存器比较
stm32·单片机·嵌入式硬件
景彡先生16 小时前
STM32以太网开发详解:基于LwIP协议栈实现TCP/UDP通信(附网络摄像头案例)
网络·stm32·tcp/ip