您的位置:首页 > 其它

max32625/max32630学习:GPIO的输入模式配置及输出模式需要注意的问题

2018-03-16 10:09 561 查看
今天再来分享一下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较好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  max32625 max32630 GPIO