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。

相关推荐
ACP广源盛139246256732 小时前
GSV2201S(1201S)@ACP#支持嵌入式 MCU 的 DisplayPort 1.4 到 HDMI 2.0 转换器
单片机·嵌入式硬件·电脑·音视频
d111111111d2 小时前
MPU6050简介(学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习
芯岭技术10 小时前
不到一块钱的带USB 2.4G收发 SOC芯片,集成2.4G射频 32位MCU
单片机·嵌入式硬件
普中科技11 小时前
【普中DSP28335开发攻略】-- 第 15 章 外部中断实验
单片机·嵌入式硬件·开发板·外部中断·dsp28335·普中科技
IT阳晨。12 小时前
【STM32】ADC
stm32·单片机·嵌入式硬件
纳祥科技13 小时前
方案分享:一款基于高性能单片机的落日灯方案
单片机·嵌入式硬件
三佛科技-1341638421214 小时前
智能保温杯方案,保温杯MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
Wave84516 小时前
STM32_标准库转hal库
stm32·单片机·嵌入式硬件
智者知已应修善业17 小时前
【51单片机:两边向中间流水:即两边先点亮然后熄灭,次边的点亮再熄灭,直到最中间的两个点亮再熄灭,然后重复动作。】2023-3-4
c语言·c++·经验分享·笔记·嵌入式硬件·算法·51单片机
嵌入式软硬件攻城狮17 小时前
6.单片机回调函数
单片机·嵌入式硬件