在STM的官方的固件库下面有个Examples里有个CortexM3文件夹,Example1给出了bitbanding详解的使用描述。
偏移用的基地址都是固定的 #define RAM_BASE 0x20000000 #define RAM_BB_BASE 0x22000000 三个对位操作的宏定义,清零、置位、读位: #define Var_ResetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | RAM_BB_BASE | ((BitNumber) << 2)) = 0) #define Var_SetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | RAM_BB_BASE | ((BitNumber) << 2)) = 1)
#define Var_GetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | RAM_BB_BASE | ((BitNumber) << 2)))
使用方法: /* A mapping formula shows how to reference each word in the alias region to a corresponding bit in the bit-band region. The mapping formula is: bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number x4)
where: - bit_word_addr: is the address of the word in the alias memory region that maps to the targeted bit. - bit_band_base is the starting address of the alias region - byte_offset is the number of the byte in the bit-band region that contains the targeted bit - bit_number is the bit position (0-31) of the targeted bit */
/* Get the variable address --------------------------------------------------*/ VarAddr = (u32)&Var;
/* Modify variable bit using bit-band access ---------------------------------*/ /* Modify Var variable bit 0 -----------------------------------------------*/ Var_ResetBit_BB(VarAddr, 0); /* Var = 0x00005AA4 */ Var_SetBit_BB(VarAddr, 0); /* Var = 0x00005AA5 */ /* Modify Var variable bit 11 -----------------------------------------------*/ Var_ResetBit_BB(VarAddr, 11); /* Var = 0x000052A5 */ /* Get Var variable bit 11 value */ VarBitValue = Var_GetBit_BB(VarAddr, 11); /* VarBitValue = 0x00000000 */ Var_SetBit_BB(VarAddr, 11); /* Var = 0x00005AA5 */ /* Get Var variable bit 11 value */ VarBitValue = Var_GetBit_BB(VarAddr, 11); /* VarBitValue = 0x00000001 */ /* Modify Var variable bit 31 -----------------------------------------------*/ Var_SetBit_BB(VarAddr, 31); /* Var = 0x80005AA5 */ /* Get Var variable bit 31 value */ VarBitValue = Var_GetBit_BB(VarAddr, 31); /* VarBitValue = 0x00000001 */ Var_ResetBit_BB(VarAddr, 31); /* Var = 0x00005AA5 */ /* Get Var variable bit 31 value */ VarBitValue = Var_GetBit_BB(VarAddr, 31); /* VarBitValue = 0x00000000 */
|