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复用端口的配置方法,有什么错误的地方,欢迎指出,共同学习。

posted on 2022-06-15 21:07  张凌001  阅读(397)  评论(0编辑  收藏  举报

导航