stm32f103如何直接操纵和读取单个i\o口的值
首先,要确定IO口是作输入还是输出。
其次,根据要求对IO口进行初始化配置:1、配置IO口的模式(模拟输入?浮空输入?上拉输入?下拉输入?推挽输出?开漏输出?复用推挽输出?复用开漏输出?);2、若是输出端口,还需配置最大输出速度。
再次,利用STM32F103系列芯片的“位段”特性,将GPIO的输入寄存器(GPIOx_IDR)或输出寄存器(GPIOx_ODR)中每一位对映到“别名存储区”相应的字节。
这样,对“别名存储区”中相应字节的读/写 即相当于对 输入寄存器/输出寄存器的读/写。
位段的映射例子(假设PE2初始化为上拉输入,PE1初始化为推挽输出):
#define X00 (*(__IO uint32_t *) (PERIPH_BB_BASE + ((GPIOE_BASE+8 - PERIPH_BASE) * 32) + (2 * 4)))
//这是将GPIOE_IDR.bit2映射为 X00;这样,对X00读入相当于对GPIOE_IDR的bit2的读入。如:当GPIOE_IDR.bit2为高时,X00的最低位为1;当bit2为低时,X00的最低位为0。 注:X00是8位数据,但只有最低有效,即只有最低位指示GPIOE_IDR.bit2的状态,其他位无效。
#define Y00(X) (*(__IO uint32_t *) (PERIPH_BB_BASE + ((GPIOE_BASE+12 - PERIPH_BASE) * 32) + (1 * 4))=X)
//这一句是将GPIOE_ODR.bit1映射为Y00。如:若要GPIOE_ODR.bit1置高,只需写命令 Y00(1); 即可;若要将GPIOE_ODR.bit1拉低,只需写 Y00(0); 就可以了。 注:X可以是8位数据,但只有最低位有效,即只有最低位会影响GPIOE_ODR.bit1的状态,其他位无效。