P12 = 0;
比如我们这么直接给某个管脚写1或者写0
这是怎么实现呢、
#define GPIO_PIN_ADDR(port, pin) (*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x20*(port))) + ((pin)<<2))))
#define P00 GPIO_PIN_ADDR(0, 0) /*!< Specify P00 Pin Data Input/Output */
#define P12 GPIO_PIN_ADDR(1, 2) /*!< Specify P12 Pin Data Input/Output */
我们分解这个宏
(*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x20*(port))) + ((pin)<<2))))
(*( X ))
X 代表下面的一行,表示通过地址x找到这个位置的数据
(volatile uint32_t *) ((GPIO_PIN_DATA_BASE+(0x20*(port))) + ((pin)<<2))
上面的第一个括号标准强制转换成uint32类型的指针,表示后面跟的是地址
(GPIO_PIN_DATA_BASE+(0x20*(port))) + ((pin)<<2)
上面左边第一个宏表示PIN的起始地址,后面是偏移地址
0x20表示每一个port具备32个PIN,通过乘以32找到该端口的第一个地址段,而对应的pin的地址在这个地址基础上加上某个数,这个数字是从第三位的二进制开始的。
|