![](https://i-blog.csdnimg.cn/blog_migrate/69c591527c9b85db9606d9e8d83013dd.jpeg)
位带操作
![](https://i-blog.csdnimg.cn/blog_migrate/a552f491e356795540f83b6645fced67.jpeg)
位带区的每一个位 都对应位带别名区的每一个字(4字节32位)。因为stm32操作系统是32位的,易于读取
![](https://i-blog.csdnimg.cn/blog_migrate/57b018f66c59dad38de1da363e5d5b14.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d3c58ad78a93070ef39909d1fd307d67.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/40cb813cdd49ec1db8c449537da09773.jpeg)
#define GPIOB_ODR_Addr (GPIOB_BASE+0x0c)
#define PBOUT(n) *(unsigned int *) ((GPIOB_ODR_Addr &0xF0000000)+0x02000000+((GPIOB_ODR_Addr &0x00FFFFFF)<<5+(n<<2)))
对PB1位值0,前面是外设加ARM位地址转位代区地址公式。后面是可以验证的代码
#include "stm32f10x.h" // Device header
#define GPIOB_ODR_Addr (GPIOB_BASE+0x0c)
#define PBOUT(n) *(unsigned int *) ((GPIOB_ODR_Addr &0xF0000000)+0x02000000+((GPIOB_ODR_Addr &0x00FFFFFF)<<5+(n<<2)))
int main()
{
GPIO_InitTypeDef led_init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE );
led_init.GPIO_Speed =GPIO_Speed_50MHz;
led_init.GPIO_Pin=GPIO_Pin_1;
led_init.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &led_init);
PBOUT(1)=0;
//GPIO_WriteBit(GPIOB,GPIO_Pin_0|GPIO_Pin_0|GPIO_Pin_0,Bit_SET);
//GPIO_ResetBits(GPIOB,GPIO_Pin_0 );
return 0;
}