专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
关于位带操作的问题
2019-07-20 05:13
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
8602
8
1431
C语言中,变量的地址是一个常量,因此不能被赋值。
那么为什么单片机中,可以通过操作地址,从而控制寄存器的某一位呢?
还有,如果一开始赋值某地址=0,那么后面可以这样赋值吗:某地址=某地址+1;?
初学者求解
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
Psheng
1楼-- · 2019-07-20 09:50
不能给常量赋值 但是可以给指针指向的地址赋值啊。也可以随意加减运算的
加载中...
peng1554
2楼-- · 2019-07-20 13:03
精彩回答 2 元偷偷看……
加载中...
edmund1234
3楼-- · 2019-07-20 17:07
C语言跟STM对地址的操作没啥分别, C能做的STM也可以, STM能做的C也可以, 是你的理解有误了
又或者你给一例子, STM做了些是C没有的
加载中...
machine369
4楼-- · 2019-07-20 20:59
哦哦 好像明白了!
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
上面这段代码是不是意思就是 由GPIOF_BASE(地址)加上偏移量,得到GPIOF_ODR_Addr(地址),
由BITBAND(addr, bitnum)对应的公式计算得PF的具体一位I/O的地址,
再由 MEM_ADDR(addr) ,先通过(volatile unsigned long *)(addr)将addr转换为指针,在加个星号*((volatile unsigned long *)(addr)) ,于是MEM_ADDR(addr)就不再是指针(地址),而是指针指向的变量。
于是有PFout(9)=1;操作I/O口的数据输出。其实就是操作了存放在这个地址的变量,ODR寄存器的某一位。
也就是其实还是对变量进行操作,而不是地址。
对吗?
加载中...
warship
5楼-- · 2019-07-20 23:32
精彩回答 2 元偷偷看……
加载中...
machine369
6楼-- · 2019-07-21 04:30
还有下面这条语句
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
为什么不直接写成
#define MEM_ADDR(addr) *(addr)
呢?
加载中...
1
2
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
又或者你给一例子, STM做了些是C没有的
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
上面这段代码是不是意思就是 由GPIOF_BASE(地址)加上偏移量,得到GPIOF_ODR_Addr(地址),
由BITBAND(addr, bitnum)对应的公式计算得PF的具体一位I/O的地址,
再由 MEM_ADDR(addr) ,先通过(volatile unsigned long *)(addr)将addr转换为指针,在加个星号*((volatile unsigned long *)(addr)) ,于是MEM_ADDR(addr)就不再是指针(地址),而是指针指向的变量。
于是有PFout(9)=1;操作I/O口的数据输出。其实就是操作了存放在这个地址的变量,ODR寄存器的某一位。
也就是其实还是对变量进行操作,而不是地址。
对吗?
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
为什么不直接写成
#define MEM_ADDR(addr) *(addr)
呢?
一周热门 更多>