stm32mp1 Cortex M4开发篇4:GPIO外部中断详解

发布者:茶叶侠最新更新时间:2023-10-26 来源: elecfans关键字:stm32mp1  Cortex  GPIO  外部中断 手机看文章 扫描二维码
随时随地手机看文章

写在前面:

本文章为《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综合项目实战篇等。d=622457259672


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

硬件介绍


poYBAGFn9z-AAMA3AAJtk6t7vns204.jpg

Cortex-M4 外部中断

实验目的

熟悉STM32CubeIDE工具软件的使用。

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

学习GPIO口的使用方法,掌握如何利用STM32MP157A芯片的I/O口作为外部中断输入。

实验环境

FS-MP1A开发平台

ST-Link仿真器

STM32CubeIDE开发软件

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

实验原理

本实验的原理主要是,通过开发板上按键K2的外部中断方式读取键值即IO口状态,控制LED点亮、熄灭查看实验现象。


v2-36e9a748ae2b517f7ace04cba6732efb_720w.jpg



v2-900386d4450c9161d745295e4a1b1c8a_720w.jpg



poYBAGD1gM-AUbhzAAAZU-WX2Vw836.png


配置IO口外部中断的步骤:

使能 IO 口时钟。

初始化 IO 口模式,触发条件。

配置中断优先级( NVIC),并使能中断。

在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler。

编写外部中断回调函数。

通过以上几个步骤的设置,我们就可以正常使用外部中断了。

实验步骤

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


poYBAGD1ME2AVPeTAACVnz-qkMk546.png


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


poYBAGFmcj-ASM-mAAC8KlaJkAU786.jpg


填写工程名,点击Finsh


poYBAGFuHe-AE_GjAABYyHfVcKI479.jpg


点击Yes打开配置页面


pYYBAGD1MFqAKmnWAAAp3TMlYLo989.png


搜索框内搜索LED对应GPIO引脚PZ5,左键点击设置为GPIO_output

搜索框内搜索K2对应GPIO引脚PA0,左键点击设置为GPIO_EXTI0



pYYBAGFuHe-AOXj-AACSidFBZTs324.jpg


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


poYBAGFuHe-AXot-AAEokQv9s28673.jpg


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


poYBAGD1MGmAams0AACpGOkAn0s579.png


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


poYBAGD1MG2ADAi6AAAgBCPP1k8477.png


可以在左侧工程文件夹找到EXIT_CM4子工程,打开stm32mp1xx_it.c

添加GPIO中断回调函数,自定义延时函数

C++ Code

1234567891011121314151617181920212223
int i = 0;int j = 0;void delay_my(uint8_t time){ for(i = 0; i < time * 10; i++) { for(j = 0; j < time; j++) {} }}void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin){ delay_my(10); if(GPIO_Pin == GPIO_PIN_0) { if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)/* read PA0 state */ { HAL_GPIO_TogglePin(GPIOZ, GPIO_PIN_5); } }}


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

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

实验现象

按下K2键,可看到LED灯状态发生改变


关键字:stm32mp1  Cortex  GPIO  外部中断 引用地址:stm32mp1 Cortex M4开发篇4:GPIO外部中断详解

上一篇:stm32mp1 Cortex M4开发篇5:串行通讯接口
下一篇:成本低、易于编程控制的DLP投影STM32单片机驱动电路研究设计

推荐阅读最新更新时间:2024-10-30 16:24

Cortex-M0 看门狗程序详解
M0的看门狗和普通51单片机的看门狗类似。比较简单。在配置完看门狗寄存器后看门狗模块就会随程序一直执行不能关闭。唯一关闭的方法就是系统发生复位。狗狗工作标记位就会由硬件自动清零而不工作了。在对看门狗寄存器写数据前需要先使能看门狗模块 :SYSAHBCLKCTRL|=1 15;//使能看门狗模块。这一点非常重要否则造成狗不工作 来认识一下狗狗的寄存器,WDTCLKUEN-看门狗时钟源使能寄存器。因为狗狗的时钟是可选的。在对狗进行时钟源选择前是要关闭狗狗的时钟连接!该寄存器的有效位只有一位。WDTCLKUEN=0X01;//第0位为1连接看门狗时钟源 WDTCLKSEL-看门狗时钟源选择寄存器。用于选择看门狗的时钟源。狗的时钟源
[单片机]
STM32_GPIO配置及库函数讲解——独立按键
User Button硬件连接如下图所示:当按键被按下,PB9检测到低电平,相反PB9被3.3V电源拉高。 LED硬件连接如下图所示:高电平点亮LED。 要想将PB9管脚配置成输入模式,程序所需如下步骤:(必须的) 第一步:配置系统时钟。见 STM32F103x RCC寄存器配置 除此之外,还需将GPIO外设时钟打开。 /* Enable GPIOC and GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENAB
[单片机]
STM32_<font color='red'>GPIO</font>配置及库函数讲解——独立按键
STM32外部中断配置步骤
1.使能SYSCFG时钟 系统配置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE) 2.初始化IO口为输入 GPIO_INIT 3.设置IO口与中断线之间的关系 所谓IO口与中短线 f4中有16个IO中断线,PXn 连接的是 EXITn的中断线 比如现在我要想把 PF9的中断线进行连接,只可以连接EXIT9这个中断 使用函数SYSYCFG_EXTLineConfig() 4.初始化线上中断,设置触发条件(上升沿还是下降沿,是事件还是中断,关于事件和模中断直接的差别请参考我转载的另一篇博客,事件是中断的一个起源) EXTI_Init() 5.配置中断分组,并且使能中断 N
[单片机]
ARM Cortex-M3 学习笔记(3)
最近在学ARM Cortex-M3,找了本号称很经典的书 An Definitive Guide to The ARM Cortex-M3 在看。这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。 第三章 Cortex-M3 基础 这章的内容有不少是和第二章重复的。重复的部分这里就不再提了。 堆栈 Cortex-M3 的堆栈是倒生的,实栈顶。也就是R13指向最后一次压入堆栈的内容。 下面是个简单的例子: PUSH {R0} ; *(--R13)=R0。R13是long*的指针 POP {R0} ; R0= *R13++ PUSH 和 POP 可以一次操作多个寄存器: subroutine_1 PUSH {R0-
[单片机]
ARM <font color='red'>Cortex</font>-M3 学习笔记(3)
飞思卡尔开发工具为广大从业者提供便捷快速的开发平台
今天,嵌入式应用领域每一款微控制器(MCU)的推出,几乎都伴随着相应的开发工具与相应的解决方案。想当初,基于ARM的微控制器能够迅速为业界所接受和赞赏,与其开发工具的完善与推广密不可分。 同样,随着MCU的客户需求以及不断扩展的产品供应,领先的半导体厂商飞思卡尔基于ARM® Cortex™-M4内核的Kinetis MCU产品系列继续产生迅猛的发展势头,而飞思卡尔开发工具及解决方案则可有效帮助研发工程师缩短研发周期,加快产品上市时间。其中,塔式开发系统(Tower System)平台已经快速成为一种行业标准,是开发人员快速评估和原型验证的首选工具。通过快速原型设计和工具复用,此模块化开发平台能够为开发人员节省数月的开发时间,从而
[单片机]
STM8S自学笔记-003 GPIO输出:点亮LED灯 and 跑马灯特效
点亮LED 点亮一个LED灯,应该是大多数单片机教程的第一步。这是最简单的一步。 GPIO初始化函数:GPIO_Init() 通常,要对LED所在的单片机的LED引脚 Px(y) 进行: 模式设置 ①输出模式 ②哪一种输出方式) 电平设置 ③高/低电平 才能够点亮LED。看上去,至少也要三个语句,方能实现对LED的控制;但是,在STM8S中,只要一个句子就可以实现!   //假设该LED是灌电流方式   GPIO_Init( GPIOC , GPIO_PIN_3 , GPIO_MODE_OUT_PP_LOW_SLOW ); 来分析上面的句子: 它调用了库函数stm8s_gpio.c中的GPIO初始化函数-GPI
[单片机]
GigaDevice推出GD32F450系列高性能200MHz主频Cortex®-M4 MCU
    GigaDevice GD32F450系列全新32位通用 MCU基于200MHz Cortex®-M4内核,持续以业界领先的强大处理效能与低功耗、高集成度、高可靠性和易用性的最佳组合,为工业控制与物联网等高性能计算需求提供高性价比解决方案。   2016年9月12日 — 日前,业界领先的半导体供应商GigaDevice (兆易创新)全新推出基于ARM® Cortex®-M4内核的GD32F450系列高性能微控制器,并以200MHz的工作主频在业界首次将ARM® Cortex®-M4内核的处理能力发挥到极致。     作为GD32 MCU家族Cortex®-M4内核的首个旗舰产品系列,GD32
[手机便携]
s3c6410外部中断号与引脚问题
在编写Linux驱动程序时。我想用某一个引脚做外部中断。可是在调用 int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs ), unsigned long irqflags, const char * devname, void *dev_id); 这个函数的时候遇到了一个问题,irq是个硬件终端号,可是究竟这个引脚相应的终端号是多少呢? 我在网上找资料说的都稀里糊涂的,不是我想要的答案。 于是我便在内核代码里找,以下贴出Linux内核代码的一段archarmmach-s3c6
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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