2193|0

98

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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较好



点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表