STM32——GPIO设置:快速点亮第一个LED灯

发布者:Amybaby最新更新时间:2020-08-28 来源: eefocus关键字:STM32  GPIO设置  LED灯 手机看文章 扫描二维码
随时随地手机看文章

简介

不同的开发板的原理图结构也不尽相同,笔者在这里使用野火的MINI-V3(F103VET6)简易开发板对GPIO口的设置做一个简单的介绍,并实现按键控制LED灯的亮灭。方便读者可以快速熟悉并灵活应用。


原理图分析

首先我们来看一下发光二极管部分和按键部分的原理图。

LED原理图

下面是按键的原理图部分:

button

在这里,我们将使用KEY1(PA0)来控制红灯PB5的亮灭。由原理图可知,其控制LED灯的PB5引脚为低电平时,灯亮。当KEY1按下时,PA0引脚由之前的低电平转为高电平(3V3)。明确了目的之后我们就可以分析GPIO口并进行设置了。


GPIO设置

经过上述的功能明确之后,我们将其分为两大类,分别是输入类(如按键)和输出类(LED灯)。


STM32系列单片机的引脚有着丰富的功能,在这里将其芯片的GPIO口部分的结构图放出,有兴趣的朋友可自行研究或在评论区留言讨论。在这里笔者将不再讲解时钟树的相关内容,以免对初学者造成较大压力,有兴趣的朋友可自行参考官方文档。

GPIO结构图

输入输出模式

GPIO的输入、输出种类详见下表。

功能名称简述
输入上拉输入(GPIO_Mode_IPU)默认状态下(引脚无输入),读得的数据为1,高电平
输入下拉输入(GPIO_Mode_IPD)与上拉输入相反,默认为0,低电平
输入浮空输入(GPIO_Mode_IN_FLOATING)输入不确定,无上拉和下拉。输入阻抗较大,一般用于标准通信协议如、USART的接收端
输入模拟输入模式(GPIO_Mode_AIN)一般由ADC采集电压信号时将其设置为模拟输入。
输出普通推挽输出(GPIO_Mode_Out_PP)输出电平为3.3V
输出普通开漏输出(GPIO_Mode_Out_OD)若要输出5V,则需外加上拉电阻,电源为5V。输出为高阻态时,由上拉电阻和电源向外输出5V的高电平
输出复用推挽输出(GPIO_Mode_AF_PP)引脚复用功能采用复用模式
输出复用开漏输出(GPIO_Mode_AF_OD)复用模式,且加入上拉电阻

由上表可知,我们需要将LED灯的引脚设置为推挽输出。按键部分的输入可以是上拉输入也可以是下拉输入。在这里,因为我们的电路原理图设置的是按键按下为高,释放为低。所以我们使用下拉输入的模式 。


结构体设置

STM32以高效的库函数开发而著称。由于其寄存器过多,不适合类似51系列单片机的寄存器操作,所以我们将直接采用库函数开发的方法(CMSIS 3.5.0版本)。


STM32的库函数将结构体的功效发挥到了极致,我们首先来看一下GPIO口的结构体定义:


typedef struct {

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

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


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

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


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

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

}GPIO_InitTypeDef;


在这个结构体之中,主要包括三个成员:引脚设置(GPIO_Pin)、引脚最大输出速度(GPIO_Speed)和引脚模式(GPIO_Mode)。在这之中,GPIO还有一个重要的定义,即确定组别:GPIOA~GPIOG.

他们的种类又可以分别划分为:


GPIO_Speed:

GPIO_Speed_10MHz

GPIO_Speed_2MHz

GPIO_Speed_50MHz

GPIO_Mode:

GPIO_Mode_AIN

GPIO_Mode_IN_FLOATING

GPIO_Mode_IPD

GPIO_Mode_IPU

GPIO_Mode_Out_OD

GPIO_Mode_Out_PP

GPIO_Mode_AF_OD

GPIO_Mode_AF_PP

GPIO_Pin:

GPIO_Pin_0

GPIO_Pin_1

GPIO_Pin_2

GPIO_Pin_3

GPIO_Pin_4

GPIO_Pin_5

GPIO_Pin_6

GPIO_Pin_7

GPIO_Pin_8

GPIO_Pin_9

GPIO_Pin_10

GPIO_Pin_11

GPIO_Pin_12

GPIO_Pin_13

GPIO_Pin_14

GPIO_Pin_15

熟悉结构体类别以后我们可以进行结构体的定义以及GPIO口的初始化。由于GPIO处于APB2时钟线下,所以我们必须要开启相应的时钟。代码如下:


void key_gpio_config(void) {

    GPIO_InitTypeDef key_struct;    // 定义结构体

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   // 开启时钟

    key_struct.GPIO_Pin = GPIO_Pin_0;    //结构体成员设置;对于按键初始化而言,由于GPIO是输入模式,故不必设置最大输出速度

    key_struct.GPIO_Mode = GPIO_Mode_IPD;

    GPIO_Init(GPIOA, &key_struct);    // 初始化引脚

}


void led_gpio_config(void) {    // 同上

    GPIO_InitTypeDef led_struct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    led_struct.GPIO_Pin = GPIO_Pin_5;

    led_struct.GPIO_Speed = GPIO_Speed_50MHz;

    led_struct.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(GPIOB, &led_struct);

}


自此,结构体设置结束。下面进行GPIO口的操作。


GPIO操作

对于库函数开发来说,一切硬件操作都可以使用函数来解决。如:



uint16_t  GPIO_ReadInputData (GPIO_TypeDef *GPIOx) 

  // Reads the specified GPIO input data port. 


uint8_t  GPIO_ReadInputDataBit (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) 

  // Reads the specified input port pin. 


uint16_t  GPIO_ReadOutputData (GPIO_TypeDef *GPIOx) 

  // Reads the specified GPIO output data port. 


uint8_t  GPIO_ReadOutputDataBit (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) 

  // Reads the specified output data port bit. 


void  GPIO_ResetBits (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) 

  // Clears the selected data port bits. 


void  GPIO_SetBits (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) 

  // Sets the selected data port bits. 


void  GPIO_StructInit (GPIO_InitTypeDef *GPIO_InitStruct) 

  // Fills each GPIO_InitStruct member with its default value. 


void  GPIO_Write (GPIO_TypeDef *GPIOx, uint16_t PortVal) 

  // Writes data to the specified GPIO data port. 


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

  // Sets or clears the selected data port bit. 


对于本题目而言,使用简单的写入操作即可。


int main()

{

    led_gpio_config();

    GPIO_WriteBit(GPIOB, GPIO_Pin_5, 1);    //初始化,使灯为熄灭状态

    key_gpio_config();


    while(1) {

        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1) {

            GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);

        }

        else {

            GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);

        }

    }

}


至此,GPIO的操作完成,功能也成功实现。但是按键部分未加消抖处理,所以可能出现不稳定的状态。不过对于本示例来说,这一现象并不明显。


关键字:STM32  GPIO设置  LED灯 引用地址:STM32——GPIO设置:快速点亮第一个LED灯

上一篇:STM32之LED配置
下一篇:STM32单片机基础03——使用GPIO点亮一个LED

推荐阅读最新更新时间:2024-11-12 10:37

STM32 CAN总线筛选器的四种情况
STM32CAN控制器每个筛选器组由两个32位的寄存器组成。 根据所需位宽的不同,各个筛选器可配置成16位或32位模式(如下图,当FSCx=1为32位模式,FSCx=0时为16位模式)。同时,筛选器的模式可配置成掩码模式和列表模式(FBMx=0为掩码模式,FBMx=1为列表模式)。 掩码模式:对报文ID的每一位可选择必须相同和不管它。 列表模式:只给出接收的ID,其它的一概不接收。 下面将这四种情况分别介绍一下: 1、1个32位筛选器——掩码模式 第一个筛选器写入报文ID,第二个筛选器规定对应的每个位是检查它(置1)还是不管它(置0)。 例如,第一个筛选器设置为0x0000,这时候如果第二个筛选器设置0xFFFF,就意
[单片机]
<font color='red'>STM32</font> CAN总线筛选器的四种情况
STM32串口使用心得(一)——DMA+空闲中断接收
一,因何用之? 之前曾经写过一篇《关于CubeMX的串口全双工接收发送锁死的问题》的文章,讨论了STM32的串口在全双工模式下会出现锁死问题的现象。当时的解决办法是在串口接收中断中加入解锁机制,貌似临时解决了这个问题。但这几天程序不知道怎么回事,又开始频繁地出现死机现象,而且仿真的时候会进入HardFault()。 二,缘何致之? 最让人头疼的问题就是大部分时间里没有问题。 死机的现象总是在意想不到的情形下发生,可能刚下载完程序就出现了;或者正常跑了好几天才出现。所以,为了寻找死机的原因,采取了以下两种方式: 1,缩短任务执行的延时,加重MCU负担。此举可使死机的概率大幅提高。(仔细想来,之前貌似解决问题的时候
[单片机]
JSN-SR04T超声波模块驱动(模式一、STM32
一、前期准备 单片机:STM32F103C8T6 开发环境:MDK5.14 库函数:标准库V3.5 JSN-SR04T模块:淘宝有售 二、实验效果 三、驱动原理 此模块分3中模式: (1)模式一:R27 = open,普通驱动模式; (2)模式二:R27 = 47K,串口模式,每隔100ms更新一次数据。 (3)模式三:R27 = 120K,串口模式,发0x55。 注意:次模块测试盲区20cm。 触发信号Tirig维持10Us以上的高电平即可等待Echo的返回,这里是用EXTI检测俩个跳变信号,去打开和关闭定时器,最后一次测量计算结果后清除定时器计时,并等待下一个循环开始。 需要完整工程或者有问题的请加QQ:100
[单片机]
JSN-SR04T超声波模块驱动(模式一、<font color='red'>STM32</font>)
探究STM32、FreeRTOS低功耗设计思路和原理
如今电池供电的产品很多,电池供电通常设计到一个问题,那就是低功耗。 本文为大家讲讲基于STM32、FreeRTOS实现低功耗思想和原理。 一 低功耗设计常规思路应用中使用的 RTOS 一般采用基于时间片轮转的抢占式任务调度机制,一般的低功耗设计思路如下:1. 当 Idle 任务运行时,进入低功耗模式;2. 在适当的条件下,通过中断或者外部事件唤醒 MCU。 但是, 从第二点可以看出,每次当 OS 系统定时器产生中断时,也会将 MCU 从低功耗模式中唤醒,而频繁的进入低功耗模式/从低功耗模式中唤醒会使得 MCU 无法进入深度睡眠,对低功耗设计而言也是不合理的。 在 FreeRTOS 中给出了一种低功耗设计模式 ——Tickl
[单片机]
探究<font color='red'>STM32</font>、FreeRTOS低功耗设计思路和原理
STM32的八种GPIO模式
STM32有八种IO口模式,分别是:模拟输入、浮空输入、上拉输入、下拉输入、开漏输出、推挽输出、复用开漏输出和复用推挽输出。 1、模拟输入 GPIO_Mode_AIN模拟输入,即关闭施密特触发器,将电压信号传送到片上外设模块(不接上下拉电阻)。 2、浮空输入 GPIO_Mode_IN_FLOATING浮空输入。浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 3、上下拉输入 GPIO_Mode_IPD下拉输入,GPIO_Mode_IPU上拉输入。一般来讲,上拉电阻为1K-10K,电阻越小,驱动能力越强。 电阻的作用:防止输入端悬空,减少外部
[单片机]
STM32如何定义变量到FLASH ROM中
看逻辑地址是否统一编址。 FLASH,RAM在同一个逻辑地址空间的,都是直接用用const,如arm,stm8,msp430等。 FLASH,RAM逻辑地址空间分开的,要用其它办法,通常是特殊关键字,__flash,__code等。 如AVR,8051等。 注:const本身并没有flash的意思。 如果flash,ram逻辑地址统一编址,那么编译器把全局或静态const变量分配到FLASH,RAM都可以。 为了节省ram,通常编译器会把全局或静态const变量分配到FLASH。 如果flash,ram逻辑地址分开编址,那么全局或静态const变量只能放到ram所在的逻辑地址空间,而无法放到FLASH。 注:逻辑地址统一编址,可以
[单片机]
智林STM32程序源代码的分析和整理04
一、定时器的配置 1、概述 STM32的定时器功能比较多、配置也较复杂,我现在了解不多,边用边学吧。智林开发板上有两个用定时器的地方,一个是液晶的背光电源,要求输出一定的PWM波形,用于整流提供电源;二是用于控制喇叭,也是时钟脉冲输出。 定时器首先的选择是计数、还是定时,我这里用的都是定时,输出模式可以是输入时定时器的捕获,可以是比较匹配时设定输出(经常用到这一种)。 2、源程序 void TIMx_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //时基单元配置数据结构 TIM_OCInitTypeDef TIM_OCInitStr
[单片机]
STM32固件库文件树及构成详解
STM32固件库文件树及构成详解(库版本:STM32F10x_StdPeriph_Lib_V3.5.0) 库减压后所有文件夹构成如下: /////////////////////////////////////////////////////////////////////////////////////////////
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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