主要是看公式:
外设: ((uint32_t) (0x42000000+(外设寄存器地址ODR/IDR-)*8*4+n*4)
外设寄存器地址可参考手册地址和偏移位
srom:((uint32_t) (0x22000000+(外设寄存器地址ODR/IDR)*8*4+n*4)
综合:
AliasAddr = ((A & 0xF0000000)+0x02000000+((A &0x00FFFFFF)<<5)+(n<<2))
A:外设寄存器地址
n:想要操作的位号
设计代码:参考野火的代码
//#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 GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
//#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
//#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
//#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
//#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
//#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
//
//#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
//#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
//#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
//#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
//#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
//#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
//#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
//// 单独操作 GPIO的某一个IO口,n(0,1,2...16),n表示具体是哪一个IO口
//#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
//#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
//
//#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
//#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
//
//#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
//#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
//
//#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
//#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
//
//#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
//#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
//
//#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
//#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
//
//#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
//#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
大概就是按公式填地址
使用:
PBout(0)=1;
PBout(1)=1;
PBout(5)=1;
也可以用赋值,但会报警告,不影响使用
int main(void)
{
u8 a=99;
GPIO_InitTypeDef RGB_GPIO_InitStruct; //GPIO结构体名称
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟
RGB_GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;//GPIO模式选择
RGB_GPIO_InitStruct.GPIO_Pin|= GPIO_Pin_0; //GPIO引脚选择可用|运算符同时选择多个,但为了灯的选择分开了。
RGB_GPIO_InitStruct.GPIO_Pin|= GPIO_Pin_1;
RGB_GPIO_InitStruct.GPIO_Pin|= GPIO_Pin_5;
RGB_GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &RGB_GPIO_InitStruct);//gpio初始化完成
PBout(0)=1;
PBout(1)=1;
PBout(5)=1;
while(1)
{
if(PBout(5)=a);//if原则非0及真
}