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

发布者:Jinyu521最新更新时间:2020-07-17 来源: eefocus关键字:GPIO  复位函数  void 手机看文章 扫描二维码
随时随地手机看文章

通常我们需要对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口的寄存器可以任意读写了。

关键字:GPIO  复位函数  void 引用地址:GPIO复位函数void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解

上一篇:单片机控制TFT液晶屏显示数字
下一篇:ST之GPIO使用之理解

推荐阅读最新更新时间:2024-11-02 00:44

这8种STM32中GPIO工作模式,你都知道吗?
一、推挽输出:可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 二、开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点: 1、利用外部电
[单片机]
这8种STM32中<font color='red'>GPIO</font>工作模式,你都知道吗?
STM32F4XXGPIO知识点总结<2>——GPIO寄存器介绍
在使用库函数编写STM32单片机GPIO程序时,一般都是通过配置相应的寄存器来实现具体的功能。下面将根据《STM32参考手册》对各个寄存器进行梳理。 每个通用I/O端口包括4个32位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和GPIOx_PUPDR)、2个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)、一个32位置位/复位寄存器(GPIOx_BSRR)、1个32位锁存寄存器(GPIOx_LCKR)和2个32位复用功能选择寄存器(GPIOx_AFRH和GPIOx_AFRL)。 GPIO按照功能分类: (1)I/O端口控制寄存器 每个GPIO有4个32位存储器映射的控制
[单片机]
STM32F4XXGPIO知识点总结<2>——<font color='red'>GPIO</font>寄存器介绍
关于STM32的GPIO配置不同输出速度会有什么影响?
今天有人问:GPIO配置不同输出速度会有什么影响?你知道答案吗? 1写在前面 这个问题看起来比较简单,我相信很多人都能说出答案。 但是,很多人都只是停留在表面,至于深层次的含义,估计很少有人思考。 需要更深理解其中含义,可能需要结合特定场景来说,我自己也是在项目中才深刻体会其中含义。 2GPIO输出速度 不管标准外设库,还是STM32CubeMX配置GPIO输出引脚,都会有速度GPIO_InitStruct.Speed这个选项。 类似如下: GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruc
[单片机]
关于STM32的<font color='red'>GPIO</font>配置不同输出速度会有什么影响?
STM32单片机 GPIO寄存器
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR。 数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。每个I/O端
[单片机]
【ARM】s3c2440之gpio按键控制
功能 通过GPIO,实现按键1点亮LED1,按键2点亮LED2…… 说明 1)因为2440的按键只涉及行,所以在扫描按键时比2410简单了很多 2)在进行移位操作之前,必须进行数据寄存器的初始化,否则会出错(硬件特性) 源码 /***************************************************************************** *****函数名:main() *****功 能:通过GPIO,实现按键1点亮LED1,按键2点亮LED2 *****说 明: *********************************************************
[单片机]
基于STM32CubeIDE软件实现的STM32外部中断实例
本文用STM32CubeIDE软件实现STM32外部中断实例。 新建工程 “File”-“New”-“STM32 Project”。 输入芯片型号STM32F103ZE。 选择相应封装,下一步。 填写项目名,选择工程位置,下一步。 配置时钟、调试模式 选择高速外部时钟。 HCLK总线时钟处输入72,回车,配置使用最高时钟频率。 调试模式选择串行,方便下载程序。 配置管脚外设 本实例中用到了LED1与KEY_LEFT,找到相应电路图。 可见LED1对应PC0管脚,低电平点亮。按键K1对应PE2管脚,低电平有效。 PC0配置为GPIO_Output,GPIO输出模式 PE2配置为GPIO_EX
[单片机]
基于STM32CubeIDE软件实现的STM32外部中断实例
对于STM32 GPIO模式不理解造成的问题解释
今天在编写Flash的程序时候,在最后,所有的程序都已经编写完成,经过测试,没有问题。接下来就是整理程序,自己将一些函数封装,可以便于自己以后移植,但是问题就出现在了这儿。 我在封装的过程中,突然发现自己如果将SPI模式初始化函数放置在 CS引脚初始化后面,接下来直接读取 Flash芯片ID的时候使用Jlink读取的数据就不能显示正常,显示数据为0xFFFF,但是,如果我将SPI模式初始化函数放置在 CS引脚初始化前面,整个程序运行是正常的。 真的是百思不得其解,我当时在想,不应该是CS初始化的影响,但是自己真的是没找见问题,最后,就到21IC上面去求助,当时我写完问题之后,接下来做什么? 接着自己找问题呗,还能做什么。 当时我又
[单片机]
STM32-GPIO口设为外部中断时,中断函数名称
以A口为例,A0~A4中断函数名称为: void EXTI0_IRQHandler(void ); void EXTI1_IRQHandler(void ); void EXTI2_IRQHandler(void ); void EXTI3_IRQHandler(void ); A5~A9: void EXTI9_5_IRQHandler(void ); A10~A15: void EXTI15_10_IRQHandler(void );
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved