掩码技术是一种将一个数的某些二进制位设置为特定值的技术。在计算机科学中,掩码通常用于提取或设置一个数的特定位。掩码是一个二进制数,其中每个位都对应于原始数的一个位。如果掩码的某个位为 1,则表示该位应该被设置为 1;如果掩码的某个位为 0,则表示该位应该被设置为 0。掩码可以使用按位与运算符和按位或运算符来应用到原始数上。
掩码的值取决于您要设置或提取的位的位置。例如,如果您要设置或提取的位在地址的低 8 位中,则掩码将为 0xFF。如果您要设置或提取的位在地址的第 9 位到第 16 位中,则掩码将为 0xFF00。如果您要设置或提取的位在地址的第 17 位到第 24 位中,则掩码将为 0xFF0000。如果您要设置或提取的位在地址的第 25 位到第 32 位中,则掩码将为 0xFF000000。
位带技术是一种将特定的位与特定的寄存器相关联的技术。在使用位带技术时,可以将一个位视为一个独立的变量,从而使得对这个变量的读写操作变得更加简单和直观。在Cortex-M3中,每个位都有一个对应的地址,这个地址称为位带别名地址。通过位带别名地址,可以直接访问某个位,而不需要进行位运算。在Cortex-M3中,位带别名地址的范围是0x20000000~0x200FFFFF,共有1MB的空间。
。例如,要访问地址为0x20000000的位带别名地址的第0位,可以使用以下代码:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入 int main(void) { unsigned int i; unsigned int temp; RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0X00000000; //PA0-PA7推挽输出 GPIOA->CRL|=0X33333333; while(1) { PAout(0)=1; //PA0输出1 for(i=0;i<100000;i++); PAout(0)=0; //PA0输出0 for(i=0;i<100000;i++); } }
其中,
BITBAND宏定义用于将位带别名地址转换为实际地址,
MEM_ADDR宏定义用于读写实际地址,
BIT_ADDR宏定义用于读写某个位。
GPIOA_ODR_Addr和
GPIOA_IDR_Addr分别是GPIOA的输出寄存器和输入寄存器的地址,
PAout和
PAin分别是GPIOA的输出和输入宏定义。在
main函数中,首先使能了GPIOA的时钟,然后将PA0-PA7配置为推挽输出模式,最后通过
PAout宏定义控制PA0的输出状态,从而实现LED的闪烁效果。
标签:PA0,位带,地址,GPIOA,设置,掩码 From: https://www.cnblogs.com/mokongking/p/17252730.html