本人刚学习STM32,看见SRAM中有个1M的位带区,想像51样定义char,int,..变量,对每一位进行位操作。
///////////////////////////////////
bdata unsigned char dat;
sbit dat_0=dat^0;.
.
sbit dat_7=dat^7;
/////////////////////////////////////////////////////////////
STM32的位带区有2个一个是SRAM_bitband,和外设_bitband.
网上一般看到的是对外设中位带的操作,例如:
//IO口操作宏定义
#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))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
//PAout(3)=1;就是对PA^3输出1.
//////////////////////////////////////////////////////////////////
但是我想在SRAM中定义位变量,难道就是吧地址定义在 0x22000000 --0x23ffffff么?
#define DEVICE_REG0 ((volatile unsigned long *) (0x20000000))
#define DEVICE_REG0_BIT0 ((volatile unsigned long *) (0x22000000))
#define DEVICE_REG0_BIT1 ((volatile unsigned long *) (0x22000004))
...
*DEVICE_REG0 = 0xAB;
*DEVICE_REG0_BIT1 = 0x1; // 通过位带别名地址设置 bit1
求大神,还有没有别简单的方法了。
|