• MDK环境 端口复用配置分析GPIO输出


    RT1052程序寄存器配置还是有点特点,这次从学习的角度来分析下GPIO端口的配置。
        以开发板底板上的LED2指示驱动为例:
       一、硬件电路:
            LED2连接M11 GPIO端口。
             <ignore_js_op>
            引脚对应核心板的位置,没有核心板原理图,查找下硬件手册上对应的MCU引脚号
             <ignore_js_op>
            硬件手册上对应MCU引脚号:查找到时GPIO1_IO02
             <ignore_js_op>
        二、主程序:        int main(void){

        gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
        BOARD_ConfigMPU();
        BOARD_InitPins();
        BOARD_BootClockRUN();
        BOARD_InitDebugConsole();
        /* Print a note to terminal. */
        PRINTF("\r\n GPIO Driver example\r\n");
        PRINTF("\r\n The LED is blinking.\r\n");

        GPIO_PinInit(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, &led_config);

        while (1)
        {
            delay();
            if (g_pinSet)
            {
                GPIO_PinWrite(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, 0U);//µãÁÁLED
                g_pinSet = false;                                         //·­×ª
            }
            else
            {
                GPIO_PinWrite(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, 1U);//ϨÃðLED
                g_pinSet = true;                                          //·­×ª
            }
        }
    }
       

        三、函数分析:
            这次主要分析LED 输出端口设置
            BOARD_InitPins函数在pin_mux.c中定义。
        void BOARD_InitPins(void)
        {
         CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03u */

          IOMUXC_SetPinMux(  IOMUXC_GPIO_AD_B0_02_GPIO1_IO02, 0U);                                   
            
          IOMUXC_SetPinMux(  IOMUXC_GPIO_AD_B0_12_LPUART1_TX,  0U);                                    
          IOMUXC_SetPinMux(  IOMUXC_GPIO_AD_B0_13_LPUART1_RX,  0U);                                   
          IOMUXC_SetPinConfig( IOMUXC_GPIO_AD_B0_02_GPIO1_IO02, 0x10B0u);
         }


            复用端口的选择,主要设置这几个寄存器  
           <ignore_js_op>
            这次分析LED输出端口配置,所以就看
            IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_02_GPIO1_IO02,  0U);
             IOMUXC_SetPinConfig( IOMUXC_GPIO_AD_B0_02_GPIO1_IO02, 0x10B0u);
    这两个函数在fsl_iomuxc.h中定义:
            调用函数IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_02_GPIO1_IO02,  0U);
            和函数   IOMUXC_SetPinConfig( IOMUXC_GPIO_AD_B0_02_GPIO1_IO02, 0x10B0u);
            要看下参数的内容
            #define IOMUXC_GPIO_AD_B0_02_GPIO1_IO02 0x401F80C4U0x5U, 0, 0, 0x401F82B4U   //宏定义在fsl_iomuxc.h
    IOMUXC_SetPinMux函数源码:


    static inline void IOMUXC_SetPinMux(
                                        uint32_t muxRegister,
                                        uint32_t muxMode,
                                        uint32_t inputRegister,
                                        uint32_t inputDaisy,
                                        uint32_t configRegister,
                                        uint32_t inputOnfield)
    {
        *((volatile uint32_t *)muxRegister) =
            IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) | IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);

        if (inputRegister)
        {
            *((volatile uint32_t *)inputRegister) = inputDaisy;
        }
    }
             IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode)
           IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);
           这两函数在fsl_iomuxc.h中定义,用于配置地址寄存器中SION和MUX_MODE位。


    #define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_MASK      (0x7U)
    #define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_SHIFT     (0U)
    #define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(x)        (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_SHIFT)) & IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_MASK)
    #define IOMUXC_SW_MUX_CTL_PAD_SION_MASK          (0x10U)
    #define IOMUXC_SW_MUX_CTL_PAD_SION_SHIFT         (4U)
    #define IOMUXC_SW_MUX_CTL_PAD_SION(x)            (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_MUX_CTL_PAD_SION_SHIFT)) & IOMUXC_SW_MUX_CTL_PAD_SION_MASK)


            IOMUXC_SetPinConfig函数源码:
    static inline void IOMUXC_SetPinConfig(
                                           uint32_t muxRegister,
                                           uint32_t muxMode,
                                           uint32_t inputRegister,
                                           uint32_t inputDaisy,
                                           uint32_t configRegister,
                                           uint32_t configValue)
    {
        if (configRegister)
        {
            *((volatile uint32_t *)configRegister) = configValue;
        }
    }
        先看下RT1050芯片手册中0x401F80C4U 地址寄存器的定义:   
           <ignore_js_op>
              下面图中红框内是这个程序配置的参数。
              <ignore_js_op>

           RT1050芯片手册中0x401F82B4U地址寄存器的定义:


             <ignore_js_op>
             <ignore_js_op>
             <ignore_js_op>
            调用函数BOARD_InitPins后,寄存器的配置参数入上图红色方框内容,GPIO1_IO02就配置为输出,开漏使能, Pull/Keeper使能, Keeper模式,100K Ohm 下拉。

            通过LED2端口的设置分析,了解了RT1052复用端口的配置方法,有什么错误的地方,欢迎指出,共同学习。
  • 相关阅读:
    error while loading shared libraries: libhwloc.so.5: cannot open shared object file: No such file or directory
    Mac刷新DNS,修改/etc/hosts立即生效
    zxing生成识别二维码
    电脑M2接口不是磁盘0问题
    WSL
    Ubuntu安装Docker
    Win10关闭自动更新和防护
    Mysql的5种日志
    开发常用工具Windows
    log4j2高危漏洞
  • 原文地址:https://www.cnblogs.com/zhugeanran/p/16379830.html
Copyright © 2020-2023  润新知