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 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 地址寄存器的定义:
<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复用端口的配置方法,有什么错误的地方,欢迎指出,共同学习。
以开发板底板上的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 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 地址寄存器的定义:
<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复用端口的配置方法,有什么错误的地方,欢迎指出,共同学习。