历史上的今天
返回首页

历史上的今天

今天是:2025年02月09日(星期日)

正在发生

2021年02月09日 | STM32F4之GPIO的使用

2021-02-09 来源:eefocus

上次学STM32F103是在大二的暑假,学了一段时间之后也没有项目做,渐渐地就转向其他的方向,最近实习要用到STM32F407,就打算从头学,但是一些基础还在,并决定将学习的过程记录一下,以备使用。


 一.STM32F407ZGT6的GPIO资源介绍


STM32F407ZGT6

    -  一共有7组IO口

    - 每组IO口有16个IO

    - 一共16X7=112个IO

外加2个PH0和PH1

一共114个IO口

    

二.GPIO的相关寄存器


    一组IO口相关的寄存器有10个,也就是说,10个寄存器控制一组IO口;


一个端口模式寄存器(GPIOx_MODER)

一个端口输出类型寄存器(GPIOx_OTYPER)

一个端口输出速度寄存器(GPIOx_OSPEEDR)

一个端口上拉下拉寄存器(GPIOx_PUPDR)

一个端口输入数据寄存器(GPIOx_IDR)

一个端口输出数据寄存器(GPIOx_ODR)

一个端口置位/复位寄存器(GPIOx_BSRR)

一个端口配置锁存寄存器(GPIOx_LCKR)

两个复位功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)

三.GPIO的配置流程


//声明一个GPIO结构体变量

GPIO_InitTypeDef GPIO_InitStructure;

delay_init(84);

//使能GPIO所在的总线的时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

    //定义该结构体

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//使用的IO口 (总共有16个IO口)

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;         //设置IO的模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;    //100MHz

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉

    //初始化该结构体

GPIO_Init(GPIOF,&GPIO_InitStructure);

分析:   


(1) GPIO的重要结构体,对其进行赋值


typedef struct

{

  uint32_t GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.

                                       This parameter can be any value of @ref GPIO_pins_define */

 

  GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.

                                       This parameter can be a value of @ref GPIOMode_TypeDef */

 

  GPIOSpeed_TypeDef GPIO_Speed;   /*!< Specifies the speed for the selected pins.

                                       This parameter can be a value of @ref GPIOSpeed_TypeDef */

 

  GPIOOType_TypeDef GPIO_OType;   /*!< Specifies the operating output type for the selected pins.

                                       This parameter can be a value of @ref GPIOOType_TypeDef */

 

  GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.

                                       This parameter can be a value of @ref GPIOPuPd_TypeDef */

}GPIO_InitTypeDef;

 


( 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 复用推挽输出


8种配置模式的使用场景

二.GPIO的时钟使能

     

时钟使能的函数在stm32f4xx_rcc.h中,根据上图,外设在哪一条时钟总线上进行函数选择,所以GPIOF在AHB1总线上,此时选择的函数为:


RCC_AHB1PeriphClockCmd();

四.GPIO相关重要函数


重要函数:

1个初始化函数:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

 

2个读取输入电平函数:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

 

2个读取输出电平函数:

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

 

4个设置输出电平函数:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

 因此此时就可以用,以下函数进行点亮,熄灭LED了


void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

具体代码如下:


int main(void)

{

//声明一个GPIO结构体变量

GPIO_InitTypeDef GPIO_InitStructure;

delay_init(84);

//GPIO时钟使能

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//PIN9 PIN10 分别连接LED0 LED1

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;         //设置GPIO为输出模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;    //100MHz的时钟

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //Í推挽输出

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;     //上拉­

GPIO_Init(GPIOF,&GPIO_InitStructure);

while(1)

{

GPIO_SetBits(GPIOF,GPIO_Pin_9 |GPIO_Pin_10);//同时点亮LED

delay_ms(1000);

GPIO_ResetBits(GPIOF,GPIO_Pin_9 |GPIO_Pin_10);//同时熄灭LED

delay_ms(1000);

}

 

}


推荐阅读

史海拾趣

Bergquist Company公司的发展小趣事

随着导热材料技术的不断进步,其应用领域也在不断扩展。Bergquist Company紧跟市场需求,将导热产品应用于汽车、家用电器、电脑、散热器、电源供应器及电马达控制等多个领域。这些产品的广泛应用不仅提升了人们的生活品质,还为公司的持续发展注入了强大动力。

Hendon Semiconductors公司的发展小趣事

Hendon Semiconductors的起源可以追溯到上世纪90年代,当时它是Philips半导体在澳大利亚的一个分支机构。1997年,随着业务重组和战略调整,该分支机构转变为独立运营的公司,并更名为Integrated Electronic Solutions Pty. Ltd。这一转变标志着Hendon Semiconductors在电子设计与制造领域迈出了重要一步。通过继承Philips半导体的技术遗产和市场资源,Hendon Semiconductors迅速在行业内站稳脚跟,并开始了其自主发展的道路。

乐鑫(espressif)公司的发展小趣事

乐鑫科技自创立之初,就致力于物联网(IoT)领域的芯片设计和技术创新。公司凭借其独特的芯片设计能力和连接技术,成功开发了一系列具有竞争力的产品,为全球开发者提供了高效、可靠的物联网解决方案。乐鑫科技始终坚持以技术创新为核心,通过自主研发和持续投入,不断提升产品的性能和竞争力。

歌尔(Goertek)公司的发展小趣事

乐鑫科技自创立之初,就致力于物联网(IoT)领域的芯片设计和技术创新。公司凭借其独特的芯片设计能力和连接技术,成功开发了一系列具有竞争力的产品,为全球开发者提供了高效、可靠的物联网解决方案。乐鑫科技始终坚持以技术创新为核心,通过自主研发和持续投入,不断提升产品的性能和竞争力。

广州奥松公司的发展小趣事

奥松电子在传感器领域取得了显著的突破。公司凭借其强大的研发实力和技术创新能力,成功开发出一系列具有自主知识产权的传感器产品。这些传感器产品不仅性能稳定、测量精度高,而且具有广泛的应用领域。在医疗、轨道交通、智能家电等多个领域,奥松电子的传感器产品都得到了广泛的应用和认可。这些产品的成功应用,不仅提升了公司的市场竞争力,也为公司的未来发展提供了更多的可能性。

这五个故事展示了广州奥松电子股份有限公司在电子行业中发展起来的历程和成就。通过不断的技术创新和市场拓展,奥松电子已经成功成为了国内电子行业中的佼佼者。未来,随着技术的不断进步和市场需求的不断变化,奥松电子将继续保持其领先地位,为电子行业的发展做出更大的贡献。

Epistar Corp公司的发展小趣事

作为一家电子产品制造企业,Epistar始终关注环保和可持续发展问题。公司积极采用环保材料和生产工艺减少污染排放和能源消耗;同时,Epistar还加强了对废旧产品的回收和处理工作以减少对环境的负面影响。这些努力不仅提升了公司的社会形象也增强了公司的市场竞争力。

问答坊 | AI 解惑

夏玄雪(我喜欢的一本书,推荐你看)

我喜欢的一本书,推荐你看 呵呵…

查看全部问答>

疯狂的ISE软件,崩溃了

搞了一段时间ISE,几乎就要崩溃了     最近做个东西,要用到xilinx的ISe开发软件,找了很久,也下载了几个 但都是没法安装,把我搞惨了,哪位朋友能给我发一个不?版本不要太高, ise6.2等级别的,万分感谢了 我的邮箱是317930100@qq ...…

查看全部问答>

啥地方要用到30层PCB?

来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 群主:wangkj…

查看全部问答>

LED芯片发光简点介绍

LED是T型和N型半导体,三价有电洞,五价提供电子,两者结合中间有空乏区,能够产生能量,光就发出来。由于它是半导体,有能隙,随著参杂元素的不同而产生不同能隙,从氮化镓的3.4eV到磷化铟的1.35eV,波长亦随著改变,而产生出不同的颜色,从紫外光 ...…

查看全部问答>

求菲利浦的 PDIUSBD12 的驱动,和使用方法

用51 + PDIUSBD12 ,实现和 PC通信,固件程序写好了,可是找不到PC winxp的驱动, 求菲利浦的 PDIUSBD12 的驱动,和使用方法。 如果谁知道哪里可以下载麻烦告知一下。也可发我邮箱 yuexianhanshu@yahoo.com.cn 谢了…

查看全部问答>

如何支持media player?

wince5.0,已经把media player相关的组件都加入了,格式支持都加入了,基本上multimedia里面的都加上了。 启动后看到.mpg,.wmv的文件图标改了,.avi的图标没变。 打开.wmv,提示缺少一个解码器,然后只有声音没有图像。 .mpg的都不能打开。试过 ...…

查看全部问答>

用89C2051芯片取代89c51芯片的问题

本人用了89C51写了一个时钟显示程序,硬件电路共有4个单独的数码管显示,P1.1G至P1.7接了数码管的A、B、C、D、E、F、G   P2.3接了显示时的个位数码管DP脚,P2.7、P2.6、P2.5、P2.4分别接了时的十位数码管、时的个位数码管、分的十位数码管、 ...…

查看全部问答>

智能家居系统中国标准

基于EIB标准的智能家居系统,供大家参考…

查看全部问答>

STM32的引脚配置确实灵活!

                                 灵活到让人有点不知所措了!…

查看全部问答>