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.c和uart_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。

相关推荐
en.en..16 分钟前
STM32入门最佳学习顺序(寄存器→标准库→HAL库)
单片机·嵌入式硬件
Good白10192 小时前
嵌入式:1.嵌入式入门|初识嵌入式、处理器、ARM与STM32
arm开发·stm32·嵌入式硬件
二本咕咕-机械转码2 小时前
FreeRTOS深入解析(八)IPC机制之FromISR详解
数据结构·单片机·链表
小李不想当小白2 小时前
HAL库之UART(STM32 HAL库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
Dev_XH2 小时前
【成品设计】基于物联网的旅游生态农业互动系统
stm32·单片机·嵌入式硬件·物联网·旅游
Industio_触觉智能15 小时前
RK3506 Buildroot系统目录地图-上|7个关键符号链接与构建产物全解析
嵌入式硬件·sdk·智能硬件·固件·瑞芯微·系统编译·rk3506
lzj_pxxw18 小时前
STM32移植FreeRTOS(Cmake+CubeMX)
vscode·stm32·嵌入式硬件
Zwawa19 小时前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
물の韜20 小时前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
Zw-awa21 小时前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
stm32