【北京迅为】《STM32MP157开发板使用手册》- 第二十五章Cortex-M4 GPIO_LED实验

news2024/11/25 22:35:24

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等


第二十五章Cortex-M4 GPIO_LED实验

本章节最终所完成的实验例程存放路径为“iTOP-STM32MP157开发板网盘资料汇总\06_Cortex-M4实验例程\01_LED.zip”。

25.1什么是GPIO

GPIO(general porpose intput output):通用输入输出端口的简称。可以通过软件控制其输出和输入。芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能设备。

STM32MP157 的 GPIO 有 GPIOA 至 GPIOK 和 GPIOZ 共 12 组 GPIO,其中 GPIOA~GPIOK每组有 16 个 IO,而 GPIOZ 有 8 个 IO。所有的 GPIO 均带有中断功能,所有的 GPIO 都可以被Cortex-M4 和 Cortex-A7 共享访问,而 GPIOZ 可用于 TrustZone 安全性相关的设置(当用于此项时仅限于 Cortex-A7 访问),相关的外围设备的软件访问被定义为安全性访问,常用于安全解决方案中。这里,STM32MP157 共 16*5+8=176+8=184 个 IO,而我们的开发板总共引出了144个引脚。

25.2 实验目的

1)GPIO的工作模式的初步认识

2)STM32CubeIDE工具软件的使用与熟悉

3)GPIO口使用方法的学习

25.3 GPIO的工作模式

STM32MP157的GPIO可以通过软件的配置设置成以下八种工作模式:

1.GPIO浮空输入_IN_FLOATING模式

2.GPIO带上拉输入_IPU 模式

3.GPIO带下拉输入_IPD 模式

4.GPIO模拟输入_AIN 模式

5.GPIO开漏输出_OUT_OD 模式

6.GPIO推挽输出_OUT_PP模式

7.GPIO开漏复用输出_AF_OD模式

8.GPIO推挽复用输出_AF_PP模式

下面对这八种工作模式进行简单的分析:

浮空输入模式

当GPIO采用浮空输入模式时,STM32的引脚状态是不确定的,此时STM32得到的电平状态完全取决于GPIO外部的电平状态,所以说在GPIO外部的引脚悬空时,读取该端口的电平状态是个不确定的值。

上拉下拉输入模式

由于浮空模式时,在GPIO外部连接的电路未工作时,STM32读取的GPIO状态是不确定的,所以可以通过带上拉或者下拉输入的模式先给MCU一个确定的状态,当外部电路电平状态发生变化时,易于MCU的判断。这样可以增强MCU的抗干扰能力

模拟输入模式

最常用的场合是ADC模拟输入,不像其他输入模式只有0和1,模拟输入模式可以读取到很细微变化的值。

推挽输出模式

推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。这种结构既可以输出高电平,也可以输出低电平,可以用于连接数字器件。

推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

开漏输出模式

一般开漏输出模式时,如果外部不接上拉电阻时,只能输出低电平,所以要想输出高电平必须要外接上拉电阻。这样做的有一个好处,可以用来匹配不同的电平信号,也就是用于不同电压的系统之间的通信;另外,因为要输出高电平需要有外部的上拉电阻,所以在进行通信时,通信的速度也受到上拉电阻阻值的影响,阻值小时,通信速度可以很快,阻值大时,通信速度变慢,但也不能为了通信速度把上拉电阻用的很小,也要注意在电阻很小时,功耗会变大,所以要平衡好这个度。

复用推挽,开漏输出模式

这两种模式,可以理解为把GPIO配置为第二功能使用的时候的配置,并非单纯的用作IO输入或输出。

比如使用外设IIC时,我们需要把GPIO配置为复用推挽输出,用于数据通信功能。再比如串口通信的TX,以及SPI外设的GPIO使用就要把引脚设置为复用开漏输出。

25.4 LED电路的分析

我们的LED电路的原理图如下:

可以看到LED发光二极管由Q1和Q2两个L9014的NPN三极管控制通断,当三极管导通时LED发光二极管也会导通,当三极管截止时LED发光二极管也会截止,所以我们只需要通过控制两个GPIO引脚输出的高低电平来控制三极管的通断,进而控制LED发光二极管的亮灭。

以下为两个LED对应的控制引脚

LED2

LED3

PE14

PE1

25.5 实验步骤

25.5.1建立LED工程

首先我们打开STM32CubeIDE软件,进入软件界面之后,我们点击File属性,选择NEW下的STM32 Project的选项,如下图所示:

 

然后我们会进入下图所示界面:在Part Number选择框输入STM32MP157A,然后在右边的选择界面选择STM32MP157AAA,然后点击Next选项

在Project Name框中输入工程名字LED,然后点击Finish选项即可,如下图所示: 

等待工程创建完毕,会询问我们是否要安装OpenSTLinux ,由于我们是在windows环境下,所以我们不需要安装,点击NO即可 

至此我们的工程创建完毕,进入工程界面如下图所示界面: 

 

25.5.2 GPIO功能引脚配置

首先我们在下面的搜索框之中输入我们要配置的引脚,我们在这里以PE1为例进行搜索,输入名称之后,对应的引脚在工程中会闪烁,如下图所示:

然后我们使用鼠标左键点击对应的引脚会弹出PE1的复用功能选择,我们在这里选择复用为GPIO_Output功能,如下图所示: 

配置完复用功能之后,我们还要配置 Pin Reserved 选项如果不配置此项,在生成工程代码的时候将不会看到有关这个 Pin 的初始化代码。继续选中 PE1,右键弹出设置项我们选择Pin ReservedàCortex-M4。如下图所示: 

第二个LED的控制管脚PE14按同样的方法进行配置。

配置完成之后打开左侧菜单的 System CoreàGPIO 进入 GPIO 模式配置界面:如下图所示:

 

 点击对应的引脚配置之后会弹出右下方的管脚配置界面,如上图所示:

在下方会列出要配置选项的具体说明和我们要进行的配置。

1)选项 GPIO output level 用来设置IO口的输出电平的高低,这这里我们选择LOW

2)选项GPIO mode 用来设置 IO 口输出模式为 Output Push Pull(推挽)还是 Output Open Drain(开漏)。本实验我们设置为推挽输出 Output Push Pull。

3)选项 GPIO Pull-up/Pull-down 用来设置 IO 口是上拉/下拉/没有上下拉。本实验我们设置为上拉(Pull-up)。

4)选项 Mzximum ouput speed 用来设置 IO 口输出速度为低速(Low)/中速(Medium)/高速 (Hign)/快速(Very High)。我们设置为高速 High 。

5)选项 User Label 是用来设置初始化的 IO 口 Pin 值为我们自定义的宏,这里我们填写为 LED3。按照如上要求设置后的界面如下(由于PE14的配置相同,只是最后的Label值不同,也在下方列了出来):

配置完成之后我们需要在Project Manage下的Code Generator选项下勾选 Generate peripheral initialization as a pair of ".c/.h' files per peripheral 选项,这样可以独立生成对应外设的初始化.h 和.c 文件(方便配置的查看),如下图所示: 

 

25.5.3工程的生成与完善

在上述的步骤完成之后,按下键盘的Ctrl+S组合键保存保存 LED.ioc 文件,系统开始生成初始化代码,工程生成之后如下图所示:

 

然后我们进行工程的完善,以及添加对应的逻辑代码。

25.5.3.1 对应文件与文件夹的添加

首先在左侧的工程浏览页之中通过鼠标右键在LED_CM4的Core目录下创建名字为BSP的文件,具体步骤如下图所示:

 

然后在BSP目录下以同样的方法创建led.c文件和Include目录,以及Include目录下的led.h文件,创建完成如下图所示:

25.5.3.2 led.h文件的完善

我们对led.h文件进行代码的添加,将以下内容复制到led.h文件之中如下图所示:

  1 #ifndef __LED_H
  2 #define __LED_H
  3 #include "gpio.h"
  4 #define LED2(x)   do{ x ? \
  5                       HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET) : \
  6                       HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET); \
  7                   }while(0)
  8 #define LED3(x)   do{ x ? \
  9                       HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET) : \
 10                       HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); \
 11                   }while(0)
 12 #define LED2_TOGGLE()    do{ HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); }while(0)
 13 #define LED3_TOGGLE()    do{ HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); }while(0)
 14 void led_init(void);
 15 #endif

下面我们将对该文件进行简单的讲解:

在第3行,我们引用了gpio.h文件,我们进入gpio.c文件之中,文件路径如下图所示:

在对应的位置下会看到MX_GPIO_Init()函数,很明显的可以看出该函数正是我们在3.5.2小节之中所配置的功能。 

返回led.h文件之中,在4-13行便是四个宏定义,其中前两个宏定义是用来设置LED状态的,后两个宏定义是使LED状态进行反转的。具体功能是通过两个函数来实现的分别为HAL_GPIO_WritePin和HAL_GPIO_TogglePin。

在stm32mp1xx_hal_gpio.c文件之中可以找到HAL_GPIO_WritePin和HAL_GPIO_TogglePin的定义如下图所示:

 1 void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
  2 {
  3   /* Check the parameters */
  4   assert_param(IS_GPIO_PIN(GPIO_Pin));
  5   assert_param(IS_GPIO_PIN_ACTION(PinState));
  6 
  7   if (PinState != GPIO_PIN_RESET)
  8   {
  9     GPIOx->BSRR = GPIO_Pin;
 10   }
 11   else
 12   {
 13     GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER;
 14   }
 15 }
 16 
 17 /**
 18   * @brief  Toggles the specified GPIO pins.
 19   * @param  GPIOx: Where x can be (A..K) to select the GPIO peripheral.
 20   * @param  GPIO_Pin: Specifies the pins to be toggled.
 21   * @retval None
 22   */
 23 void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
 24 {
 25   /* Check the parameters */
 26   assert_param(IS_GPIO_PIN(GPIO_Pin));
 27 
 28   if ((GPIOx->ODR & GPIO_Pin) != 0x00u)
 29   {
 30     GPIOx->BRR = (uint32_t)GPIO_Pin;
 31   }
 32   else
 33   {
 34     GPIOx->BSRR = (uint32_t)GPIO_Pin;
 35   }
 36 }

HAL_GPIO_WritePin函数所实现的功能为设置对应的管脚的输出状态,GPIO_PIN_RESET为低电平、GPIO_PIN_SET为高电平。

HAL_GPIO_TogglePin函数所实现的功能为使对应管脚的输出状态反转(从高电平转为低电平,从低电平转为高电平)

25.5.3.3 led.c文件的完善

在led.c文件下,添加以下内容,以下内容实现的功能为定义led_init函数,调用该函数之后使LED2导通、LED3截止。

   #include "./Include/led.h"
  void led_init(void)
   {
           LED2(1);
           LED3(0);
   } 
25.5.3.4 main.c文件的完善

我们要修改的main.c文件路径如下图所示:

打开main.c文件,为了规范我们在/* USER CODE BEGIN Includes */和/* USER CODE END Includes */之间添加以下内容

#include "../BSP/Include/led.h"

添加完成如下图所示:

 

然后在 /* USER CODE BEGIN 2 */和/* USER CODE END 2 */之间添加以下内容:

 led_init();

通过调用led_init()函数来使LED2和LED3的初始状态分别为亮和灭。

然后在/* USER CODE BEGIN 3 */下添加以下逻辑代码

LED2_TOGGLE();

HAL_Delay(500);

LED3_TOGGLE();

HAL_Delay(500);  

 

该逻辑代码所实现的功能为两个LED灯的状态进行依次反转,且每次翻转所持续的时间为500ms。

25.5.4工程的编译

在完成以上步骤之后我们点击工具栏的小锤子进行编译,编译图标如下图所示:

 

编译完成会在下方的终端中显示打印信息,如下图所示: 

 

如果报错,需要自己根据错误的提示信息来进行问题的寻找和改正。

25.5.5工程的调试

由于STM32MP157的裸机部分和一般的单片机有些区别,他没有内部的存储,所以只能在程序编译成功之后,通过debug的方式来进行调试(将程序放在内存之中),调试过程如下:

首先,点击菜单栏中的小甲虫Debug调试按钮,弹出以下界面,

 

在弹出来的界面,按步骤,选择响应的属性(该步骤为Jlink的步骤,如果是STLink,调试探头选择对应的即可)。如下图所示: 

 

选择完成之后,点击右下角的Debug按钮,点击之后,会进行再一次的编译,编译完成之后会弹出如下内容(作者用的是J-LinK),这里弹出的是J-link关于设备的选择,不同调试器的弹窗可能会不同 

在弹出来的界面中,选择Accept接受,会弹出以下内容,继续点击下方的OK。 

 

之后会来到设备选择界面,我们选择Cortex-M4,如下图所示: 

 

选择Cortex-M4之后,点击右下角的OK,会弹出以下界面,选择右下角Switch.

然后会弹出一个新的页面,选择菜单栏的 resume,按钮开始调试。 

此时,会看到开发板上两个LED灯在交替闪烁。

如果想关闭调试,则点击菜单栏的终止按钮即可。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是线程池?从底层源码入手,深度解析线程池的工作原理

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码解析 目录 一、什么是线程池&#xff1f; 1.1 基本介绍 1.2 创建线程的两种方式 1.2.1 方式1&#xff1a;自定义线程池…

山峰个数【python实现】

思路见此处 def get_mountain_peaks(height):peak_count 0n len(height)if n 0:#如果一个山高都没有&#xff0c;return 0return 0for i in range(1,n-1):if height[i] > height[i-1] and height[i] > height[i1]:peak_count 1if height[0] > height[1] and n &g…

TimedRotatingFileHandler 修改 suffix 后 backupCount 设置失效无法自动删除文件

本文主要分析 TimedRotatingFileHandler 在实际使用中 backupCount 设置未生效的问题。源码分析显示&#xff0c;文件删除依赖于后缀 suffix 的正则匹配&#xff0c;如果自定义了 suffix 格式&#xff0c;必须同步更新 extMatch 的正则表达式&#xff08;保证正则表达式可以正常…

国庆出游季,南卡Runner Pro5骨传导耳机让旅途更完美!

国庆长假将至&#xff0c;无论是计划一场远行还是近郊的户外活动&#xff0c;一款适合的耳机都能让旅途更加愉快。南卡Runner Pro5骨传导耳机以其独特的设计和功能&#xff0c;成为了国庆出行的理想伴侣。 首先&#xff0c;骨传导耳机通过颅骨传递声音&#xff0c;避免了传统耳…

从理论到实战:人才培养基地如何缩短职场适应期?

在当今竞争激烈的职场环境中&#xff0c;从校园到职场的过渡对于许多新人来说充满挑战。而人才培养基地正以其独特的方式&#xff0c;努力缩短这一职场适应期。 人才培养基地首先注重理论与实践的结合。不再是单纯的知识灌输&#xff0c;而是将理论教学与实际操作紧密相连。 实…

JAVA——方法重载

方法的重载&#xff1a;多个方法在同一个类&#xff0c;方法名相同&#xff0c;参数/参数类型/参数数量不同 返回值不能作为重载条件 public class demo9_12_2 {public static void main(String[] args) {//调用&#xff0c;方法的签名getMax();getMax(10);getMax(10.9F);}//…

如何在Word中复制整页内容并保持原有格式不变?

在日常处理工作时&#xff0c;我们经常需要在Word文档中复制和粘贴内容&#xff0c;特别是在处理报告方案等文档时&#xff0c;保持复制内容的格式不变显得尤为重要。本文将详细介绍如何在Word中复制整页内容并保持原有格式不变&#xff0c;确保文档的整洁性和一致性。 方法一&…

修改jupyter notebook 默认浏览器(不动配置文件,改系统默认浏览器)

最开始把联想浏览器切到EDGE就是用的修改系统的默认浏览器。不知怎么的现在搜到的方法都是在说修改配置文件&#x1f613;。 不想动配置文件&#xff0c;平时对默认浏览器没有特殊要求的&#xff0c;可以用这个方法。 这里是把默认浏览器改成联想浏览器&#xff0c;电脑也是联…

【学习笔记】SSL密码套件的选择

往期介绍了TLS/SSL中4种密码套件&#xff0c;分别是Key Exchang、Authentication、Encryption和Hashing&#xff0c;每种密码套件下又包含多种协议。 当我们部署SSL证书时&#xff0c;我们需要选择自己支持哪种密码套件。我们可能想要用最安全的&#xff0c;但我们的潜在客户可…

一文弄懂FLink状态及checkpoint源码

一文弄懂Flink重要源码 1. Flink 状态源码1.1 valueState源码1.1.1 Update方法1.1.2 Value 方法 2. checkPoint 源码分析2.1 SourceStreamTask的checkpoint实现2.1.1 JobManager端checkpoint调度2.1.2 ScheduledTrigger定时触发checkpoint2.1.3 SourceStreamTask的Checkpoint执…

搭建 WordPress 及常见问题与解决办法

浪浪云活动链接 &#xff1a;https://langlangy.cn/?i8afa52 文章目录 环境准备安装 LAMP 堆栈 (Linux, Apache, MySQL, PHP)配置 MySQL 数据库 安装 WordPress配置 WordPress常见问题及解决办法数据库连接错误白屏问题插件或主题冲突内存限制错误 本文旨在介绍如何在服务器上…

推荐一款非常强大的表单校验库:React Hooks Form

React Hooks Form react-hook-form 是一个专注于管理 React 表单状态的库。它的核心理念是利用 React Hooks 来简化表单的处理过程。与其他表单管理库相比&#xff0c;它的优势在于性能和简洁性。它不需要在每次输入更改时重新渲染整个表单组件&#xff0c;从而提高了性能。 …

茶百道三天市值抹去三分之一:新茶饮脱下“皇帝的新装”

近日&#xff0c;随着港股通标的调整生效&#xff0c;茶百道获纳入的消息传出后&#xff0c;股价不升反降&#xff0c;单日跌幅之大引发热议。 9月10日至12日&#xff0c;茶百道在三个交易日内累计下跌36%&#xff0c;股价屡创上市以来新低。其中&#xff0c;9月11日单日跌幅更…

【强化学习系列】Gym库使用——创建自己的强化学习环境1:单一环境创建测试

目录 一、Gym类创建单一环境 1.gym类初始化 __init__() 2.gym类初始状态 reset() 3.gym类渲染可视化 render() 4.gym类运行核心 step() 5.gym类运行 在强化学习中实操中&#xff0c;有两个非常重要的设计模块&#xff0c;一个是模型网络和算法的设计&#xff0c;另一个则是用于…

计算机毕业设计选题推荐-学生在线投票系统-Java/Python项目实战(亮点:数据可视化分析、找回密码)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

UML-统一建模语言学习笔记20240912

UML入门 一、软件开发基础知识&#xff1a; 1.软件开发的生命周期&#xff0c;包括需求分析&#xff0c;设计&#xff0c;实现&#xff0c;测试和维护等阶段。 2.面向对象的编程&#xff08;OOP&#xff09;&#xff1a;UML 是一种用于描述面向对象系统的语言&#xff0c;需要…

这么好用的电脑桌面美化工具 你怎么能错过她?

芝麻时钟是一个功能强大的桌面时钟软件&#xff0c;它具有多种实用功能&#xff0c;包括桌面时钟、时钟屏保、任务栏时钟和桌面日历等。这个软件不仅提供了丰富的主题和美观的界面&#xff0c;更重要的是它的实用性和特色功能。(下载地址&#xff1a;https://clock.zhimasoft.c…

计算机网络 ---- OSI参考模型TCP/IP模型

目录 一、OSI参考模型 1.1 学习路线 1.2 OSI参考模型和TCP/IP模型 1.3 具体设备与具体层次对应关系 1.3.1 物理层 1.3.2 数据链路层 1.3.3 网络层 1.3.4 传输层 1.3.5 会话层、表示层、应用层 1.4 各层次数据传输单位 二、TCP/IP模型 2.1 学习路线 2.2 TCP/I…

源代码防泄密软件的五大特点

在数据防泄密领域&#xff0c;深信达的SDC沙盒软件以其独特的技术和创新应用&#xff0c;为源代码安全提供了强有力的保护。特别是在源代码防泄密方面&#xff0c;SDC沙盒表现出色&#xff0c;其实现方式主要包括以下几个方面&#xff1a; 1. **内核级虚拟沙盒技术**&#xff1…

QT学习参考书籍

6.2 Qt参考书籍资料 6.2.1 《Qt C编程从入门到实战》 主编:彭源 6.2.2 《Qt 5编程入门 第2版》编著:程梁 霍亚飞 6.2.3 《嵌入式Qt开发项目教程》编著:王浩 著 王浩 6.2.4 《Qt Quick核心编程》编著:安晓辉 6.2.5《零基础学Qt 4编程》 作者:吴迪著 6.2.6 《C并发编程实战(第2版…