5577|18

932

帖子

3

TA的资源

纯净的硅(中级)

楼主
 

怎么读不到引脚的状态 [复制链接]

 
    我是通过4+3位拨码开关让用户任意设置两个数据,程序将这两个数据读入再进行相应的处理。我将PC端口的0~3位为一组、4~6位为一组,GPIO配置的代码如下:
void port_C_Config(void)
{
//    gpio_deinit(GPIOC);               //重置PC端口
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
}

    我开始引脚为上拉方式,外部用拨码开关控制接地,但发现单片机相应引脚的电压仅为0.9~1.2V左右。后来只好改为下拉方式,外部用拨码开关控制接Vcc,确保能够正确设置。
    读取引脚数据采取了从高位读起,逐位乘以2再加下位数值。
    首先我用下面的代码直接逐位取数及计算,但得到的结果是零。
devi = gpio_input_bit_get(GPIOC,GPIO_PIN_6);
devi = (devi * 2) + gpio_input_bit_get(GPIOC,GPIO_PIN_5);
devi = (devi * 2) + gpio_input_bit_get(GPIOC,GPIO_PIN_4);

    然后我改用if语句将读入引脚的状态判断后再计算,仍旧得不到的结果。
if (SET == gpio_input_bit_get(GPIOC,GPIO_PIN_3))
        stan = 1;
else stan = 0;

if (SET == gpio_input_bit_get(GPIOC,GPIO_PIN_2))
     stan = (stan * 2) + 1;
    else stan = stan * 2;

    if (SET == gpio_input_bit_get(GPIOC,GPIO_PIN_1))
        stan = (stan * 2) + 1;
    else stan = stan * 2;

if (SET == gpio_input_bit_get(GPIOC,GPIO_PIN_0))
        stan = (stan * 2) + 1;
else stan = stan * 2;

此帖出自GD32 MCU论坛

最新回复

GPIO_PUPD_PULLDOWN GPIO_PUPD_PULLUP  详情 回复 发表于 2018-9-12 16:58
点赞 关注(1)
 

回复
举报

932

帖子

3

TA的资源

纯净的硅(中级)

沙发
 
    请问是什么原因读不到引脚的数据,是不是还有哪里没有设置好?

    硬件连接是反复检查过的,不会有错误。按说设置引脚为上拉时,引脚外部空置时,读入的数据也应该是1,但我读入的却是零;引脚设置为下拉时,外部用拨码开关接电源5V,为啥还是读不到1?
此帖出自GD32 MCU论坛
 
 
 

回复

693

帖子

7

TA的资源

版主

板凳
 
你在操作PC口时,请检查在代码里面有没有配置时钟,如果配置了始终,在检查有没有先初始化IO口,初始化很重要,不然你怎么操作都是没用的
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

4
 
本帖最后由 hujj 于 2018-9-9 10:11 编辑

void port_C_Config(void)
{
//    gpio_deinit(GPIOC);               //重置PC端口
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
}

端口的时钟配置了的(见上面的代码),只是引脚的速度没有配置,因为我仅仅作输入用的。初始化的命令gpio_deinit()我用过,但没有变化,我再试试看,感谢回复!
此帖出自GD32 MCU论坛

点评

有使用的外设时钟全部使能了吗?l另外gpio口支持5v吗? 最好把你使用的芯片报上来,这样比较好解答,全部看代码又没注释只能靠猜太累了  详情 回复 发表于 2018-9-9 14:35
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

5
 
我将PC端口的配置代码修改交替模式,依旧读不到引脚状态,不知是何原因,请各位帮忙看看,谢谢!
void port_C_Config(void)
{
    gpio_deinit(GPIOC);                 //重置PC端口
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_af_set(GPIOC,GPIO_AF_0,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
    gpio_mode_set(GPIOC,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
//        gpio_bit_set(GPIOC,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
        gpio_bit_write(GPIOC,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,SET);
       
}
此帖出自GD32 MCU论坛
 
 
 

回复

424

帖子

6

TA的资源

一粒金砂(高级)

6
 
hujj 发表于 2018-9-9 10:02
void port_C_Config(void)
{
//    gpio_deinit(GPIOC);               //重置PC端口
    rcu_periph_c ...

有使用的外设时钟全部使能了吗?l另外gpio口支持5v吗?
最好把你使用的芯片报上来,这样比较好解答,全部看代码又没注释只能靠猜太累了
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

7
 
我使用的是本次活动的GD32F350开发板,用PC0~PC6引脚连接拨码开关,供用户根据实际需要设置两个参数(一个用四位拨码开关,另一个用三位拨码开关)。配置端口的相关代码如下:

void port_C_Config(void)
{
    gpio_deinit(GPIOC);                             //重置PC端口
    rcu_periph_clock_enable(RCU_GPIOC);  //配置端口的时钟
//下面的代码是配置引脚,用过gpio_mode_set()函数将PC0~PC6引脚设置成输入模式、上拉电阻方式,测试发现拨码开关未接通时引脚的电压仅为0.9~1.2V左右,尝试改为下拉电阻方式,外部通过拨码开关上拉,但单片机依旧取不到数据,我将引脚配置为下面的交替模式也达不到预期效果。
    gpio_af_set(GPIOC,GPIO_AF_0,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
    gpio_mode_set(GPIOC,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
//        gpio_bit_set(GPIOC,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);
        gpio_bit_write(GPIOC,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,SET);
       
}
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

8
 
本帖最后由 hujj 于 2018-9-9 16:15 编辑

    我尝试用PB0、PB1、PB11三个引脚,可以取到数了,但PC端口的引脚仍无法取到数据,应该还是端口或引脚的配置问题,会不会是端口尚未启用。
    使用PB端口的代码如下:
    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_11);


    可是我用类似的代码配置PC端口却不成功,这究竟是什么原因,希望各位能帮我分析一下。谢谢!

追注:PB0、PB1和PB11三个引脚也仅仅是开始能取得到数据,后来测试也无法取到数据,不知是何原因?
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

9
 
    我在main函数的while循环里加了一个0.5秒的延时程序,终于看清楚了从PB端口读入的数据是周期性变化的(我的拨码开关并未变动),也就是说读入的数据不稳定,我测量了相应的引脚,高电平时只有0.8~1.2V之间,明显达不到数据手册中1.69~2.11V的标准,也许这就是读入数据不稳定或读不到数据的原因吧?造成的因素也许是我的USB口供电能力不足,但我测量开发板的5V端有4.63V,3.3V端有3.27V,应该不会是这个原因。我是用数字万用表去测量的,也不会是电表接入造成的偏差。除了单片机I/O口上拉能力弱之外,我也想不出其他原因了。

数据手册截图:



屏幕或右下角的读入数据不稳定、周期性变化。


此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

10
 
    我将PB0等三个引脚改为下拉电阻,然后用拨码开关在外部上拉,全部上拉时可以读到稳定的数据,否则仍是周期性变化的数据,由此判断可能这些引脚中有被其他程序占用的,我是在ADC程序基础上建立的项目,还没去分析原来的程序使用了哪些资源。
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

11
 
    我将LCD5110改接在PC端口,能够正常驱动,表明PC端口应该是正常使能了,但不知道为什么仍旧读不到数据。
    我将拨码开关设在PB端口,能够读到数据,但存在一个问题,不管引脚设置为上拉电阻或者是下拉电阻,相应引脚的电压都在0.8~1.6V之间,不会呈现高电平或低电平。
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

12
 
通过换用PB端口和外部增加上拉电阻,这个问题已经完美解决,再次感谢热心回帖的坛友们!
此帖出自GD32 MCU论坛

点评

内部上拉电阻不行吗? 应该也可以吧  详情 回复 发表于 2018-9-10 18:52
 
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

13
 
hujj 发表于 2018-9-10 12:42
通过换用PB端口和外部增加上拉电阻,这个问题已经完美解决,再次感谢热心回帖的坛友们!

内部上拉电阻不行吗? 应该也可以吧
此帖出自GD32 MCU论坛

点评

您可能没注意前面的帖子,我的开发板设置内部上拉电阻或下拉电阻时,引脚的电平都在0.8~1.2V之间,达不到数据手册的标准,所以只好外加上拉电阻。  详情 回复 发表于 2018-9-10 21:29
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

14
 
本帖最后由 hujj 于 2018-9-10 21:30 编辑
传媒学子 发表于 2018-9-10 18:52
内部上拉电阻不行吗? 应该也可以吧

您可能没注意前面的帖子,我的开发板设置内部上拉电阻或下拉电阻时,引脚的电平都在0.8~1.2V之间,达不到数据手册的标准,所以只好外加上拉电阻。不知是我设置有问题还是板子有问题,也不知是个例还是通病。
此帖出自GD32 MCU论坛

点评

一般这种处理器内部上拉是3.3V,兼容5V, 我设置的上拉电阻,输入是3.3V。我再试试看以下  详情 回复 发表于 2018-9-11 19:21
 
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

15
 
hujj 发表于 2018-9-10 21:29
您可能没注意前面的帖子,我的开发板设置内部上拉电阻或下拉电阻时,引脚的电平都在0.8~1.2V之间,达不到 ...

一般这种处理器内部上拉是3.3V,兼容5V, 我设置的上拉电阻,输入是3.3V。我再试试看以下
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

16
 
    按照数据手册,3.3V供电其高电平应该是1.99V以上,但我测量,使用上拉电阻时引脚的电压通常不足1.2V,偶尔会达到1.6V,明显低于1.99V,所以造成读入的状态不稳定,我又找不出原因,只好外接上拉电阻了事。
此帖出自GD32 MCU论坛
 
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

17
 
GPIO_PUPD_PULLDOWN

GPIO_PUPD_PULLUP
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

18
 
用过这个函数,但读不到有效数据,最后只好加上外部上拉电阻来解决。
此帖出自GD32 MCU论坛
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

19
 

本帖最后由 hujj 于 2018-9-12 20:34 编辑

用过这个函数,但读不到有效数据,最后只好加上外部上拉电阻来解决。
(网速慢,提交之后竟重复了)
此帖出自GD32 MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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