开发平台
- 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结构框架
由上图可以很清楚地看到,在配置引脚的时候,需要做的事情还挺多的。
从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库,我觉得很爽了。