OpenEdv-开源电子网

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

GPIO位带操作宏定义没看明白

[复制链接]

22

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-7-20
在线时间
0 小时
发表于 2014-10-29 17:29:32 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) AliasAddr = 0x22000000+((A‐0x20000000)*8+n)*4//SRAM位带区 AliasAddr = 0x42000000+((A‐0x40000000)*8+n)*4//片上外设位带区[/mw_shl_code]
 1.第一行是例程里的,第二行第三行是CM3权威指南里的。下面两行我能看懂,但是看不明白第一行宏定义右边的式子是怎么来的,和下面的某一行等价吗?
 
 2.PBout(n)中的n应该是所在字节的位序号,n应该大于等于0小于等于7才对,为什么例程里说要确保n的值小于16?

最佳答案

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

这里虽然有0-7限制,是因为寄存器里的一个位就映射到位带区域的32位,就是4个字节,也就是说32字节的位带区域只能够映射8个位,但是我们明白位带区域的地址也是连续排布,也就是说第8位映射的位带地址就是在第七位映射的位带地址之后,而公式也是连续的,所以n为8算出来的位带地址就应该在第七位之后,就是说这样用是可行的,没有什么问题,至于n要小于16的说法是因为该寄存器的高16位为保留为。 这是我的见解,有错请纠正,谢谢
软件、硬件我都要
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-10-29
在线时间
0 小时
发表于 2014-10-29 17:29:33 | 显示全部楼层
这里虽然有0-7限制,是因为寄存器里的一个位就映射到位带区域的32位,就是4个字节,也就是说32字节的位带区域只能够映射8个位,但是我们明白位带区域的地址也是连续排布,也就是说第8位映射的位带地址就是在第七位映射的位带地址之后,而公式也是连续的,所以n为8算出来的位带地址就应该在第七位之后,就是说这样用是可行的,没有什么问题,至于n要小于16的说法是因为该寄存器的高16位为保留为。
这是我的见解,有错请纠正,谢谢
回复

使用道具 举报

13

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-2-15
在线时间
0 小时
发表于 2014-10-29 17:44:17 | 显示全部楼层
第一个,看权威指南,可以推算出的,只不过二,三行是另外一种形式的地址算法;
第二个,STM32每组IO口是16个,比如PA就是从PA0到PA15的。和传统的51不一样。
回复

使用道具 举报

22

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-7-20
在线时间
0 小时
 楼主| 发表于 2014-10-29 17:53:31 | 显示全部楼层
回复【2楼】羽神落:
---------------------------------
我知道是16个,我的意思是比如说GPIOB的ODR寄存器只有低16位有效对吧,那如果我想用位带操作来给PB12赋1,
那是不是应该PBout(12) = 1;
也就是BIT_ADDR(GPIOB_ODR_Addr,12)=1;
但是权威指南上说位带操作里的n是位序号,是一个字节8位里的某一位的序号,是0到7之间的值,不可能取12的啊。
软件、硬件我都要
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-10-29
在线时间
0 小时
发表于 2014-10-29 17:58:11 | 显示全部楼层
怎么不能够取12,n值的范围应该是0到31
回复

使用道具 举报

22

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-7-20
在线时间
0 小时
 楼主| 发表于 2014-10-29 17:59:22 | 显示全部楼层
回复【4楼】piaoran111999:
---------------------------------
例程的注释里说n要小于16

权威指南的n说在0到7

麻烦您看过再帮我解答
软件、硬件我都要
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-10-29
在线时间
0 小时
发表于 2014-10-29 17:59:53 | 显示全部楼层
因为每一位都是能够绑定的,公式这样算:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
在手册里有说明
bit_word_addr is the address of the word in the alias memory region that maps to the
targeted bit.
bit_band_base is the starting address of the alias region
byte_offset is the number of the byte in the bit-band region that contains the targeted bit
bit_number is the bit position (0-7) of the targeted bit.
回复

使用道具 举报

22

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-7-20
在线时间
0 小时
 楼主| 发表于 2014-10-29 18:00:38 | 显示全部楼层
回复【6楼】piaoran111999:
---------------------------------
什么手册呢,麻烦告诉我下
软件、硬件我都要
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-10-29
在线时间
0 小时
发表于 2014-10-29 18:11:03 | 显示全部楼层
参考手册呀  
RM0008
Reference manual
STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx
and STM32F107xx advanced ARM-based 32-bit MCUs
回复

使用道具 举报

22

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-7-20
在线时间
0 小时
 楼主| 发表于 2014-10-29 21:27:46 | 显示全部楼层
回复【8楼】piaoran111999:
---------------------------------
你在7楼的回答让我彻底弄明白了我提出的第二个问题,谢谢!
你能帮我再看下第一个问题吗,那个式子是怎么推导的,跟权威指南的那两条等价吗?
软件、硬件我都要
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-10-29
在线时间
0 小时
发表于 2014-10-29 23:08:27 | 显示全部楼层
我不懂你要问什么问题,你再说一遍,说清楚点,谢谢
回复

使用道具 举报

22

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-7-20
在线时间
0 小时
 楼主| 发表于 2014-10-30 11:54:35 | 显示全部楼层
回复【11楼】piaoran111999:
---------------------------------
不用了,谢了,我昨晚已经弄明白了,宏定义的式子是没错的。
软件、硬件我都要
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 21:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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