OpenEdv-开源电子网

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

配置寄存器移位问题

[复制链接]

111

主题

265

帖子

0

精华

高级会员

Rank: 4

积分
740
金钱
740
注册时间
2014-3-4
在线时间
6 小时
发表于 2016-10-26 15:24:29 | 显示全部楼层 |阅读模式
1金钱
比如这个:
         GPIOB->ODR|=3<<10;
           这个目的是把PB10,PB11置高,这样移位不会把PB9,PB8,PB7,PB6,PB5,PB4,PB,PB2等前面的都置高了吗?    如果不是为什么尼?

最佳答案

查看完整内容[请看2#楼]

去学学C语言的或运算 自然就解决你的疑问了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2016-10-26 15:24:30 | 显示全部楼层
去学学C语言的或运算   自然就解决你的疑问了
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-10-26 15:29:48 | 显示全部楼层
GPIOB->ODR|=1<<10;是把PB10置高
GPIOB->ODR|=2<<10;等价于GPIOB->ODR|=1<<11,是把PB11置高
GPIOB->ODR|=3<<10;等价于GPIOB->ODR|=1<<10;GPIOB->ODR|=2<<10,是把PB10和11置高。
每一位只控制一个引脚,所以它没让PB9,PB8,PB7,PB6,PB5,PB4,PB,PB2置高。
自在随心
回复

使用道具 举报

111

主题

265

帖子

0

精华

高级会员

Rank: 4

积分
740
金钱
740
注册时间
2014-3-4
在线时间
6 小时
 楼主| 发表于 2016-10-26 15:55:36 | 显示全部楼层

这个不是移位形式吗。
那为什么把PB10清零时要这样
GPIOB->ORD&=~(1<<10);
而不是这样
GPIOB->ORD&=0<<10;  <--这样移位不是会把PB9PB8PB7等都置0吗
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-10-26 16:12:26 | 显示全部楼层
GPIOB->ORD&=~(1<<10);先理解一下它是什么意思:1左移10位变成0000010000000000,然后取非变成1111101111111111,然后再跟GPIOB->ORD进行与运算,意思是除了0的位置变成0以外,其它位都保持不变,因为任何数与上1都是它本身。
所以它不会把PB9PB8PB7等都置0。

再来看GPIOB->ORD&=0<<10;意思是把0左移10位变成0000000000000000,再跟GPIOB->ORD相与变成0000000000000000,因为任何数与上0都是0.,所以这句话会把所有位都置0.所以这句话是错的

懂了么?
自在随心
回复

使用道具 举报

111

主题

265

帖子

0

精华

高级会员

Rank: 4

积分
740
金钱
740
注册时间
2014-3-4
在线时间
6 小时
 楼主| 发表于 2016-10-26 17:34:50 | 显示全部楼层
yuzeyuan1 发表于 2016-10-26 16:12
GPIOB->ORD&=~(1ORD&=0

跪谢!!!!!!!!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 13:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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