OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
123
返回列表 发新帖
楼主: warship

我对STM32所用位带操作宏的超详细剖析、优势分析及应用推广探索研究(持续更新,欢迎讨论交流)

  [复制链接]

1

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2013-3-3
在线时间
101 小时
发表于 2018-9-9 17:48:58 | 显示全部楼层
感谢分享。佩服楼主深入研究的精神,学习了。
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4462
金钱
4462
注册时间
2018-5-11
在线时间
932 小时
 楼主| 发表于 2018-9-10 10:30:19 | 显示全部楼层

没有发现有什么迹象。
搜索一下你的说明文档用关键字位段
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

29

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2018-10-19
在线时间
28 小时
发表于 2018-11-9 16:08:44 | 显示全部楼层
对就那三句宏定义,我自己没看明白是什么意思!感谢楼主,收藏收藏
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4462
金钱
4462
注册时间
2018-5-11
在线时间
932 小时
 楼主| 发表于 2018-11-9 22:50:11 | 显示全部楼层
好风 发表于 2018-11-9 16:08
对就那三句宏定义,我自己没看明白是什么意思!感谢楼主,收藏收藏

刚开始看不懂没关系,
我也是有了疑问后开始研究的,
如有不明白的,
可以过来探讨。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-12-16
在线时间
4 小时
发表于 2018-12-16 10:39:07 | 显示全部楼层
按21楼的代码,在测试程序中编译有错,什么原因?
#define MyFlag_Addr    0x20001800   //选择SRAM区的一个固定地址
//定义一个全局变量作为集中的标志位寄存器, 分配于上述固定地址
volatile u32 MyFlag __attribute__((at(MyFlag_Addr)));
错误代码是:.\YT32B1_STM32F103_demo.axf: Error: L6200E: Symbol gF multiply defined (by delay.o and main.o).
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4462
金钱
4462
注册时间
2018-5-11
在线时间
932 小时
 楼主| 发表于 2018-12-16 11:11:58 | 显示全部楼层
MA5768 发表于 2018-12-16 10:39
按21楼的代码,在测试程序中编译有错,什么原因?
#define MyFlag_Addr    0x20001800   //选择SRAM区的一 ...

错误是:符号gF 重复定义 (分别在delay.c和main.c文件中)
你检查一下。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

1

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-10
在线时间
49 小时
发表于 2018-12-16 21:09:54 | 显示全部楼层
STM32能进行位带操作的实质是巨大的(4GB)寻址空间和很有限的寻址需要,这样可以把某些空间(IO寄存器)32b分拆成每b占用一个32位地址:加快了位寻址效率,常规是需要读出,位与--置零或位或--置一,但也浪费了32倍的存储空间(反正有的是)。
处理器硬件需要付出一定的代价,位带地址映射。

逆水行舟不进则退
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4462
金钱
4462
注册时间
2018-5-11
在线时间
932 小时
 楼主| 发表于 2018-12-17 18:33:03 | 显示全部楼层
gelin_ss 发表于 2018-12-16 21:09
STM32能进行位带操作的实质是巨大的(4GB)寻址空间和很有限的寻址需要,这样可以把某些空间(IO寄存器)32 ...

你说的对,浪费了存储空间,但反正有的是,4G空间对于单片机系统来说是天文数字。
处理器的相关硬件是事先设计好的,
所以效率很高,不用白不用。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-12-12
在线时间
1 小时
发表于 2019-3-8 11:46:09 | 显示全部楼层
楼主厉害
回复 支持 反对

使用道具 举报

1

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2010-12-14
在线时间
65 小时
发表于 2019-3-17 11:08:43 | 显示全部楼层
楼主真是厉害!!!
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2014-8-21
在线时间
15 小时
发表于 2019-6-2 01:07:17 | 显示全部楼层
mark~~~~~~~
回复 支持 反对

使用道具 举报

0

主题

64

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2012-6-27
在线时间
69 小时
发表于 2019-6-13 13:29:07 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

64

帖子

0

精华

高级会员

Rank: 4

积分
714
金钱
714
注册时间
2012-6-27
在线时间
69 小时
发表于 2019-6-13 16:40:13 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-3-30
在线时间
1 小时
发表于 2019-6-14 10:22:20 | 显示全部楼层
几乎就可以实现对STM32所有外设寄存器的访问
www.tdszx.com
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-30
在线时间
4 小时
发表于 2019-6-30 22:40:18 | 显示全部楼层
学习了,期待更新
回复 支持 反对

使用道具 举报

1

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2019-8-29
在线时间
31 小时
发表于 2019-9-6 22:20:15 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-9-7 19:22:47 | 显示全部楼层
对于位操作, 有些个人的建议给初学者
一, 良好C或C++的程序结构, 不会使用一大堆位操作。
二, ST的位操作, 最大的作用是安全性, 而不是代码精简, 在配置外设时, 用位操作反而会使代码更大。
回复 支持 1 反对 0

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2019-7-31
在线时间
93 小时
发表于 2019-9-15 16:50:17 | 显示全部楼层
厉害,大佬哇,先抄下来慢慢看
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-10-30
在线时间
1 小时
发表于 2019-10-30 23:43:53 | 显示全部楼层
ufbycd 发表于 2018-8-31 22:56
抄下你的汇编
[mw_shl_code=asm,true]   518:   bRCC_CFGR_SW0=0;       //系统时钟选择SW0位复位   
...

这个不是读改写,
MOVS R0, #0x00           意思是将0放入R0中
LDR     R1,【PC,#28】意思是将当期PC+28的位置存放的数值,放到R1
ADDS  R1, R1, #0x80    意思是R1 = R1 + 0x80
STR     R0,    [r1, #0x00   意思是将R0的数值放到 R1指定的地址,偏移是 0

这里面是bRCC_CFGR_SW0这个宏设计的问题,宏给定了基地址结构,然后寻找成员位,一般都是要计算一下,也许换一个优化方案就变成一个立即数,没有 ADDS那句话了。
回复 支持 反对

使用道具 举报

4

主题

116

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3948
金钱
3948
注册时间
2017-11-15
在线时间
323 小时
发表于 2019-10-31 09:31:10 | 显示全部楼层
很高深的用法
www.littlebutler.top
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2019-7-22
在线时间
44 小时
发表于 2019-11-7 18:17:04 | 显示全部楼层
大佬,膜拜,正在学习,谢谢分享,分析
回复 支持 反对

使用道具 举报

28

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2017-10-14
在线时间
76 小时
发表于 2019-11-11 15:02:47 | 显示全部楼层
厉害厉害,,,,分析到位,MARK一下
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-11-10
在线时间
15 小时
发表于 2019-11-26 15:54:00 | 显示全部楼层
顶顶顶,LZ的精神非常值得我们学习。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-1-17
在线时间
0 小时
发表于 2020-1-17 08:34:11 | 显示全部楼层
新人学习一下
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-2-8
在线时间
2 小时
发表于 2020-2-16 15:09:37 | 显示全部楼层
keil调试时带参数宏没法显示对应的数值,例如
#define f(a) (a+2)
#define f(3)
鼠标放f(3)上只显示f,按道理应该是0x00000005.各位有遇过吗?
回复 支持 反对

使用道具 举报

0

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2017-12-21
在线时间
76 小时
发表于 2020-3-31 11:00:08 | 显示全部楼层
warship 发表于 2018-9-1 07:23
STM32的位带操作我很清楚,你提出的问题其实与位带操作无关。
你的问题其实可以化简为对bRCC_CFGR_SW0=0 ...

这是由RISC决定的,ARM就是使用RISC指令集,这种指令集不能对内存寻址,只能寄存器寻址,比如*(0x4221 01A4)=0,产生的汇编就是3步骤:
1.把数字0x4221 01A4放到寄存器R1
2.把数字0放到R0
3.把R0的内容(也就是数字0)放到R1指向的地址内存(0x4221 01A4)

而不能直接向0x4221 01A4写入0
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2019-11-14
在线时间
18 小时
发表于 2020-4-1 14:39:38 | 显示全部楼层
很给力,收藏了
回复 支持 反对

使用道具 举报

0

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2014-9-18
在线时间
21 小时
发表于 2020-5-10 15:27:50 | 显示全部楼层
厉害厉害,高手啊,膜拜!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-6-26
在线时间
3 小时
发表于 2020-7-9 23:01:34 | 显示全部楼层
膜拜大佬,新手正在学stm32,实验室的工程项目全是位带操作,基本不用库函数写(刚进实验室小白也不知道为什么),有没有对新手学习的建议呀?
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2020-6-20
在线时间
30 小时
发表于 2020-8-29 18:06:59 | 显示全部楼层
很受益
回复 支持 反对

使用道具 举报

17

主题

97

帖子

0

精华

高级会员

Rank: 4

积分
822
金钱
822
注册时间
2020-7-21
在线时间
85 小时
发表于 2020-8-29 19:34:03 | 显示全部楼层
怒赞一波奆佬!!!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-7-21
在线时间
8 小时
发表于 2020-8-29 23:46:23 | 显示全部楼层
谢谢分享,学习了。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-8-14
在线时间
10 小时
发表于 2020-9-11 14:52:47 | 显示全部楼层
学习了,谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2020-9-11
在线时间
16 小时
发表于 2020-9-12 14:03:14 | 显示全部楼层
历害!!谢谢分享
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-4-2
在线时间
4 小时
发表于 2020-9-26 14:25:06 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-5-9
在线时间
22 小时
发表于 2020-12-16 10:46:34 | 显示全部楼层
edmund1234 发表于 2019-9-7 19:22
对于位操作, 有些个人的建议给初学者
一, 良好C或C++的程序结构, 不会使用一大堆位操作。
二, ST的位 ...

增加一点,降低了程序的可读性,可移植性,还有开发效率!
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-1-16
在线时间
17 小时
发表于 2020-12-23 13:57:56 | 显示全部楼层
点赞,学习学习!!!
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2020-5-29
在线时间
87 小时
发表于 2021-4-29 13:42:15 | 显示全部楼层
收益良多,相见恨晚
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2021-4-4
在线时间
34 小时
发表于 2021-7-30 17:10:56 | 显示全部楼层
楼主太强了
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2021-4-4
在线时间
34 小时
发表于 2021-7-30 17:39:54 | 显示全部楼层
4楼感觉稍微有点儿问题

因为定义了BIT_ADDR(addr, bitnum) 要替换成 MEM_ADDR(BITBAND(addr, bitnum)),所以展开成:
MEM_ADDR((GPIOA_ODR_Addr & 0xF0000000)+0x2000000+((GPIOA_ODR_Addr &0xFFFFF)<<5)+(9<<2))=1;

这句的替换应该说的是定义了BITBAND(addr,bitnum)要替换成((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)),所以展开成:MEM_ADDR((GPIOA_ODR_Addr & 0xF0000000)+0x2000000+((GPIOA_ODR_Addr &0xFFFFF)<<5)+(9<<2))=1;
回复 支持 反对

使用道具 举报

1

主题

26

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2020-7-31
在线时间
11 小时
发表于 2021-12-6 10:10:42 | 显示全部楼层
此帖仅作者可见
回复 支持 反对

使用道具 举报

1

主题

26

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2020-7-31
在线时间
11 小时
发表于 2021-12-6 19:40:47 | 显示全部楼层
static inline
回复 支持 反对

使用道具 举报

31

主题

1953

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4462
金钱
4462
注册时间
2018-5-11
在线时间
932 小时
 楼主| 发表于 2022-4-13 21:02:08 | 显示全部楼层
edmund1234 发表于 2019-9-7 19:22
对于位操作, 有些个人的建议给初学者
一, 良好C或C++的程序结构, 不会使用一大堆位操作。
二, ST的位 ...

"配置外设时, 用位操作反而会使代码更大"
你研究过吗?
比较一下反汇编代码吧。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 07:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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