|
MAX32630FTHR设计笔记(2):GPIO的输入模式配置及输出模式需要注意的问题
[复制链接]
本帖最后由 Justice_Gao 于 2017-7-3 16:05 编辑
今天再来分享一下GPIO的输入模式配置,GPIO的输出模式配置请看另一篇帖子MAX32630FTHR设计笔记(1):流水灯(GPIO输出配置)及I2C驱动MAX14690
(1)GPIO的输入模式配置
/************************************************************************
获取GPIO输入电平状态:调用函数GPIO_InGet();
举例:获取P3_3的输入电平状态
第一步:初始化,可以选择以上两种方法,这里我选择第二种方法
const gpio_cfg_t ADDR_Pin[]={
{ PORT_3, PIN_3, GPIO_FUNC_GPIO, GPIO_PAD_INPUT_PULLUP },
{ PORT_3, PIN_4, GPIO_FUNC_GPIO, GPIO_PAD_INPUT_PULLUP }
};
第二步:调用函数获取电平状态
GPIO_InGet(&ADDR_Pin[0]);
需要注意的是,和STM32F不同,这里获取不是逻辑1和0电平,这里GPIO_InGet(&ADDR_Pin[0])=0x00000008,
很好理解,对应的P3_3为高电平1,若其他为0,得到的值为0x00000008
缺点:在进行逻辑判断时,需要计算哪一位为1,比如说P3_7的第八位,对应的值需要计算
优化:max32625的库函数是只读属性,如果想要获取逻辑1和0状态,类似STM32F4的获取方法,则可修改函数GPIO_InGet()
首先,将gpio.h文件的只读属性去掉,源代码如下:
__STATIC_INLINE uint32_t GPIO_InGet(const gpio_cfg_t *cfg)
{
return (MXC_GPIO->in_val[cfg->port] & cfg->mask);
}
然后,可将上面源代码改为
__STATIC_INLINE uint32_t GPIO_InGet(const gpio_cfg_t *cfg)
{
return ((MXC_GPIO->in_val[cfg->port] & cfg->mask)>>(uint8_t )(log(cfg->mask)/log(2)));
}
这样的话,在进行if逻辑判断时,只需要判断GPIO_InGet()==1还是==0就可以了
**************************************************************************************************/
(2)输出模式需要注意的问题
/************************************************************************
评估板的源程序代码里面有个Board_Init();,这个函数在system_max3263x.c文件中的void $Sub$$__main_after_scatterload(void)函数中,
Board_Init()在系统上电后就运行,主要作用是初始化评估板的所有GPIO口,所以,如果你不注释掉会出现问题,比如当你设置GPIO口输出低电平,但实际
输出为高电平。如果自己移植到代码时,可以自己定义GPIO口的设置,下面是Board_Init函数的内容,主要是对串口,LED,按键输入,以及MAX14690控制GPIO进行了初始化设置
int Board_Init(void)
{
int err;
if ((err = Console_Init()) != E_NO_ERROR) {
MXC_ASSERT_FAIL();
return err;
}
if ((err = LED_Init()) != E_NO_ERROR) {
MXC_ASSERT_FAIL();
return err;
}
if ((err = PB_Init()) != E_NO_ERROR) {
MXC_ASSERT_FAIL();
return err;
}
/* Configure PMIC voltages */
if ((err = MAX14690_Init(&max14690_cfg)) != E_NO_ERROR) {
MXC_ASSERT_FAIL();
return err;
}
/* Configure PMIC LDO output on VBUS detection */
if ((err = MAX14690_InterruptInit()) != E_NO_ERROR) {
MXC_ASSERT_FAIL();
return err;
}
return E_NO_ERROR;
}
(3)GPIO口设置输出1,结果为低电平
如果GPIO口外设接口有1.8V上拉电阻,则输出pad类型可以为GPIO_PAD_OPEN_DRAIN或GPIO_PAD_OPEN_DRAIN_PULLUP,
则逻辑1时输出2.4V高电平,逻辑0时输出0V,配置如下
const gpio_cfg_t GAN_COL_Pin[] = {
{ PORT_4, PIN_0, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_1, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_2, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_3, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
};
如果GPIO扣外设接口没有上拉电阻,为浮空输出,则输出pad类型为GPIO_PAD_OPEN_DRAIN或GPIO_PAD_NORMAL时,
无论逻辑1还是逻辑0输出都为低电平,为解决这种问题,需将输出pad类型设置为GPIO_PAD_OPEN_DRAIN_PULLUP,即
const gpio_cfg_t GAN_COL_Pin[] = {
{ PORT_4, PIN_0, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
{ PORT_4, PIN_1, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
{ PORT_4, PIN_2, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
{ PORT_4, PIN_3, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
};
两种方法比较下来,对于不熟悉STM32开发的新手来说,设置pad类型GPIO_PAD_OPEN_DRAIN_PULLUP较好
|
|