stm32mp1 Cortex M4开发篇2:通过GPIO点亮LED灯详解

发布者:PeacefulOasis最新更新时间:2023-11-16 来源: elecfans关键字:stm32mp1  Cortex  GPIO  点亮LED灯 手机看文章 扫描二维码
随时随地手机看文章

写在前面:

本文章为《ARM Cortex-M4裸机开发篇》系列中的一篇,,全系列总计14篇。笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板),Cortex-M4裸机开发篇除了讲M4裸机开发外,还会讲解通过M4控制资源扩展板上的各种传感器执行器模块(包括空气温湿度传感器、LED灯、数码管、蜂鸣器、震动马达、按键中断、风扇等),本篇是M4控制资源扩展板中的一篇。


资源扩展板是FS-MP1A开发板的扩展模块,主要包含了10余种助主流传感器、执行器件、总线控制器件,非常方便项目扩展用。可拓展开发智慧家庭、智能医疗、智能安防、工业控制、图像识别、环境检测等方向的10个左右综合项目,华清远见开发板也将配套提供所有项目的说明文档、实验源码、应用程序等资料。


针对FS-MP1A开发板,除了Cortex-M4裸机开发篇外,还包括其他多系列教程,包括Cortex-A7开发篇、FreeRTOS篇、Linux基础及应用开发篇、Linux系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。


资源扩展板介绍


硬件介绍&资源扩展板可开发项目

poYBAGFn9z-AAMA3AAJtk6t7vns204.jpg

Cortex-M4 GPIO编程

实验目的

熟悉STM32CubeIDE工具软件的使用。

掌握STM32CubeIDE软件的基本设计流程和设计步骤,能够使用工具进行设计、编程、仿真调试。

学习GPIO口的使用方法,掌握如何利用STM32MP157A芯片的I/O口控制LED。

实验环境

FS-MP1A开发平台

ST-Link仿真器

STM32CubeIDE开发软件

PC机 XP、Window7/10 (32/64bit)

实验原理

只要是对硬件操作,就要首先查看原理图。查看外设是和模块的MCU的哪个引脚相连。FS-MP1A开发平台上的LED的亮灭状态,与芯片上的引脚I/O输出电平有关。

FS-MP1A开发平台上LED的I/O:


pYYBAGD1gMqAeugsAABL_f8VtiY304.png



poYBAGD1gM-AUbhzAAAZU-WX2Vw836.png


IO操作重要结构体:GPIO_InitTypeDef

1234567891011121314151617181920
/** * @brief GPIO Init structure definition */typedef struct{ uint32_t Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ uint32_t Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIO_mode_define */ uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. This parameter can be a value of @ref GPIO_pull_define */ uint32_t Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIO_speed_define */ uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. This parameter can be a value of @ref GPIO_Alternate_function_selection */}GPIO_InitTypeDef;

第一个成员变量Pin是所操作的管脚,第二个Mode是模式选择,第三个Pull是上拉下拉,或者都不加,第四个Speed是速度选择,第五个是管脚复用功能。一般我们只操作前四个。

IO口可以由软件配置成4种模式,其实操作的是GPIO的端口模式寄存器:

输入(复位状态)/input(reset state)

通用输出模式 / general purpose output mode

复用功能模式 / alternate function mode

模拟模式 / analog mode

12345
#define GPIO_MODE_INPUT ((uint32_t)0x00000000U) /*!< Input Floating Mode */#define GPIO_MODE_OUTPUT_PP ((uint32_t)0x00000001U) /*!< Output Push Pull Mode */#define GPIO_MODE_OUTPUT_OD ((uint32_t)0x00000011U) /*!< Output Open Drain Mode */#define GPIO_MODE_AF_PP ((uint32_t)0x00000002U) /*!< Alternate Function Push Pull Mode */#define GPIO_MODE_AF_OD ((uint32_t)0x00000012U) /*!< Alternate Function Open Drain Mode */

上面给两个寄存器赋值了,1~4位是GPIO端口模式寄存器,5~8位是端口输出类型寄存器(决定是推挽输出还是开漏输出)。

STM32的GPIO端口在作为输出时,可以软件配置端口最大支持的时钟速率,下图是端口输出速度寄存器,有以下几种速度选择:


poYBAGFn9z-AC3_bAADm77RiO30862.jpg


12345678
/** @defgroup GPIO_speed_define GPIO speed define * @brief GPIO Output Maximum frequency * @{ */#define GPIO_SPEED_FREQ_LOW ((uint32_t)0x00000000U) /*!< Low speed */#define GPIO_SPEED_FREQ_MEDIUM ((uint32_t)0x00000001U) /*!< Medium speed */#define GPIO_SPEED_FREQ_HIGH ((uint32_t)0x00000002U) /*!< Fast speed */#define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)0x00000003U) /*!< High speed */

GPIO调用的HAL函数:

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

该函数其实是对BSRR寄存器进行操作。

第一个参数传的是GPIO所在的组,第二个是该组的几号管脚,第三个是对管脚进行置位。

实验步骤

打开STM32CubeIDE->File->New->STM32 Project


poYBAGD1ME2AVPeTAACVnz-qkMk546.png


可以在左侧搜索框内输入芯片型号STM32MP157A进行搜索,选择对应芯片,点击Next


poYBAGFmcj-ASM-mAAC8KlaJkAU786.jpg


填写工程名,点击Finsh


poYBAGD1MFWAXdlzAABW-5r3LmY634.png


点击Yes打开配置页面


pYYBAGD1MFqAKmnWAAAp3TMlYLo989.png



poYBAGFmcj-AF6saAAEDRfefWWQ542.jpg


搜索框内搜索LED对应GPIO引脚PZ5、PZ6、PZ7,左键点击设置为GPIO_Output


pYYBAGD1MGOAQN6wAAC-3IaQ2Ns189.png


这里我们需要注意一下,和其他单片机不同,还需要继续设置“ Pin Reservation”给“ Cortex-M4”,否则STM32CubeMX不会生生成GPIO初始化相关代码。具体操作:在刚才选择的引脚上,鼠标右键选择“ Pin Reservation”->“ Cortex-M4”。


pYYBAGFn9z-AXRc1AADDkNnGYdI917.jpg


在Code Generator处选择为每个外设生成单独的C和H文件,这样设置方便阅读代码


poYBAGD1MGmAams0AACpGOkAn0s579.png


完成以上设置后,Ctrl+S保存,会提示是否需要生成代码,选择Yes即可自动生成代码。系统会自动生成System Clock代码


poYBAGD1MG2ADAi6AAAgBCPP1k8477.png




添加GPIO函数说明:

我们需要在main.c中添加GPIO相关函数, GPIO引脚输出电平高低函数


123456789101112
void bsp_led_on(void){ HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7,GPIO_PIN_SET);}void bsp_led_off(void){ HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7,GPIO_PIN_RESET);}


在main.c中调用函数改变GPIO引脚高低电平来改变LED灯的状态


pYYBAGFn90CADnhcAACkNLKoAdg961.jpg


上述为新建工程配置过程,可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料2-程序源码ARM体系结构与接口技术Cortex-M41_LED】

配置完成或导入工程后进行程序下载,具体步骤参考12.3.3节进行开发板连接,程序编译、下载

实验现象

可看到LED灯循环亮灭


poYBAGFn90CAcLrCAACJKpoPP8E963.jpg

硬件平台:华清远见FS-MP1A开发板(STM32MP157)


关键字:stm32mp1  Cortex  GPIO  点亮LED灯 引用地址:stm32mp1 Cortex M4开发篇2:通过GPIO点亮LED灯详解

上一篇:STM32F103C8T6使用外部中断法和输入捕获法进行编码器测速
下一篇:基于机智云物联网平台的温湿度和光照强度获取

推荐阅读最新更新时间:2024-02-25 10:28

STM32学习笔记之GPIO(二)
首文提到了GPIO拥有八种工作方式: 4种输入模式: 输入浮空 输入上拉 输入下拉 模拟输入 4种输出模式: 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能 3种最大翻转速度: -2MHZ -10MHz -50MHz 八种模式介绍及电路详解 输入浮空模式: 由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO 的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 输入上拉模式: 上拉输入/下拉输入/模拟输入:这几个概念很好理解,从字面便能轻易读懂。 输入下拉模式: 模拟模式: 开漏输出: 只可以输出强低电平,高电平得靠外部电阻拉高。输出端
[单片机]
STM32学习笔记之<font color='red'>GPIO</font>(二)
如何选择更适合你的ARM Cortex内核?
  ARM Cortex内核系列提供非常广泛的具有可扩展性的性能选项,设计人员有机会在多种选项中选择最适合自身应用的内核,而非千篇一律的采用同一方案。Cortex系列组合大体上分为三种类别:   ● Cortex-A—面向性能密集型系统的应用处理器内核   ● Cortex-R—面向实时应用的高性能内核   ● Cortex-M—面向各类嵌入式应用的微控制器内核   Cortex-A处理器为利用操作系统(例如Linux或者Android)的设备提供了一系列解决方案,这些设备被用于各类应用,从低成本手持设备到智能手机、平板电脑、机顶盒以及企业网络设备等。早期的Cortex-A系列处理器(A5、A7、A8、A9、A12、A15和A
[单片机]
如何选择更适合你的ARM <font color='red'>Cortex</font>内核?
Cortex-M3的μC/OS-II任务调度硬件指令实现
1 μC/OS-II的任务调度算法分析 1.1 μC/OS-II任务就绪表的解读 μC/OS操作系统采用优先级至上的任务调度原则,让进入就绪态任务中优先级最高的那个任务,一进入就绪态就能立即运行。μC/OS操作系统实现了一种巧妙的查表算法,利用这种算法能快速实现任务调度原则。如何从任务就绪表中,查找优先级最高的那个任务?归结起来: 两个变量(OSrdyGrp、OSRdyTb1 )和两张表(OSMapTb1 、OSUnMaTb1 )。 μC/OS操作系统可支持64个任务,每个任务被赋予不同的优先级——从0级到最低优先级OS_LOWEST_PRIO,最末两个为操作系统所用,分别为统计任务和空闲任务的优先级。μC/OS-II任务
[单片机]
<font color='red'>Cortex</font>-M3的μC/OS-II任务调度硬件指令实现
STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解
一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的。 Cortex-M3内核规定中断向量表中第一个32位数据内容为栈顶地址,第二个32位数据内容则是复位中断向量的入口地址。 这样CPU复位后会自动从中断向量表中第二个32位数据中取出复位中断向量的入口地址,PC就跳转到中断服务程序。这也就是为什么调试的时候程序会直接跳到0x08000144(中断向量表中第二个32位数据为0x08000145),而不是停在0x08000000。 Cortex-M3的中断向量表的结构是固定的,而位置的地址是可
[单片机]
LPC1768-GPIO
硬件基础:旺宝科技ARM NXP LPC1768 KIT V2.0 实现功能:LED流水灯效果 LED硬件连接图如下: 连接在P2.0-P2.7,GPIO输出高电平点亮LED 查阅1700芯片手册,与GPIO相关的寄存器如下表 当引脚被配置为GPIO功能的时候,FIOxDIR寄存器可以控制引脚的方向(输入输出),相应的位设置为0则为输入引脚,设置为1则为输出引脚 除了可以32位访问之外,FIODIR寄存器还可以字节或者半字访问,相应寄存器如下 void Led_Init(){ LPC_GPIO2- FIODIR = 0x000000ff; // 32位设置方式 LPC_GP
[单片机]
LPC1768-<font color='red'>GPIO</font>
stm32学习之十
USART,AD与GPIO的温度传感器: 注意的是: 1、ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5); 2、ADC_TempSensorVrefintCmd(ENABLE); 依照上一节的程序,可以改写以下,形成现在的程序与效果: add.h和add.h(写成这种方式,原因与上一节一样) add.h的代码: #ifndef _ADD_H #define _ADD_H #include stm32f10x.h //对于12位的ADC,3.3V的ADC值为0xfff,温度为25度时对应的电压值为1.43V即0
[单片机]
stm32学习之十
基于ARM Cortex-M3的小型化远程监控智能电源系统
传统的电源维护采用的是人工手动式维护管理模式,而 智能 电源监控 系统以嵌入式技术、计算机技术、通信技术等为基础,实现了电源系统向智能化、自动化管理模式的转变。 随着当代科技的日益发展,数量巨大的各类设备的电源维护管理需要投入大量的人力、物力,像通信/ 电力设施所处环境越来越复杂,人烟稀少、交通不便、危险度高等都增大了维护的难度和费用。这对电源设备的监控管理提出了更高的要求。电源监控系统需要对系统中各状态量进行监视,还必须能对各供电支路进行控制和管理。维护管理人员可远程进行数据查询、控制等维护工作,并可利用友好的人机界面方便地得到需要的信息。 数字化技术的发展表现出了传统技术无法比拟的优势,整个电源监控系统的信号采样、处理、控
[电源管理]
基于ARM <font color='red'>Cortex</font>-M3的小型化远程监控智能电源系统
STM32中对ADC1_Config()函数(ADC1_GPIO_Config()和ADC1_Mode_Config())的理解
STM32中对ADC1_Config()函数(ADC1_GPIO_Config()和ADC1_Mode_Config())的理解:
[单片机]
STM32中对ADC1_Config()函数(ADC1_<font color='red'>GPIO</font>_Config()和ADC1_Mode_Config())的理解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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