本文将介绍K60(Freescale Kinetis K60)和XS128(Freescale S12XS128)的GPIO用法。
K60使用了野火的12年版底层库,请参考《三天入门 Cortex-M4—Kinetis 系列 野火 Kinetics 开发板教程》。
GPIO是通用的输入输出口,你可以设定它的输入输出方向,进行相应的读写。
比如,控制LED灯,你需要设定LED对应管脚的GPIO为输出方向,然后程序中可以对这个管脚赋值从而控制其亮灭;
或者你要读取拨码开关的值,设置拨码对应的管脚为输入方向,程序中即可读取该管脚的电平。
在使用GPIO前,必须要进行初始化,声明输入输出方向。
K60
例子
参考了野火的例子,详见野火开发手册。
/*************************************************************************
* 实验说明:利用LED来显示电平高低(输出)
* 实验操作:无
* 实验效果:LED1每隔1s闪烁一次
* 实验目的:明白如何用51编程风格来设置IO口电平
* 修改时间:2012-2-28 已测试
* 备 注:龙丘P144系统板 LED0 - 3 接PTA14-17
龙丘P100系统板 LED接PTA15
* 参 考:野火Kinetis开发例程
*************************************************************************/
void main(void)
{
uart0Printf("\nmain beginning...\n");
gpio_init (PORTA,15,GPO,HIGH); //初始化 PTA15 :输出高电平 ,即 初始化 LED0,灭
while(1)
{
PTA15_OUT=0; //低电平点亮LED0
delayms(500); //延时500ms
PTA15_OUT=1; //高电平熄灭LED0
delayms(500); //延时500ms
}
}
* 实验说明:利用LED来显示电平高低(输出)
* 实验操作:无
* 实验效果:LED1每隔1s闪烁一次
* 实验目的:明白如何用51编程风格来设置IO口电平
* 修改时间:2012-2-28 已测试
* 备 注:龙丘P144系统板 LED0 - 3 接PTA14-17
龙丘P100系统板 LED接PTA15
* 参 考:野火Kinetis开发例程
*************************************************************************/
void main(void)
{
uart0Printf("\nmain beginning...\n");
gpio_init (PORTA,15,GPO,HIGH); //初始化 PTA15 :输出高电平 ,即 初始化 LED0,灭
while(1)
{
PTA15_OUT=0; //低电平点亮LED0
delayms(500); //延时500ms
PTA15_OUT=1; //高电平熄灭LED0
delayms(500); //延时500ms
}
}
XS128
XS没有底层库,直接配置寄存器。
下面例子是小车开机的端口初始化函数。
主要定义了各GPIO口的输入输出方向。
实际例子
MCUInit.c
void PORT_Init(Bool Choose_LCD,Bool Choose_KEY)
{
MYPORT_CODER0_DATA_DDR = 0b00000000; //CD4520测速数据 输入
MYPORT_CCD_DATA_DDR = 0b00000000; //摄像头数据 输入
MYPORT_SWITCH1_DDR = 0; //拨码开关pin1 输入
MYPORT_SWITCH2_DDR = 0; //拨码开关pin2 输入
MYPORT_SWITCH3_DDR = 0; //拨码开关pin3 输入
MYPORT_SWITCH4_DDR = 0; //拨码开关pin4 输入
MYPORT_CODER0_EN_DDR = 1; //CD4520使能 输出
MYPORT_CODER1_DIR_DDR = 0; //测速模块1方向 输入
MYPORT_CODER0_DIR_DDR = 0; //测速模块2方向 输入
//初始化LED指示灯 输出
LED0_DDR = 1;
LED1_DDR = 1;
LED2_DDR = 1;
if(Choose_LCD)//LCD输出
{
LCD_SCL_DDR = 1;
LCD_SDA_DDR = 1;
LCD_RST_DDR = 1;
LCD_DC_DDR = 1;
}
if(Choose_KEY)//KEY输入
{
MYPORT_SCI2_RXD_DDR = 0;
MYPORT_SCI2_TXD_DDR = 0;
}
/*不配置PTTRR则PWM7-PWM4口默认为PP7-PP4,IOC2-IOC0默认为引脚PT2-PT0 */
}
{
MYPORT_CODER0_DATA_DDR = 0b00000000; //CD4520测速数据 输入
MYPORT_CCD_DATA_DDR = 0b00000000; //摄像头数据 输入
MYPORT_SWITCH1_DDR = 0; //拨码开关pin1 输入
MYPORT_SWITCH2_DDR = 0; //拨码开关pin2 输入
MYPORT_SWITCH3_DDR = 0; //拨码开关pin3 输入
MYPORT_SWITCH4_DDR = 0; //拨码开关pin4 输入
MYPORT_CODER0_EN_DDR = 1; //CD4520使能 输出
MYPORT_CODER1_DIR_DDR = 0; //测速模块1方向 输入
MYPORT_CODER0_DIR_DDR = 0; //测速模块2方向 输入
//初始化LED指示灯 输出
LED0_DDR = 1;
LED1_DDR = 1;
LED2_DDR = 1;
if(Choose_LCD)//LCD输出
{
LCD_SCL_DDR = 1;
LCD_SDA_DDR = 1;
LCD_RST_DDR = 1;
LCD_DC_DDR = 1;
}
if(Choose_KEY)//KEY输入
{
MYPORT_SCI2_RXD_DDR = 0;
MYPORT_SCI2_TXD_DDR = 0;
}
/*不配置PTTRR则PWM7-PWM4口默认为PP7-PP4,IOC2-IOC0默认为引脚PT2-PT0 */
}
下面是部分宏定义Global.h
#define MYPORT_SWITCH1 PTM_PTM4
#define MYPORT_SWITCH2 PTM_PTM6
#define MYPORT_SWITCH3 PTJ_PTJ6
#define MYPORT_SWITCH4 PTJ_PTJ7
#define MYPORT_SWITCH1_DDR DDRM_DDRM4
#define MYPORT_SWITCH2_DDR DDRM_DDRM6
#define MYPORT_SWITCH3_DDR DDRJ_DDRJ6
#define MYPORT_SWITCH4_DDR DDRJ_DDRJ7
#define MYPORT_CODER0_DIR_DDR DDRE_DDRE5
#define MYPORT_CODER0_DIR PORTE_PE5
#define MYPORT_CODER0_EN_DDR DDRT_DDRT2
#define MYPORT_CODER0_EN PTT_PTT2
#define MYPORT_CODER0_DATA PORTA
#define MYPORT_CODER0_DATA_DDR DDRA
#define MYPORT_CODER1_DIR_DDR DDRE_DDRE4
#define MYPORT_CODER1_DIR PORTE_PE4
#define MYPORT_CODER1_EN PACTL_PAEN
#define MYPORT_CODER1_DATA PACNT
#define MYPORT_LED0 PTM_PTM0
#define MYPORT_LED1 PTM_PTM1
#define MYPORT_LED2 PTM_PTM2
#define MYPORT_LED0_DDR DDRM_DDRM0
#define MYPORT_LED1_DDR DDRM_DDRM1
#define MYPORT_LED2_DDR DDRM_DDRM2
#define MYPORT_SWITCH2 PTM_PTM6
#define MYPORT_SWITCH3 PTJ_PTJ6
#define MYPORT_SWITCH4 PTJ_PTJ7
#define MYPORT_SWITCH1_DDR DDRM_DDRM4
#define MYPORT_SWITCH2_DDR DDRM_DDRM6
#define MYPORT_SWITCH3_DDR DDRJ_DDRJ6
#define MYPORT_SWITCH4_DDR DDRJ_DDRJ7
#define MYPORT_CODER0_DIR_DDR DDRE_DDRE5
#define MYPORT_CODER0_DIR PORTE_PE5
#define MYPORT_CODER0_EN_DDR DDRT_DDRT2
#define MYPORT_CODER0_EN PTT_PTT2
#define MYPORT_CODER0_DATA PORTA
#define MYPORT_CODER0_DATA_DDR DDRA
#define MYPORT_CODER1_DIR_DDR DDRE_DDRE4
#define MYPORT_CODER1_DIR PORTE_PE4
#define MYPORT_CODER1_EN PACTL_PAEN
#define MYPORT_CODER1_DATA PACNT
#define MYPORT_LED0 PTM_PTM0
#define MYPORT_LED1 PTM_PTM1
#define MYPORT_LED2 PTM_PTM2
#define MYPORT_LED0_DDR DDRM_DDRM0
#define MYPORT_LED1_DDR DDRM_DDRM1
#define MYPORT_LED2_DDR DDRM_DDRM2
要改变LED亮灭,直接给寄存器赋值即可。
LED0=1; //赋值为高电平,亮灭取决于电路设计。
其中宏定义了
#define MYPORT_LED0 PTM_PTM0
#define LED0 MYPORT_LED0
#define LED0 MYPORT_LED0