指针、寄存器、位操作

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

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值