stm32f103如何直接操纵和读取单个i尀o口的值

2024-12-01 07:33:12
推荐回答(1个)
回答1:

首先,要确定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的状态,其他位无效。