OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3864|回复: 20

按键 位操作代替寄存器操作

[复制链接]

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
发表于 2018-7-20 18:18:20 | 显示全部楼层 |阅读模式
在前面视频中了解到控制IO口可以用寄存器,也可以用位操作。于是在按键试验中就试着用位操作代替寄存器操作使A15和c5上拉,结果led就不亮了。
我是个新手,求大神么赐教!!!

            GPIOC->ODR|=1<<5;用KEY0=1代替
            GPIOA->ODR|=1<<15;用KEY1=1代替
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-21 16:33:16 | 显示全部楼层
本帖最后由 warship 于 2018-7-21 17:03 编辑
Storen 发表于 2018-7-21 16:05
如果这样led就会不亮

端口设置成上拉输入模式,即 IPU,
要么像原程序一样,把相应的输出寄存器置1(相当于命令其内部接一个上拉电阻)
要么改成:GPIOA->BSRR|=1<<15;   
或者用位操作:PAout(15)=1;
以上这三种方法都可以,
唯独不能用KEY1=1; 因为KEY1的定义是PAin(15), 操作的是输入寄存器IDR(输入寄存器只用于读,而不能写)
所以PAin(15)=1是起不了什么作用的。
这样,端口就没有设置上拉输入模式成功,也就是说: 按键没有初始化成功,
这将直接导致按键不起作用,
由于主程序是用按键来控制LED灯的,所以灯不亮。




我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-21 16:53:32 | 显示全部楼层
本帖最后由 warship 于 2018-7-21 16:58 编辑
Storen 发表于 2018-7-21 10:54
但是我把PCin改成PCout,再用KEY0替代 GPIOC->ODR|=1

如果直接把#define KEY0  PCin改成PCout, 会导致其它正常使用KEY0的判断按键语句错误的,
因为按键初始化只使用一次, 所以用位操作的话,
把你划线的地方直接用这两句替代就可以了:
PAout(15)=1;

PCout(5)=1;

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 1 反对 0

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-20 20:57:13 | 显示全部楼层
你的KEY0和KEY1是怎么定义的?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-21 08:39:24 | 显示全部楼层
warship 发表于 2018-7-20 20:57
你的KEY0和KEY1是怎么定义的?

我用的是宏定义   #define KEY0 PCin(5)  
                           #define KEY1 PAin(15)
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-21 09:16:53 | 显示全部楼层
Storen 发表于 2018-7-21 08:39
我用的是宏定义   #define KEY0 PCin(5)  
                           #define KEY1 PAin(15)

in对应的是IDR
out对应的是ODR
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-21 09:18:20 | 显示全部楼层
Storen 发表于 2018-7-21 08:39
我用的是宏定义   #define KEY0 PCin(5)  
                           #define KEY1 PAin(15)

所以你下面的替代是不对应的
            GPIOC->ODR|=1<<5;用KEY0=1代替
            GPIOA->ODR|=1<<15;用KEY1=1代替
先搞清楚是想输出还是输入
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-7-12
在线时间
6 小时
发表于 2018-7-21 09:39:43 | 显示全部楼层
当某管脚设置为上拉或者下拉输入模式,使用寄存器 Px_BSRR 和 PxBRR ;你的寄存器用错了把
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-21 10:54:20 | 显示全部楼层
warship 发表于 2018-7-21 09:16
in对应的是IDR
out对应的是ODR

但是我把PCin改成PCout,再用KEY0替代 GPIOC->ODR|=1<<5,LED还是不亮:
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-21 10:57:17 | 显示全部楼层
warship 发表于 2018-7-21 09:18
所以你下面的替代是不对应的
            GPIOC->ODR|=1

寄存器应该没有错,因为如果不替代的话,实验现象是正常的。现在我就是想不通为什么不用位操作就对,用位操作就错
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-21 11:28:30 | 显示全部楼层
Storen 发表于 2018-7-21 10:57
寄存器应该没有错,因为如果不替代的话,实验现象是正常的。现在我就是想不通为什么不用位操作就对,用位 ...

不知道你究竟是用哪个替代哪个?
把源码贴出来,正常的和不正常的
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-21 11:33:46 | 显示全部楼层
你没有表达清楚,哪个不正常。
你的代码ODR是输出,但按键KEY是输入,彼此没有关系的。
你又说LED灯不亮,这个和KEY也没有关系。
所以把你认为正常工作的代码贴出来,
再贴你替换后的代码
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-21 15:27:44 | 显示全部楼层
warship 发表于 2018-7-21 11:33
你没有表达清楚,哪个不正常。
你的代码ODR是输出,但按键KEY是输入,彼此没有关系的。
你又说LED灯不亮 ...

好哒好哒
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-21 15:55:57 | 显示全部楼层
这个是源码 key_c (2).png key_c.png key_h.png led_c.png led_h.png main_c.png
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-21 16:05:26 | 显示全部楼层
如果这样led就会不亮 QQ截图20180721160339.png
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-21 17:16:28 | 显示全部楼层
warship 发表于 2018-7-21 16:53
如果直接把#define KEY0  PCin改成PCout, 会导致其它正常使用KEY0的判断按键语句错误的,
因为按键初始 ...

懂啦懂啦,谢谢大神!谢谢大神!
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-21 17:19:25 | 显示全部楼层
Storen 发表于 2018-7-21 17:16
懂啦懂啦,谢谢大神!谢谢大神!

设置端口的话,推荐使用我上次写的代码,超级方便
http://www.openedv.com/forum.php ... d=274724&extra=
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-22 18:57:16 | 显示全部楼层
warship 发表于 2018-7-21 17:19
设置端口的话,推荐使用我上次写的代码,超级方便
http://www.openedv.com/forum.php?mod=viewthread&ti ...

好哒好哒
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-23 12:15:09 | 显示全部楼层
warship 发表于 2018-7-21 17:19
设置端口的话,推荐使用我上次写的代码,超级方便
http://www.openedv.com/forum.php?mod=viewthread&ti ...

大佬,你这串代码确实很厉害,很简洁可能是我不会用的原因。。。我把你的代码复制到sys.c和sys.h中
然后用了一下,他就出现这些错误和警告。
我知道这个应该是stm32f10x_gpio.h的原因,但是我不会改
在网上查了好多,说是未定义,要加#ifdef 什么东西。。。
我看不懂,希望大佬能帮助一下 错误.png
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-23 14:36:24 | 显示全部楼层
我的帖子里附件有完整的工程范例,用里面的sys.c及sys.h替换掉你同名的文件就可以了。如有问题到我的帖子里去回复。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-7-20
在线时间
9 小时
 楼主| 发表于 2018-7-23 14:56:27 | 显示全部楼层
warship 发表于 2018-7-23 14:36
我的帖子里附件有完整的工程范例,用里面的sys.c及sys.h替换掉你同名的文件就可以了。如有问题到我的帖子里 ...

谢谢谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 05:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表