查看: 5880|回复: 2

RT1052+5、MDK环境 端口复用配置分析--GPIO输出

[复制链接]
  • TA的每日心情
    开心
    前天 19:54
  • 签到天数: 1498 天

    连续签到: 3 天

    [LV.10]以坛为家III

    152

    主题

    3173

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8716
    最后登录
    2025-8-17
    发表于 2018-10-25 00:18:19 | 显示全部楼层 |阅读模式
        RT1052程序寄存器配置还是有点特点,这次从学习的角度来分析下GPIO端口的配置。
        以开发板底板上的LED2指示驱动为例:
       一、硬件电路:
            LED2连接M11 GPIO端口。
             1.png
            引脚对应核心板的位置,没有核心板原理图,查找下硬件手册上对应的MCU引脚号
             2.png
            硬件手册上对应MCU引脚号:查找到时GPIO1_IO02
             3.png
        二、主程序:        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);
         }


            复用端口的选择,主要设置这几个寄存器  
           9.png
            这次分析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 0x401F80C4U, 0x5U, 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 地址寄存器的定义:   
           4.png
              下面图中红框内是这个程序配置的参数。
              5.png

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


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

            通过LED2端口的设置分析,了解了RT1052复用端口的配置方法,有什么错误的地方,欢迎指出,共同学习。


    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情

    2021-2-4 09:24
  • 签到天数: 190 天

    连续签到: 1 天

    [LV.7]常住居民III

    38

    主题

    591

    帖子

    28

    金牌会员

    Rank: 6Rank: 6

    积分
    2207
    最后登录
    2025-8-11
    发表于 2018-10-25 08:55:54 | 显示全部楼层
    写得很好,感觉这个pinmode跟imx6是非常相似
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4692

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10093
    最后登录
    2025-8-8
    发表于 2018-10-25 13:17:38 | 显示全部楼层
    引脚模式多了开关矩阵方式,所以配置的时候参数就较多了。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-19 03:59 , Processed in 0.091312 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表