OpenEdv-开源电子网

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

TIM5->CCMR1|=0<<4; 0左移为什么是正确的

[复制链接]

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-1-9
在线时间
8 小时
发表于 2016-1-19 11:01:43 | 显示全部楼层 |阅读模式
1金钱
输入捕获一节的源码,里面好几句这种式子:GPIOA->ODR|=0<<0;                //PA0下拉
TIM5->CCMR1|=0<<4;         //IC1F=0000 配置输入滤波器
TIM5->CCMR1|=0<<10;         //IC2PS=00 配置输入分频
TIM5->CCER|=0<<1;                 //CC1P=0        上升沿捕获



可是不管什么值, |=0之后不都还是原来的值吗? 0<<4不还是0吗,只有|=1<<4;才有用吧.

最佳答案

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

你焦躁了吧,看起来没什么用,起码没错嘛。也起码可以告诉你一个信息,操作的是哪位,你置1的时候也能知道置位哪个位了吧,不需要再去查找资料了吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-1-19 11:01:44 | 显示全部楼层
你焦躁了吧,看起来没什么用,起码没错嘛。也起码可以告诉你一个信息,操作的是哪位,你置1的时候也能知道置位哪个位了吧,不需要再去查找资料了吧。
回复

使用道具 举报

354

主题

1475

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8096
金钱
8096
注册时间
2015-10-15
在线时间
2919 小时
发表于 2016-1-19 11:15:18 | 显示全部楼层
这是提高代码的可读性。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

354

主题

1475

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8096
金钱
8096
注册时间
2015-10-15
在线时间
2919 小时
发表于 2016-1-19 11:15:58 | 显示全部楼层
移位操作的目的就在于让你知道,整个配置 构成要操作寄存器的哪些位。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-1-9
在线时间
8 小时
 楼主| 发表于 2016-1-19 12:08:10 | 显示全部楼层
TinyBoy 发表于 2016-1-19 11:01
你焦躁了吧,看起来没什么用,起码没错嘛。也起码可以告诉你一个信息,操作的是哪位,你置1的时候也能知道 ...

谢谢,原来是指示作用。
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-1-9
在线时间
8 小时
 楼主| 发表于 2016-1-19 12:11:02 | 显示全部楼层
openedvadmin 发表于 2016-1-19 11:15
移位操作的目的就在于让你知道,整个配置 构成要操作寄存器的哪些位。。。

谢谢站长。我试着把这些句子注释了,结果程序还是一样的作用。现在明白了这些是指示作用。系统上电后这些寄存器会有个复位值,这些值正好不用修改,于是写了这些便于学习,我的理解对吗?
回复

使用道具 举报

354

主题

1475

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8096
金钱
8096
注册时间
2015-10-15
在线时间
2919 小时
发表于 2016-1-19 12:49:38 | 显示全部楼层
haotingjiuxing 发表于 2016-1-19 04:11
谢谢站长。我试着把这些句子注释了,结果程序还是一样的作用。现在明白了这些是指示作用。系统上电后这些 ...

是的。也是代码规范化的一个要求。。。0,你不设置虽然没有影响,但是这个0是有意义的,他也是设置,设置为0.。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-1-9
在线时间
8 小时
 楼主| 发表于 2016-1-19 12:52:22 | 显示全部楼层
openedvadmin 发表于 2016-1-19 12:49
是的。也是代码规范化的一个要求。。。0,你不设置虽然没有影响,但是这个0是有意义的,他也是设置,设置 ...

谢谢指导
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-19 15:50:34 | 显示全部楼层
本帖最后由 xkwy 于 2016-1-19 15:54 编辑

对于这行代码:
TIM5->CCMR1|=0<<10;         //IC2PS=00 配置输入分频


我一般都写作与等非的形式:
[mw_shl_code=c,true]TIM5->CCMR1 &= ~(1<<10); [/mw_shl_code]

而且我很少用常数,而是用stm32f10x.h里面提供的具体掩码:
[mw_shl_code=c,true]TIM5->CCMR1 &= ~TIM_CCMR1_OC2FE; [/mw_shl_code]

这样就不仅仅是指示作用了
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-1-11
在线时间
8 小时
发表于 2016-1-19 17:20:41 | 显示全部楼层
xkwy 发表于 2016-1-19 15:50
对于这行代码:

如果bit10是1,原代码是不会改变bit10的值的,但是你的代码会对bit10进行清零,所以是不对的。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-19 17:31:57 | 显示全部楼层
本帖最后由 xkwy 于 2016-1-19 17:33 编辑
jafree 发表于 2016-1-19 17:20
如果bit10是1,原代码是不会改变bit10的值的,但是你的代码会对bit10进行清零,所以是不对的。

本来就是想让它清零啊,
要不然费那劲写这么一行。。。
如果bit10是1的话,那么原代码是错误的,它没有达到想要的功能,
这里,原子哥的代码并不健壮。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-1-19 19:19:54 | 显示全部楼层
xkwy 发表于 2016-1-19 15:50
对于这行代码:

TIM5->CCMR1 &= ~(1<<10);---这样写是有可能会出问题的。
或许你会问:为什么?
因为~1=0xfe=0xfffe=0xfffffffe 这些值都有可能的
当然你很幸运,因为stm32是32bit的,默认~1=0xfffffffe
如果是C51单片机,这样操作会出错的,而且一旦出错很难找到出错原因。
建议以后还是养成规范的写法吧。纯属建议,采纳不采纳还是看你自己了。^_^
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-19 20:43:50 | 显示全部楼层

感谢指出,所以我平时都用STM32提供的标准掩码,这些掩码都是被define为合适的位宽的。

这里~1究竟是0xFE还是0xFFFFFFFE是由编译器的默认位宽决定的,跟STM32无关,在51里它依然是32位。
QQ截图20160119204336.png






如果不用标准掩码,最好该写成如下:

[mw_shl_code=c,true]TIM5->CCMR1 &= ~(1ul<<10);[/mw_shl_code]

坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-1-20 09:17:34 | 显示全部楼层
是啊。用1u是最好了。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-1-9
在线时间
8 小时
 楼主| 发表于 2016-1-25 14:19:58 | 显示全部楼层
xkwy 发表于 2016-1-19 20:43
感谢指出,所以我平时都用STM32提供的标准掩码,这些掩码都是被define为合适的位宽的。

这里~1究竟是0 ...

你好,谢谢你的回复,让我有提升。
我想请教一下我的理解对不对,如果1默认是8位,那~1=0XFE,即只有8位,进行“与等”操作的话,会由于位数不够,导致超出8位的高位数全被设为0。所以用1ul强制把1设为32位数,那~1=0XFFFFFFFE,不会影响超出8位的数,就不会出这个错误了,我的理解对吗?
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-2-24 18:45:05 | 显示全部楼层
haotingjiuxing 发表于 2016-1-25 14:19
你好,谢谢你的回复,让我有提升。
我想请教一下我的理解对不对,如果1默认是8位,那~1=0XFE,即只有8位 ...

一个常量如果没声明长度,编译器会根据上下文确定一个合适的长度。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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