• 首页
  • 中国
  • GPIO复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解

GPIO复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解

2023-11-01 47浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

通常我们需要对ST单片机的整个IO进行复位操作,这是我们可以用到复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx);

先来看一下这个函数的定义

void GPIO_DeInit(GPIO_TypeDef* GPIOx)

{

/* Check the parameters */

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

if (GPIOx == GPIOA)

{

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);

}

else if (GPIOx == GPIOB)

{

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);

}

else if (GPIOx == GPIOC)

{

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);

}

else if (GPIOx == GPIOD)

{

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE);

}

else if (GPIOx == GPIOE)

{

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE);

}

else if (GPIOx == GPIOF)

{

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE);

}

else

{

if (GPIOx == GPIOG)

{

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE);

}

}

}

这便是对一组IO进行复位的函数,它先后2次调用了函数void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState),

而且这PA,PB,PC,PD,PE,PF,PG 7组IO口的时钟都挂载在了APB2总线上。

**次调用这个函数RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE)是对PA口的寄存器进行复位使其为0,

第二次调用这个函数RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE)是对PA口的寄存器进行复位接触,之后可以对PA口的寄存器进行读写操作。

再来详细看一下这个函数void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

{

/* Check the parameters */

assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));

assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE)

{

RCC->APB2RSTR |= RCC_APB2Periph;

}

else

{

RCC->APB2RSTR &= ~RCC_APB2Periph;

}

}

RCC->APB2RSTR |= RCC_APB2Periph这句话对RCC的寄存器进行置位操作,也是对传进来的RCC_APB2Periph_GPIOA的PA口进行复位操作,执行后RCC的寄存器APB2RSTR的第3位为1,即D2位为1,执行后PA口的寄存器GPIOA_ODR为0。

RCC->APB2RSTR &= ~RCC_APB2Periph这句话即对PA口的寄存器进行复位解除,执行后RCC的寄存器APB2RSTR的第3位为0,PA口的寄存器可以任意读写了。

百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台