STM32CubeMX教程2 GPIO输出 - 点亮LED灯
1、准备材料
开发板(STM32F407G-DISC1)
ST-LINK/V2驱动
STM32CubeMX软件(Version 6.10.0)
keil µVision5 IDE(MDK-Arm)
2、实验目标
使用STM32CubeMX软件配置STM32F407开发板点亮LED灯
3、实验流程
3.0、前提知识
笔者使用的STM32F407G-DISC1开发板主控制器为STM32F407VGT6,该MCU封装为LQFP 100,一共100个引脚,除去16个POWER引脚、1个NRST引脚和一个BOOT0引脚外,还剩余82个引脚,剩下的这些引脚均可以作为GPIO输入输出引脚使用,这些引脚分为6组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE和GPIOH,除GPIOH只有2个引脚外,其余5组均为16个引脚,如下图所示

在编程语言学习的过程中,一般学习者初始程序大多选择输出“Hello World!”,而在嵌入式单片机的学习中,一般学习者初始程序大多为“点亮LED灯”,笔者使用的开发板上拥有四个不同颜色的LED灯,其硬件原理图如下图所示,从电路连接上可以看出,从上到下绿橙红蓝四个LED灯分别由单片机的PD12、PD13、PD14和PD15四个引脚控制,当这四个引脚输出高电平时,相应的LED则会被点亮

3.1、CubeMX相关配置
在Pinout & Configuration页面右边单片机引脚预览Pinout view中,寻找需要设置的具体GPIO,这里我们选择PD12、PD13、PD14和PD15四个引脚,左键单击引脚可以对引脚功能进行设置,这里我们统一选择为GPIO_Output
在页面左边单片机功能分类栏目中选择GPIO,然后在页面中间栏目GPIO Mode and Configuration中可以看到所有使用到的具体GPIO及其相关配置,单击某个GPIO可以对其配置进行修改

当引脚选择GPIO Output时,GPIO mode有推挽输出和开漏输出两种,GPIO Pull-up/Pull-down可以选择无上/下拉、上拉和下拉其中的几种,需要注意的是开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动(注释1)

当GPIO mode设置为推挽输出时,此时上/下拉只有在没有输出时才有作用,也就是说,推挽输出状态下,如果控制输出高电平那IO状态就为高电平,若控制输出低电平那IO状态就为低电平,此时与上/下拉无关,而当没有控制输出时,此时IO的状态由上/下拉决定(注释2)
当GPIO mode设置为开漏输出时,如果控制输出低电平那IO状态就为低电平;若控制输出高电平,此时输出指令就不会起到作用,IO状态由上/下拉决定
3.2、生成代码
由于不需要重新设置时钟和工程,因此直接单击上图页面右上角GENERATE CODE重新生成工程即可
打开工程,在main.c主函数中可以看到初始化部分多了MX_GPIO_Init()函数,此函数即初始化4个LED引脚为输出的函数

右键单击函数,单击Go To Definition Of 'MX_GPlO_Init' 定位(注释3)到函数定义所在的文件gpio.c(注释4)中,可以看到初始化函数中所做的设置正是我们在STM32CubeMX中所做的设置

此时如果不增加任何代码,编译整个工程应该是可以正常编译通过,0错误和0警告

然后我们就可以添加我们自己的功能代码,在主函数初始化LED的引脚之后,将引脚输出为高电平即可点亮LED,还可以在主循环中每隔一定时间翻转LED引脚的输出电平,形成LED闪烁的状态,添加代码如下图所示

源代码如下
/*点亮四个LED灯*/
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port,GREEN_LED_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(ORANGE_LED_GPIO_Port,ORANGE_LED_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(RED_LED_GPIO_Port,RED_LED_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(BLUE_LED_GPIO_Port,BLUE_LED_Pin,GPIO_PIN_SET);
/*每隔100ms翻转绿色LED灯状态*/
HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin) ;
HAL_Delay(100);
4、常用函数
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:设置某个GPIO固定输出高电平或低电平
参数:
- GPIOx:引脚组别(GPIOA - GPIOI)
- GPIO_Pin:引脚(GPIO_PIN_0 - GPIO_PIN_15)
- PinState:低电平(GPIO_PIN_RESET)、高电平(GPIO_PIN_SET)
举例:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
设置PA0引脚输出高电平
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:设置某个GPIO的输出电平翻转
参数:
- GPIOx:引脚组别(GPIOA - GPIOI)
- GPIO_Pin:引脚(GPIO_PIN_0 - GPIO_PIN_15)
举例:
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);
翻转PA0引脚输出电平
5、烧录验证
5.1、具体步骤
“初始化LED引脚为输出 -> 使用HAL库函数设置LED引脚输出高电平 -> 引脚对应的LED点亮”
5.2、实验现象
烧录程序,然后观察开发板上LED灯的闪烁状态,发现开发板上电后4个LED均被点亮,其中GREEN_LED每隔一段时间闪烁一次

6、注释解析
注释1:参看文章“GPIO推挽输出和开漏输出模式区别详解”
注释2:参看文章“STM32F4 GPIO八种模式及工作原理详解”
注释3:需要先编译整个工程才可以跳转
注释4:如果在STM32CubeMX的Project Manager/Code Generator/Generated files中没有勾选Generate peripheral initialization as a pair of 'c/.h' files per peripheral,则所有生成的代码都会在main.c中实现,而不是每个外设分成.c/.h的形式
更多内容请浏览 OSnotes的CSDN博客
STM32CubeMX教程2 GPIO输出 - 点亮LED灯的更多相关文章
- 树莓派 Learning 003 --- GPIO 001 --- 点亮LED
树莓派 Learning 003 - GPIO 001 - 点亮LED 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 树莓派 Learni ...
- 第7章 使用寄存器点亮LED灯
第7章 使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列
第7章 使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- Beaglebone Black–GPIO 高低电平控制 LED 灯
上一篇,运用 Linux 的 sysfs,控制本机上的 LED 灯,usr0 至 usr3,这次用 GPIO 控制外部的电路,点亮 LED 灯. 这次的全部材料: BBB 一台 购买 BBB 自带的 ...
- C语言版——点亮LED灯,深入到栈
在上一篇进行了汇编语言的编写之后,我们采用C语言来编写程序,毕竟C语言才是我们使用最多的语言. 仅仅是点亮LED灯显然太过于简单,我们需要分析最后的反汇编,了解函数调用栈,深入C语言骨髓去分析代码,并 ...
- 30个物联网传感器小实验:三行代码点亮LED灯
30个物联网传感器小实验:三行代码点亮LED灯 三行代码点亮LED灯 LED灯闪烁 LED灯调亮度 LED淡入淡出 不写一行代码点亮LED灯 全彩RGB灯 面包板 30个物联网传感器小实验:三行代码点 ...
- 第二章之S5PV210在BL1中点亮LED灯
1,u-boot中第一个入口在./arch/arm/cpu/armv7/start.S 翻到153行:如下图 前面都是进行一些基本设置,不用管. cpu_init_cp15设置协处理器, cpu_in ...
- JZ2440开发板:用按键点亮LED灯(学习笔记)
本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...
- Raspberry PI 系列 —— 裸机点亮LED灯
Raspberry PI 系列 -- 裸机点亮LED灯 背景 近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了 ...
- STM32F4 阿波罗寄存器点亮LED灯
学习步骤: 使用寄存器点亮LED灯,需要进行如下的步骤,LED灯属于外设部分,首先需要开启外设的时钟使能,然后LED灯是PB1口,(芯片是正点原子的阿波罗),接着定义GPIOB口的输出模式,为上拉.推 ...
随机推荐
- Springboot中使用线程池的三种方式
前言 多线程是每个程序员的噩梦,用得好可以提升效率很爽,用得不好就是埋汰的火葬场. 这里不深入介绍,主要是讲解一些标准用法,熟读唐诗三百首,不会作诗也会吟. 这里就介绍一下springboot中的多线 ...
- 「にちじょう記録」MTIDnWtMOA
Mistakes That I Don't Want to Make Once Again. // Caution // 差分 / 前缀和后注意询问区间端点有变化-- 不要考虑了右边界就不考虑左边界 ...
- python3利用smtplib发送、抄送邮件并附带附件
python3利用smtplib发送.抄送邮件并附带附件 1. 导包 import smtplib from email.mime.text import MIMEText from email.mi ...
- 详解RecyclerView的预布局
概述 RecyclerView 的预布局用于 Item 动画中,也叫做预测动画.其用于当 Item 项进行变化时执行的一次布局过程(如添加或删除 Item 项),使 ItemAnimator 体验更加 ...
- 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式
文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...
- Visible Lattice Points 题解
Visible Lattice Points 题目大意 给定一个 \(N×N×N\) 的由若干点组成的立方体,点的坐标从 \((0,0,0)\) 到 \((N,N,N)\),求从点 \((0,0,0) ...
- 创建vue项目并搭建JSONSERVER
1.该前提是你已经搭建好vue-cli脚手架,开始创建一个新项目,输入 vue init webpack demo(demo是自定义项目名). 2.cd demo 进入项目安装依赖 3.在已经创建的项 ...
- kubeadm 工具部署 kubernetes v1.16.2
环境准备 3个节点,以下基于 Centos 7.6 系统, 内核版本:3.10.0-957.12.2.e17.x86_64 HOST NODE CPU MEM 192.168.1.111 master ...
- 教你使用逻辑公式和恒等式等价改写SQL
今天同事给我一条2秒的SQL看看能不能优化. 原始SQL: SELECT pk_dept FROM aaaa WHERE 1 = 1 AND ((pk_group = '0001A1100000000 ...
- AcWing 178. 第K短路
题意 给定一张 \(N\) 个点(编号 \(1,2-N\)),\(M\) 条边的有向图,求从起点 \(S\) 到终点 \(T\) 的第 \(K\) 短路的长度,路径允许重复经过点或边. 注意: 每条最 ...