stm32 对输入输出的控制是通过读写对应的寄存器来实现的。
控制gpio的寄存器可以看作是这样的结构体:
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
CRL与CRH储存输出频率与输入输出模式(CRL储存0-7号,CRH储存8-15号)
IDR是输入数据寄存器,储存了输入到该端口的寄存器,储存方式是如果引脚x输入1,则IDR的第x位为1,若输入0则第x位为0.
ODR是输出数据寄存器,储存了输出到该端口的寄存器,如果想让引脚x输出1,则在x为储存1,如果输出0则在x+8为储存1.
BSRR是置位数据寄存器,如果想让引脚x输出1,则在x为储存1,如果输出0则在x+8为储存1.
我们常用STM32CubeMX配置GPIO
而stm32CubeMX是通过HAL库来控制GPIO的
下面会通过详解HAL库中的具体代码解释这些寄存器
一、输入输出
输出:
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));
if (PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
}
}
如果输出1,则在BSRR对应位置1,如果输出0,则在BSRR对应位+8置1,单片机会根据BSRR修改ODR从而输出指定信号。
输入:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
GPIO_PinState bitstatus;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
{
bitstatus = GPIO_PIN_SET;
}
else
{
bitstatus = GPIO_PIN_RESET;
}
return bitstatus;
}
如果输入1,那么IDR寄存器对应位就会置1,如果为0则置0.
还有一个翻转引脚输出:
<