指针、寄存器、位操作

定义寄存器的绝对地址,并转换为指针进行位操作

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起始)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章