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-17 14:30

stm32学习笔记(一) GPIO
战舰开发板的程序 main函数 int main(void) { delay_init(); //延时函数初始化 LED_Init(); //初始化与led连接的硬件配置 while(1) { LED0=1; LED1=1; delay_ms(300); LED0=0; LED1=0; delay_ms(300); } } delay_init();函数 void delay_init() { #ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了. u32 reload; #e
[单片机]
基于STM32的八种GPIO输入输出模式解析
最近在看数据手册的时候,发现STM32的GPIO输入输出模式的配置种类有8种之多(输入和输入各4种): (1)GPIO_Mode_AIN模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD下拉输入 (4)GPIO_Mode_IPU上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD复用开漏输出 (8)GPIO_Mode_AF_PP复用推挽输出 我们平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但对于各种模式下IO口的内部电路和典型应用,STM32的数据手册中也未曾做过详细的说明和归纳
[单片机]
基于STM32的八种<font color='red'>GPIO</font>输入输出模式解析
STM32 初练总结(GPIO
最近有项目需要用到STM32,开始系统的学习一下STM32这块芯片,整理了一些初学的心得,以备以后忘记了可以回来再看。 管脚资源确认 首先确定所用的STM32型号对应的GPIO管脚资源,一般都会把GPIO管脚分成好几组,比如GPIOA、GPIOB、GPIOC、GPIOD~GPIOG等,一般管脚数越多,分的组也越多,有些管脚是GPIO和其他功能复用的,一些GPIO管脚已经默认了特定的功能,如果要重新自定义映射管脚,需要打开AFIO功能开启重映射。 STM32 库导入和确认 1、STM官网上有STM开发相关的组件资源和库文件,这个网上有很多资源可以利用,先下载然后解压,并按照keil的流程建立一个STM32工程。
[单片机]
STM32 初练总结(<font color='red'>GPIO</font>)
AM335x(TQ335x)学习笔记——GPIO按键驱动移植
还是按照S5PV210的学习顺序来,我们首先解决按键问题。TQ335x有六个用户按键,分别是上、下、左、右、Enter和ESC。开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题,但是浏览driver/input/keyboard目录时意外的发现了gpio-keys.c,大体上看下该驱动程序,其功能是实现了通用的gpio按键。再去看了下DTS,发现DTS中有对gpio-keys的引用,于是猜到,新的内核不需要自己编写输入子系统驱动,可以通过配置DTS直接解决按键问题。本人最终通过实验证实了这个猜想,下面是实验笔记及本人的一些理解。 (1)确定GPIO管脚 通过查看TQ335x的原理图可以看到,TQ335x的6
[单片机]
stm32GPIO中的8种模式
一、推挽输出:可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 二、开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点:
[单片机]
【ARM】ARM体系结构-GPIO
GPIO Gerneral-Purpose IO ports,即通用IO口。   在嵌入式系统中常常有数量众多,但是却比较简单的外部设备/电路。   对这些设备/电路,有的需要CPU为之提供控制手段,有的则需要被CPU用做输入信号。   许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如控制某个LED灯亮与灭;或者通过获取某个管脚的电平属性来达到判断外围设备的状态。   对这些设备/电路的控制,使用传统的串行口或并行口都不合适,所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。 接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。 数据寄存器的各
[单片机]
stm32单片机GPIO端口的特点及应用解析
一、GPIO的综合描述 stm32每一个GPIO端口拥有2个32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2个32bits的数据寄存器(GPIOx_IDR,GPIOx_ODR),1个32bits的set/reset寄存器(GPIOx_BSRR),1个16bits的reset寄存器(GPIOx_BRR)和1个32bits的Lock寄存器(GPIOx_LCKR)。 (一)每一个IO引脚都可以使用软件配置为以下几种模式: 1. 浮空输入 2. 带上拉输入 3. 带下拉输入 4. 模拟输入 5. 开漏输出——(此模式可实现hotpower说的真双向IO) 6. 推挽输出 7. 复用功能的推挽
[单片机]
GD32F303固件库开发(5)----GPIO输出模式,速率测试、开漏和输出说明
概述 以STM32CUBEMX创建STM32F103工程,同时移植在GD32F303中,同时通过GD32303C_START开发板内进行验证。 需要样片的可以加Qun申请:615061293。 硬件准备 这里准备了2块开发板进行验证,分别是GD32303C_START开发板。 样品申请 https://www.wjx.top/vm/wFGhGPF.aspx# 开发板管脚配置 在GD32303C_START中的LED管脚配置如下所示。 不同速率对应的波形 以PC3为例,在推挽输出无上下拉情况下,输出速率主要有4种,一般的低端MCU只有3种,没有Very High。 下面是ST的配置图。 在固件库中,定义如下所示。
[单片机]
GD32F303固件库开发(5)----<font color='red'>GPIO</font>输出模式,速率测试、开漏和输出说明
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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