mokongking

位带、掩码

掩码技术是一种将一个数的某些二进制位设置为特定值的技术。在计算机科学中,掩码通常用于提取或设置一个数的特定位。掩码是一个二进制数,其中每个位都对应于原始数的一个位。如果掩码的某个位为 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的闪烁效果。

posted on 2023-03-24 17:01  虎啸岳林  阅读(125)  评论(0编辑  收藏  举报

导航