RT1052 GPIO配置

开发平台

  • Board:野火RT1052-MINI
  • IDE:Keil 5.28
    最近电脑重装了,在keil的官网上发现keil已经更新到Keil 5.28了,于是便直接下载了keil 5.28来体验一下。个人感觉Keil 5.28用起来更5.25没什么太大区别,但是我倒是发现,5.28不想5.25那样支持传统兼容包。也就是如果你看的程序是4.27以下的版本,那就需要自己重新安装多一个Keil4,而不像5.25那样可以直接安装一个传统支持包之后,就兼容两者。我也发现编译速度貌似快了点。

RT1052 GPIO结构框架

图片摘自野火I.MX RT1052开发实战指南
由上图可以很清楚地看到,在配置引脚的时候,需要做的事情还挺多的。
从1开始,1是在图上成为PAD,代表一个RT1052的GPIO引脚,在这里可以配置GPIO的我输入、输出方向,以及输出的高低电平控制。不管配置成输入还是输出,Data_out \Data_in都经过IOMUX这个管理器,这个器件其实就GPIO口的复用配置管理器,其实在学习Kinetis K60的时候,也都已经遇到过了,配置复用时,都会出现MUX的字样(当然啦,手册上面也是这样写的)。

RT1052 GPIO 配置

RT1052的GPIO在输出缓冲区使能的时候,有如下的配置:

  • 1、DSE 驱动能力。
  • 2、SRE 压摆率配置。
  • 3、SPEED 带宽配置。
  • 4、ODE 开漏输出配置。

RT1052的GPIO在输入缓冲区使能时,有如下的配置:

  • 1、 HYS 滞后使能。(这东西可就厉害了,在设计产品的时候,经常需要做EMC检测,而这个输入配置,正巧可以很好地让EMC检测通过,是硬件工程师很喜欢的一个配置。)

有了这几看起来奇奇怪怪的配置之后,就剩下一个经常见到了配置了,没错就是引脚的上下拉配置。同样的,如果接触过Kinetis K60的话,应该觉得是一样的。

  • 配置上下拉之前是需要先是能上下拉功能,否则配置无效。
  • 使能上下拉之后,再进行上下拉选择,选择上拉还是下拉。
  • RT1052就厉害了,多了一个电阻的选项配置,可以选择不同欧姆的上下拉电阻。

选择完成之后,基本上GPIO的基本功能就完成配置了,但是呢,还不能用。最大的原因是没有选择复用。基本上飞思卡尔的MCU,GPIO默认的,很多是禁用功能(还是那句,用过Kinetis K60都知道,很伤感)。如果不进行IO口复用模式选择,那这个IO口,除非正好就是默认成你想要的功能,否则基本上不能用。复用功能同样的,也是ALT0-ALT7之间进行选择,跟K60一样。

  • MUX复用选择,选择好你要的复用功能。
  • 将复用好的GPIO与配置好的PAD属性进行链接。

基本上配置完上述功能之后,GPIO就可以开始用了,是不是感觉非常地复杂,但其实,你跟K60进行对比一下之后,你会发现,其实只是在K60的基础上,再增加一些东西,就可以了。万事先从点灯开始。

附带一下配置程序,基于SDK包配置的,

led.h

#ifndef __led_h
#define __led_h

#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "fsl_gpio.h"

#define LED_ON      1
#define LED_OFF     0

#define LED_R_PORT      GPIO1
#define LED_G_PORT      GPIO1
#define LED_B_PORT      GPIO1

#define LED_R_PIN       24U         //GPIO_AD_B1_08
#define LED_G_PIN       25U         //GPIO_AD_B1_09
#define LED_B_PIN       10U         //GPIO_AD_B0_10


#define LED_R_MUX       IOMUXC_GPIO_AD_B1_08_GPIO1_IO24
#define LED_G_MUX       IOMUXC_GPIO_AD_B1_09_GPIO1_IO25
#define LED_B_MUX       IOMUXC_GPIO_AD_B0_10_GPIO1_IO10

void led_init(void);
void led_on(uint32_t LED_X_PIN);
void led_off(uint32_t LED_X_PIN);
void led_toggle(uint32_t LED_X_PIN);

#endif

led.c

#include "led.h"

#define LED_PAD_CONFIG_DATA            (IOMUXC_SW_PAD_CTL_PAD_SRE(0) | \
                                        IOMUXC_SW_PAD_CTL_PAD_DSE(6) | \
                                        IOMUXC_SW_PAD_CTL_PAD_SPEED(2) | \
                                        IOMUXC_SW_PAD_CTL_PAD_ODE(0) | \
                                        IOMUXC_SW_PAD_CTL_PAD_PKE(0) | \
                                        IOMUXC_SW_PAD_CTL_PAD_PUE(0) | \
                                        IOMUXC_SW_PAD_CTL_PAD_PUS(0) | \
                                        IOMUXC_SW_PAD_CTL_PAD_HYS(0))


static void led_gpio_mux_config(void)     //设置GPIO复用
{
    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09,0U);  //CORE LED
    
    IOMUXC_SetPinMux(LED_R_MUX,0U);         
    IOMUXC_SetPinMux(LED_G_MUX,0U);
    IOMUXC_SetPinMux(LED_B_MUX,0U);
}
    
static void led_gpio_pad_config(void)   //设置GPIO PAD
{
    IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09,LED_PAD_CONFIG_DATA);
    
    IOMUXC_SetPinConfig(LED_R_MUX,LED_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(LED_G_MUX,LED_PAD_CONFIG_DATA);
    IOMUXC_SetPinConfig(LED_B_MUX,LED_PAD_CONFIG_DATA);
}

static void led_gpio_mode_config()
{
    gpio_pin_config_t led_config;
    
    led_config.direction =  kGPIO_DigitalOutput;
    led_config.interruptMode = kGPIO_NoIntmode;
    led_config.outputLogic = 1U;
    
    GPIO_PinInit(GPIO1, 9u,&led_config);
    
    GPIO_PinInit(LED_R_PORT, LED_R_PIN,&led_config);
    GPIO_PinInit(LED_G_PORT, LED_G_PIN,&led_config);
    GPIO_PinInit(LED_B_PORT, LED_B_PIN,&led_config);
}

void led_init(void)
{
    led_gpio_mux_config();
    led_gpio_pad_config();
    led_gpio_mode_config();
}

void led_on(uint32_t LED_X_PIN)
{
    GPIO_PinWrite(LED_R_PORT,LED_X_PIN,0U);
}


void led_off(uint32_t LED_X_PIN)
{
    GPIO_PinWrite(LED_R_PORT,LED_X_PIN,1U);
}

void led_toggle(uint32_t LED_X_PIN)
{
    GPIO_PinWrite(LED_R_PORT,LED_X_PIN,(1 - GPIO_PinRead(LED_R_PORT, LED_X_PIN)));
}

这样一个LED的电灯驱动基本写完了,很多像

IOMUXC_SW_PAD_CTL_PAD_SRE()

这种函数,也像在K60上帮你宏定义好了,在相应的地方,打寄存器名字,即可找到你想要的。

个人感觉SDK的编译也是挺慢的,所以在工程配置上,如果哪些不需要用的驱动,可以先删减,
在这里插入图片描述
像我这样就好了。
这样的话,完全编译一次,只需要40s(不同电脑不一样)
在这里插入图片描述
我感觉还行吧,比起ST的HAL库,我觉得很爽了。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值