基于STM32的嵌入式系统原理与应用-第4章 GPIO输出原理_第1页
基于STM32的嵌入式系统原理与应用-第4章 GPIO输出原理_第2页
基于STM32的嵌入式系统原理与应用-第4章 GPIO输出原理_第3页
基于STM32的嵌入式系统原理与应用-第4章 GPIO输出原理_第4页
基于STM32的嵌入式系统原理与应用-第4章 GPIO输出原理_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章GPIO输出原理及应用基于STM32的嵌入式系统原理与应用ONTENTS目录C01GPIO介绍02GPIO结构框图03点亮LED案例01GPIO介绍4.1GPIO介绍GPIO,全称为GeneralPurposeInputOutput(通用输入输出),是一种通用的数字输入/输出端口。在嵌入式系统中,GPIO被设计为灵活的引脚,可以被配置为输入或输出,以满足不同的应用需求。作为输入端口时,我们可以通过它们读入引脚的状态--高电平或低电平,作为输出端口时,我们可以通过它们输出高电平或低电平来控制连接的外围设备。01020304输入上拉特点:输入用,使用内部上拉电阻,初始状态是高电平。应用:适用于外部信号默认为高电平的情况,如按钮按下时会拉低信号。输入浮空特点:输入用,完全浮空,状态不定。应用:适用于需要读取外部信号的场景,但外部信号状态不确定。模拟功能特点:用于连接模拟外设,如ADC(模数转换器)、DAC(数模转换器)等。应用:适用于需要进行模拟信号处理的场景。输入下拉特点:输入用,使用内部下拉电阻,初始状态是低电平。应用:适用于外部信号默认为低电平的情况,如按钮按下时会拉高信号。1.输入模式01020304推挽输出特点:驱动能力强,支持通用输出,可提供较大电流。应用:适用于需要输出到外部设备,需要较大驱动能力的场景。开漏输出特点:用于实现开漏输出,常用于构建总线,如I2C。应用:适用于需要多个输出端口共享同一信号线的场景,例如I2C的SDA、SCL线。推挽式复用功能特点:用于实现推挽输出,并复用了片上外设功能。应用:适用于需要实现外设功能,同时需要提供较大驱动能力的场景,例如SPI的SCK、MISO、MOSI线。开漏式复用功能特点:用于实现开漏输出,并复用了片上外设功能。应用:适用于需要实现外设功能,同时共享信号线的场景,例如硬件I2C的SDA、SCL线。2.输出模式02GPIO结构框图4.2.1输入配置4.2.2输出配置一个端口模式寄存器(GPIOx_MODER)一个端口输出类型寄存器(GPIOx_OTYPER)一个端口输出速度寄存器(GPIOx_OSPEEDR)一个端口上拉下拉寄存器(GPIOx_PUPDR)一个端口输入数据寄存器(GPIOx_IDR)一个端口输出数据寄存器(GPIOx_ODR)一个端口置位/复位寄存器(GPIOx_BSRR)一个端口配置锁存寄存器(GPIOx_LCKR)两个复位功能寄存器(低位GPIOx_AFRL&GPIOx_AFRH)4.2.3寄存器Stm32F407每组GPIO口含下面10个寄存器。可以控制一组GPIO的16个IO口。10个寄存器分别是:03点亮LED案例4.3点亮LED案例利用STM32开发板,通过HAL库函数对相关寄存器的控制,实现对开发板上LED灯的控制。本章节选用的是STM32F407单片机,实验结果是使STM32F4精英版上的LED进行闪烁。案例介绍使能IO口时钟调用函数RCC_AHB1PeriphColckCmd();初始化IO口模式操作IO口调用函数GPIO_Init();输出高低电平。GPIO配置步骤GPIO配置步骤4.3.1硬件设计硬件设计原理图中将LED0、LED1分别与引脚PF9、PF10连接。LED与STM32F407的硬件连接如图所示。从按键的电路原理图可知,我们要点亮LED0,即对PF9进行操作;我们看到LED0右端接的是VCC3.3V,那么只需要控制左端的PF9输出即可;(输出0点亮,输出1熄灭);我们还需要确定PF9的工作模式;我们采用推挽输出,其特点为:输出引脚电平,高电平为VDD,低电平为VSS;库函数寄存器位带操作为了使工程更加有条理,我们把按键相关的代码独立分开存储,方便以后移植。在之前建好的“第一个工程”之上新建“led.c”及“led.h”文件,这些文件均可依据自己的想法命名,这些文件不属于STM32标准库的内容,是根据应用需要编写的。GPIO点亮LED有3种实现方式,分别是库函数,寄存器和位带操作。本文主要以库函数方式为例。4.3.2软件设计1、文件结构设计在头文件led.h中包含MDK提供的头文件stm32f4xx.h。在源文件led.c中,进行LED初始化函数的编写。主函数main.c中,主要进行函数调用,实现控制程序的逻辑流程,以实现相应的功能。2、程序流程设计系统启动进入到main函数中执行,首先开启外设时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE)。初始化使用的GPIO初始化LED使用的GPIO,包括引脚的模式、上下拉、端口速度等。main函数中编写循环语句,通过延时1秒来控制两个LED灯的亮灭交替。3、代码实现

(1)LED的GPIO初始化具体流程为:先定义GPIO初始化结构体变量,以便下面用于存储GPIO配置,然后,向GPIO初始化结构体赋值,把引脚初始化成推挽输出模式,LED0与LED1对应的引脚设置上拉,端口速率为设置为50M。最后,使用以上初始化结构体的配置,调用GPIO_Init函数向寄存器写入参数,完成GPIO的初始化。GPIOF9与GPIOF10两个端口的配置相同,我们可以使用“|”操作简化代码。代码如下:3、代码实现//LEDIO初始化函数voidLED_Init(void){GPIO_InitTypeDefGPIO_InitStructure;//定义结构体变量//GPIOF9,F10引脚的初始化GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//LED0和LED1对应引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50HzGPIO_Init(GPIOF,&GPIO_InitStructure);//初始化GPIOF9,F10}3、代码实现

(2)初始化LED后,就可以通过对相应引脚输出高低电平来控制LED灯的亮灭。在main.c中编写控制LED亮灭的代码。主函数中通过调用库函数RCC_AHB1PeriphClockCmd来使能LED的GPIO端口时钟,然后初始化连接LED的端口。在while(1)死循环里,LED0跟LED1先是灭的状态,一秒后变成亮的状态,再过一秒后又灭了,如此间隔1秒循环亮灭。3、代码实现//两个LED灯间隔1秒交替亮灭intmain(void){delay_init(168);//初始化延时函数RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF时钟 LED_Init();//初始化LED端口while(1){ GPIO_SetBits(GPIOF,GPIO_Pin_9);//设置GPIOF9输出为高电平(1) GPIO_SetBits(GPIOF,GPIO_Pin_10);//设置GPIOF10输出为高电平(1) delay_ms(1000);//延时1秒 GPIO_ResetBits(GPIOF,GPIO_Pin_9);//设置GPIOF9输出为低电平(0) GPIO_ResetBits(GPIOF,GPIO_Pin_10);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论