野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26401|回复: 6

STM32怎样获取变量的地址来进行位带操作

[复制链接]
发表于 2021-4-16 08:11:23 | 显示全部楼层 |阅读模式
本帖最后由 homesun 于 2021-4-16 08:18 编辑

STM32怎样获取变量的地址来进行位带操作

//定义变量
__IO uint32_t Time0_Reg;

// 把“位带地址+位序号”转换成别名地址的宏
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<<5)+(bitnum<<2))
// 把一个地址转换成一个指针
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
// 把位带别名区地址转换成指针
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))   


BIT_ADDR(&Time0_Reg,6) = 1;


//编译
error:  #31: expression must have integral type BIT_ADDR(&Time0_Reg,6) = 1;
回复

使用道具 举报

发表于 2021-4-17 16:20:41 | 显示全部楼层
野火的视频里有讲
回复 支持 反对

使用道具 举报

发表于 2021-4-18 12:57:33 | 显示全部楼层
没有对要操作的寄存器基地址进行映射
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-19 04:05:45 | 显示全部楼层
huang2015 发表于 2021-4-18 12:57
没有对要操作的寄存器基地址进行映射

谢谢,能说的更详细一点吗?
回复 支持 反对

使用道具 举报

发表于 2021-4-19 14:09:30 | 显示全部楼层
homesun 发表于 2021-4-19 04:05
谢谢,能说的更详细一点吗?

比如说要对GPIOB中ODR这个寄存器进行位操作。
你的这句 BIT_ADDR(&Time0_Reg,6) = 1; 中&Time0_Reg应该是GPIOB中ODR寄存器的地址。
从你的标题看到 获取变量的地址进行位带操作 ,估计你的想法是往里面放了你定义的那个变量的地址
而位带操作支持的对象是SRAM 和 I/O外设空间。作用是实现对这些地方的某一位的操作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-21 07:54:30 | 显示全部楼层
huang2015 发表于 2021-4-19 14:09
比如说要对GPIOB中ODR这个寄存器进行位操作。
你的这句 BIT_ADDR(&Time0_Reg,6) = 1; 中&Time0_Reg应该是 ...

是的,您说的没错。但是我定义的那个变量就是存放在SRAM空间里的呀!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-21 07:56:28 | 显示全部楼层
huang2015 发表于 2021-4-19 14:09
比如说要对GPIOB中ODR这个寄存器进行位操作。
你的这句 BIT_ADDR(&Time0_Reg,6) = 1; 中&Time0_Reg应该是 ...

是的,您说的没错。但是我定义的那个变量就是存放在SRAM空间里的呀!
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 19:34 , Processed in 0.054616 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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