要想掌握开发板的使用,GPIO口是较好的入口。本打算先点亮开发板上的LED0~LED2,却没想到人家根本就没直接接在GPIO口上,而是接在一个以I2C方式工作的芯片上,于是只好先找个引脚以外挂LED模块的方式来学习GPIO口的使用。
图1 LED电路
为了防止引脚在使用上的冲突,选了一个没被占用的PE4来连接LED模块。
为此,对端口和引脚的定义为:
#define LED_G_PORT (GPIO_PORT_E)
#define LED_G_PIN (GPIO_PIN_04)
相应的使LED灯执行异或操作的引脚定义为:
#define LED_G_TOGGLE() (GPIO_TogglePins(LED_G_PORT, LED_G_PIN))
实现引脚初始化函数为:
static void LED_Init(void)
{
stc_gpio_init_t stcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(LED_G_PORT, LED_G_PIN, &stcGpioInit);
}
使LED灯产生闪烁效果的主程序为:
int32_t main(void)
{
/* Register write enable for some required peripherals. */
LL_PERIPH_WE(LL_PERIPH_GPIO);
/* LED initialize */
LED_Init();
/* Register write protected for some required peripherals. */
LL_PERIPH_WP(LL_PERIPH_GPIO);
for (;;) {
LED_G_TOGGLE();
DDL_DelayMS(DLY_MS);
}
}
经编译下载,其执行效果如图2和图3所示。
图2 熄灭状态
图3 点亮状态
在开发板上配置了一个3*3按键矩阵,其电路及引脚占用见图4和图5所示。为此,要获取键值 需要以扫描的方式来处理。
图4 按键电路
图5 引脚占用
这里仅以按键1来控制LED灯的亮灭,故将KEYOUT0置为低电平,而将KEYOUT1 和KEYOUT2置为高电平,并通过读取KEYIN0的状态来控制LED。
其对KEY所用引脚的定义为:
#define KEY1_O_PORT (GPIO_PORT_C)
#define KEY1_O_PIN (GPIO_PIN_11)
#define KEY2_O_PORT (GPIO_PORT_C)
#define KEY2_O_PIN (GPIO_PIN_08)
#define KEY3_O_PORT (GPIO_PORT_A)
#define KEY3_O_PIN (GPIO_PIN_06)
#define KEY0_I_PORT (GPIO_PORT_I)
#define KEY0_I_PIN (GPIO_PIN_08)
对KEY所用引脚的初始化函数为:
static void KEY_Init(void)
{
stc_gpio_init_t stcGpioInit;
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(KEY1_O_PORT, KEY1_O_PIN, &stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
GPIO_Init(KEY2_O_PORT, KEY2_O_PIN, &stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(KEY3_O_PORT, KEY3_O_PIN, &stcGpioInit);
GPIO_SetPins(KEY1_O_PORT, KEY1_O_PIN);
GPIO_SetPins(KEY2_O_PORT, KEY2_O_PIN);
GPIO_SetPins(KEY3_O_PORT, KEY3_O_PIN);
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinDir = PIN_DIR_IN;
stcGpioInit.u16PullUp = PIN_PU_ON;
(void)GPIO_Init(KEY0_I_PORT, KEY0_I_PIN, &stcGpioInit);
}
实现按键控制LED灯的主程序为:
int32_t main(void)
{
LL_PERIPH_WE(LL_PERIPH_GPIO);
LED_Init();
KEY_Init();
LL_PERIPH_WP(LL_PERIPH_GPIO);
for (;;) {
if(GPIO_ReadInputPins(KEY0_I_PORT, KEY0_I_PIN)==0)
{
GPIO_SetPins(LED_G_PORT, LED_G_PIN);
}
else
{
GPIO_ResetPins(LED_G_PORT, LED_G_PIN);
}
}
}
经程序的下载测试,其运行效果如图6所示。
图6 点亮状态
这样就基本完成了GPIO口的使用方法,后面就可以用它来驱动相应的器件工作了。