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口的输出模式,为上拉.推 ...
随机推荐
- SK 简化流行编程语言对 生成式AI 应用开发的支持
Semantic Kernel[1] 是一个将大型语言模型(LLM)与流行的编程语言相结合的SDK. Microsoft将Semantic Kernel(简称SK)称为轻量级SDK,支持AI LLM的 ...
- Arrays.asList():使用指南
Arrays.asList() 是一个 Java 的静态方法,它可以把一个数组或者多个参数转换成一个 List 集合.这个方法可以作为数组和集合之间的桥梁,方便我们使用集合的一些方法和特性.本文将介绍 ...
- 「sdoi2019 - D2T2」移动金币
对 @command_block 没有 implementation 做法的细化.理论来说可以通过,但因为我实现得较劣无法通过.:( 把金币中的空隙看作石子,就是一个阶梯 Nim 的模型(有总共 \( ...
- nginx虚拟机及热部署(在线升级)
实现热部署(在线升级): 热部署方案一 (有弊端,不利于回滚) 查看nginx版本及源编译差数: /usr/local/nginx/sbin/nginx -V 预编译/ 编译/ 安装:在预编译之前,先 ...
- 手撕Vuex-Vuex实现原理分析
本章节主要围绕着手撕 Vuex,那么在手撕之前,先来回顾一下 Vuex 的基本使用. 创建一个 Vuex 项目,我这里采用 vue-cli 创建一个项目,然后安装 Vuex. vue create v ...
- js执行过程之上下文对象(Context)
在js的学习中,我们已经不满足于仅了解js的基础知识,而是开始追求更深层次的学习.因为你会发现,仅了解js的基础知识,在开发项目的过程中是远远不够的.今天就来介绍一下在js执行过程中的一些相关内容了. ...
- c#享元模式详解
基本介绍: 享元模式的定义:运用共享技术有效地支持大量细粒度的对象重复使用.适用于大量小粒度的对象造成的运行效率和内存使用效率低下的情况. "享元"顾名思义,"享 ...
- QT(9)-QStyleOption及其子类
1 QStyleOption QStyleOption及其子类包含QStyle函数绘制图形元素所需的所有信息. 出于性能考虑,成员函数很少,对成员变量的访问是直接的(即使用.或者->运算符).这 ...
- Hibench对大数据平台CDH/HDP基准性能测试
一.部署方式 1.1.源码/包:https://github.com/Intel-bigdata/HiBench 部署方法: https://github.com/Intel-bigdata/HiBe ...
- 使用 TortoiseGit 在两个项目之间共享代码(cherry-pick)
需求:项目 A 需要新增项目 B 的部分代码,要求不变更 commit message 信息 做法 项目 A 新增上游 Remote,Remote URL 为 项目 B 的 URL 新增方式:依次点击 ...