UART的“配置”

本文详细介绍了如何通过IAR配置UART模块。重点在于预编译宏HAL_UART的定义及HAL_UART_DMA与HAL_UART_ISR的选择,解释了如何根据不同的硬件平台选择使用DMA还是中断的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      这里所说的“配置”,是指告诉IAR:我要使用UART这个模块了,请给我“初始化”。因为在main函数中调用了如下函数:

      /* Initialze the HAL driver */
      HalDriverInit();   //各种驱动的初始化、如按键、lcd、adc、usb、uart等

      而在函数HalDriverInit()中有这么一句话:
      

      /* UART */
      #if (defined HAL_UART) && (HAL_UART == TRUE)
         HalUARTInit();
      #endif

      可见,只有在预编译时#define HAL_UART,并且HAL_UART == TRUE,IAR才会去调用HalUARTInit()函数,即UART的初始化函数。
      而#define HAL_UART可以在如下位置进行:
      这里写图片描述

    ————————————-+++———————————–

      这个配置的实现是在《hal_board_cfg.h》文件中实现的,这个文件一般在这个地方:
      这里写图片描述
      
      代码如下:
      

    #if HAL_UART
    // Always prefer to use DMA over ISR.
    #if HAL_DMA
      #ifndef HAL_UART_DMA
        #if (defined ZAPP_P1) || (defined ZTOOL_P1)
          #define HAL_UART_DMA  1
        #elif (defined ZAPP_P2) || (defined ZTOOL_P2)
          #define HAL_UART_DMA  2
        #else
          #define HAL_UART_DMA  1
        #endif
      #endif
      #ifndef HAL_UART_ISR
        #define HAL_UART_ISR  0
      #endif
    #else
      #ifndef HAL_UART_ISR
        #if (defined ZAPP_P1) || (defined ZTOOL_P1)
          #define HAL_UART_ISR  1
        #elif (defined ZAPP_P2) || (defined ZTOOL_P2)
          #define HAL_UART_ISR  2
        #else
          #define HAL_UART_ISR  1
        #endif
      #endif
      #ifndef HAL_UART_DMA
        #define HAL_UART_DMA  0
      #endif
    #endif
    
    // Used to set P2 priority - USART0 over USART1 if both are defined.
    #if ((HAL_UART_DMA == 1) || (HAL_UART_ISR == 1))
    #define HAL_UART_PRIPO             0x00
    #else
    #define HAL_UART_PRIPO             0x40
    #endif
    
    #else
    #define HAL_UART_DMA  0
    #define HAL_UART_ISR  0
    #endif
    

      这样看起来,结构比较混乱,不容易从整体上把握一下这段代码的意思,我接住Notepad++来分析:
      这里写图片描述
      
      注意:这里使用的就是代码左边的“+”和“-”,来进行代码的结构折叠。注释如下(行号会改变):
      这里写图片描述
      
      可见:UART是优先使用DMA的,而不是Interrupt。

    展锐平台上的 UART 接口配置通常涉及硬件和软件两个层面。在硬件方面,需要确保引脚定义正确且没有冲突;在软件方面,则主要通过设备树(DTS)文件进行相关配置。 ### 硬件配置 1. **确认 UART 引脚定义**:根据展锐平台的规格书或参考设计文档,确定每个 UART 接口所使用的物理引脚及其功能。 2. **避免引脚冲突**:如果要将原本用于调试的 UART 口(如 UART1)改为通信用途,请确保该接口没有被其他外设占用。 3. **电气连接**:确保 UART 接口与目标设备之间的电平匹配,必要时添加电平转换电路。 ### 软件配置 #### 修改 DTS 文件 对于展锐平台,默认情况下 UART0 通常用作通信口,而 UART1 则是调试口。如果需要更改调试口为通信口,可以通过修改 DTS 文件来实现[^1]: 1. 打开设备树源文件(通常是 `.dts` 或 `.dtsi` 文件)。 2. 在 `chosen` 节点中,设置 `stdout-path` 指向希望作为调试输出的 UART 控制器,例如: ```dts chosen { stdout-path = &uart0; }; ``` 3. 如果需要关闭特定 UART 的调试日志打印功能,可以注释掉相关的 `bootargs` 中的 `console` 参数,或者直接移除调试相关的选项。 #### 示例代码片段 以下是一个典型的设备树配置示例,展示了如何调整 UART 配置以适应不同的需求: ```dts &uart0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&uart0_pins>; }; &uart1 { status = "disabled"; // 更改状态为 disabled 来禁用调试输出 }; ``` #### 动态调整 在某些情况下,可能还需要通过内核模块或驱动程序动态地启用或禁用 UART 接口的功能。这通常涉及到编写特定的初始化脚本或使用 sysfs 接口来进行实时调整。 ### 注意事项 - **测试验证**:完成配置后,务必进行充分的功能测试,确保 UART 接口能够正常工作,并且不会影响到系统的稳定性。 - **备份原始配置**:在修改任何系统文件之前,请务必备份原始配置,以便于出现问题时能够快速恢复。 通过上述步骤,可以有效地对展锐平台上的 UART 接口进行重新配置,使其更好地满足项目需求。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值