打印
[牛人杂谈]

NUC970 通用GPIO输入问题

[复制链接]
642|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2021-6-5 20:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
测试发现IO输出没问题,输入必须开启CMOS缓冲或者施密特触发,这个在手册上面么有提到,目前使用都是开启了CMOS缓冲区才能做为输入IO,否则输入读取的数据无法反应IO状态。

*************************************************************************************************************************
* 函数                        :        void SYS_GPIOx_OneInit(GPIO_TypeDef *GPIOx, u8 io_num, SYS_GPIO_MODE mode, u8 InMode)
* 功能                        :        初始化一个IO
* 参数                        :        GPIOx:GPIO对象;io_num:io索引,从0开始;mode:IO模式;InMode:输入模式设置
* 返回                        :        无
* 依赖                        :        底层与OS
* 作者                        :        cp1300@139.com
* 时间                        :        2020-09-01
* 最后修改时间         :         2020-09-01
* 说明                        :        用于初始化一个IO
                                        InMode:输入模式
                                        GPIO_IN_NONE                0                        //默认的输入模式
                                        GPIO_IN_DE_BOUNCE        (1<<0)                //输入消抖
                                        GPIO_IN_CMOS                (1<<1)                //CMOS输入缓冲
                                        GPIO_IN_SCHMITT                (1<<2)                //施密特触发器
                                        CMOS输入缓冲与施密特触发器只能二选一,输入不能设置为GPIO_IN_NONE
*************************************************************************************************************************/
void SYS_GPIOx_OneInit(GPIO_TypeDef *GPIOx, u8 io_num, SYS_GPIO_MODE mode, u8 InMode)
{
        if(io_num > 15) return;
       
        if(mode & 0x010000)        //输出
        {
                GPIOx->DBEN &= ~(1 << io_num);        //去掉输入消抖
                GPIOx->ICEN &= ~(1 << io_num);        //去掉输入CMOS缓冲
                GPIOx->ISEN &= ~(1 << io_num);        //去掉施密特触发器
                GPIOx->DIR |= 1 << io_num;
        }
        else //如果做为输入,必须开启CMOS或施密特
        {
                GPIOx->DIR &= ~(1 << io_num);
                if(InMode == GPIO_IN_NONE) InMode|= GPIO_IN_CMOS;        //2020-10-20 输入模式必须选择GPIO_IN_CMOS或GPIO_IN_SCHMITT,否则没法读取到IO数据

                //输入消抖
                if(InMode & GPIO_IN_DE_BOUNCE)
                {
                        GPIOx->DBEN |= 1 << io_num;
                }
                else
                {
                        GPIOx->DBEN &= ~(1 << io_num);
                }
               
                //输入CMOS缓冲器
                if(InMode & GPIO_IN_CMOS)
                {
                        InMode &= ~GPIO_IN_SCHMITT;                //如果使能了CMOS,则去掉施密特触发器
                        GPIOx->ICEN |= 1 << io_num;
                }
                else
                {
                        GPIOx->ICEN &= ~(1 << io_num);
                }
                //输入施密特触发器
                if(InMode & GPIO_IN_SCHMITT)
                {
                        GPIOx->ISEN |= 1 << io_num;
                }
                else
                {
                        GPIOx->ISEN &= ~(1 << io_num);
                }
        }
        //先清除上下拉
        GPIOx->PUEN &= ~(1 << io_num);
        GPIOx->PDEN &= ~(1 << io_num);
        if(mode & 0x000100)        //上拉
        {
                GPIOx->PUEN |= 1 << io_num;
        }
        else if(mode & 0x000200) //下拉
        {
                GPIOx->PDEN |= 1 << io_num;
        }
       
}


使用特权

评论回复
沙发
gwsan|  楼主 | 2021-6-5 20:56 | 只看该作者
//GPIO模式定义 第三个8位:输入输出; 第二个8位:上下拉; 第一个8位 输入类型
typedef enum
{
        OUT_PP                        =        0x010000,                //推挽输出
        OUT_PP_OPU                =        0x010100,                //上拉推挽输出
        OUT_PP_OPD                =        0x010200,                //下拉推挽输出
       
        IN_FLOATING         =        0x000000,                //浮空输入
        IN_IPU                        =        0x000100,                //上拉输入
        IN_IPD                        =        0x000200,                //下拉输入
}SYS_GPIO_MODE;
//输入模式
#define GPIO_IN_NONE                0                        //默认的输入模式
#define GPIO_IN_DE_BOUNCE        (1<<0)                //输入消抖
#define GPIO_IN_CMOS                (1<<1)                //CMOS输入缓冲与施密特触发器只能二选一
#define GPIO_IN_SCHMITT                (1<<2)                //施密特触发器


SYS_GPIOx_OneInit(GPIOA,1,IN_FLOATING,GPIO_IN_CMOS)//SDA输入模式


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

3434

帖子

1

粉丝