定义寄存器的绝对地址,并转换为指针进行位操作
1、位操作示例一
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define GPIOB_BASE (APB2PERIPH_BASE+0x0C00)
// (unsigned int*)的作用是强制转换
// * (unsigned int*)则是转换后
#define GPIO_ODR * (unsigned int*)(GPIO_BASE+0x0c)
//PB0输出低电平
GPIO_ODR &= ~ (1<<0);
//解析:
//(1<<0):1左移0位,即第0位是1,其余位都是0
//~ (1<<0):上一步基础上取反,即第0位是0,其余位都是1;
// &=~ (1<<0):上一步基础上“与”运算,最终结果是将GPIO_ODR的第0位置0,其余位不影响
//PB0输出高电平
GPIO_ODR |= (1<<0);
//解析:
//(1<<0):1左移0位,即第0位是1,其余位都是0
//|=(1<<0):上一步基础上“或”运算,最终结果是将GPIO_ODR的第0位置1,其余位不影响
/*备注:
单纯的GPIO_ODR=(1<<0)会将除了0位置1,其余位都会置0;
单纯的GPIO_ODR=1,则会将寄存器所有位全部置1;
同理GPIO_ODR=0,则会将寄存器所有位全部置0;
*/
GPIO_ODR &= ~ (1<<0);
//解析:
// (1<<0):1左移0位,即第0位是1,其余位都是0
//~ (1<<0):上一步基础上取反,即第0位是0,其余位都是1;
// &=~ (1<<0):上一步基础上“与”运算,最终结果是将GPIO_ODR的第0位置0,其余位不影响
GPIO_ODR |= (1<<0);
//解析:
//(1<<0):1左移0位,即第0位是1,其余位都是0
//|=(1<<0):上一步基础上“或”运算,最终结果是将GPIO_ODR的第0位置1,其余位不影响
/*备注:
单纯的GPIO_ODR=(1<<0)会将除了0位置1,其余位都会置0;
单纯的GPIO_ODR=1,则会将寄存器所有位全部置1;
同理GPIO_ODR=0,则会将寄存器所有位全部置0;
*/
2、位操作示例二
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define GPIOB_BASE (APB2PERIPH_BASE+0x0C00)
//配置IO口为输出
GPIO->CRL &= ~((0x0f)<<(4*0))
GPIO->CRL |= ((1)<<(4*0))
根据STM32F10x参考手册,2.3章节存储器映像,共有A……G,7个GPIO;
GPIO_B,即GPIO端口B的寄存器地址为:0X4001 0C00 - 0x4001 0FFF,属于APB2总线(0x4001 0000起始)