HPM6750系列--第九篇 GPIO详解(中断操作)

一、目的

        在上篇中《HPM6750系列--第九篇 GPIO详解(基本操作)》我们讲解了GPIO的基本操作,本篇继续讲解GPIO的中断处理。

        

二、介绍

        将一个引脚设置为中断涉及到以下几个步骤(此处我们以PZ02举例):

        1.设置IOC/PIOC/BIO中对应的引脚复用为gpio功能
void init_gpio_pins(void)
{uint32_t pad_ctl = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);#ifdef USING_GPIO0_FOR_GPIOZHPM_IOC->PAD[IOC_PAD_PZ02].FUNC_CTL = IOC_PZ02_FUNC_CTL_GPIO_Z_02;  //②HPM_IOC->PAD[IOC_PAD_PZ02].PAD_CTL = pad_ctl; //③/* PZ port IO needs to configure BIOC as well */HPM_BIOC->PAD[IOC_PAD_PZ02].FUNC_CTL = IOC_PZ02_FUNC_CTL_SOC_PZ_02; //①
#endif 
}

        PZ02是电池备份域的IO,由HPM_BIOC设置复用功能,如果需要GPIO0来控制的话,需要先映射到IOC,再由HPM_IOC来复用成GPIO。

        ①HPM_BIOC将PZ02复用为SOC_PZ_02,也就是由HPM_IOC来决定其复用功能

        ②HPM_IOC将PZ02复用为GPIO

        ③设置为内部上拉

        经过上面的设置之后,PZ02就由GPIO0来进行后续的方向设置、中断配置        

        2.设置引脚为输入

        


/*** @brief   Set pin to output mode** @param ptr GPIO base address* @param port Port index* @param pin Pin index*/
static inline void gpio_set_pin_output(GPIO_Type *ptr, uint32_t port, uint8_t pin)
{ptr->OE[port].SET = 1 << pin;
}void gpio_config_pin_interrupt(GPIO_Type *ptr, uint32_t gpio_index, uint8_t pin_index, gpio_interrupt_trigger_t trigger)
{switch (trigger) {case gpio_interrupt_trigger_level_high:case gpio_interrupt_trigger_level_low:ptr->TP[gpio_index].CLEAR = 1 << pin_index;if (trigger == gpio_interrupt_trigger_level_high) {ptr->PL[gpio_index].CLEAR = 1 << pin_index;} else {ptr->PL[gpio_index].SET = 1 << pin_index;}break;case gpio_interrupt_trigger_edge_falling:case gpio_interrupt_trigger_edge_rising:
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)ptr->PD[gpio_index].CLEAR = 1 << pin_index;
#endifptr->TP[gpio_index].SET = 1 << pin_index;if (trigger == gpio_interrupt_trigger_edge_rising) {ptr->PL[gpio_index].CLEAR = 1 << pin_index;} else {ptr->PL[gpio_index].SET = 1 << pin_index;}break;
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)case gpio_interrupt_trigger_edge_both:ptr->TP[gpio_index].SET = 1 << pin_index;ptr->PD[gpio_index].SET = 1 << pin_index;break;
#endifdefault:return;}
}void test_gpio_input_interrupt(void)
{gpio_interrupt_trigger_t trigger;printf("input interrupt\n");
#ifdef BOARD_LED_GPIO_CTRLprintf("user led will be switched on off based on user switch\n");gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,BOARD_LED_GPIO_PIN);
#endifgpio_set_pin_input(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,BOARD_APP_GPIO_PIN); //①
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)trigger = gpio_interrupt_trigger_edge_both;
#elsetrigger = gpio_interrupt_trigger_edge_falling;
#endifgpio_config_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,BOARD_APP_GPIO_PIN, trigger); //②gpio_enable_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,BOARD_APP_GPIO_PIN); //③intc_m_enable_irq_with_priority(BOARD_APP_GPIO_IRQ, 1); //④while (1) {__asm("wfi");}
}

         

        ①设置PZ02为输入引脚。 

        ②设置边沿中断,下降沿触发

        ③使能中断

        ④设置中断优先级

        

        用户可以通过 GPIO 控制器的 IE 寄存器打开 GPIO 中断,IE 寄存器内的对应位置 1 就可以使能对应 IO 的中断。

        

        用户可以通过 GPIO 控制器的 TP 寄存器来指定中断的类型,对应位置 1,表示中断由边沿触发,对应位置0,表示中断由电平触发

        

        用户可以通过 GPIO 控制器的 PL 寄存器来指定中断的极性,对应位置 1,表示中断由下降沿或者低电平触发,对应位置 0,表示中断由上升沿或高电平触发。

        

        用户可以通过 GPIO 控制器的 IF 寄存器来查询中断的状态,对应标志位置 1,表示对应 IO 有中断待处理。

        3.注册中断函数
        
void isr_gpio(void)
{gpio_clear_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX,BOARD_APP_GPIO_PIN);
#ifdef BOARD_LED_GPIO_CTRLgpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX,BOARD_LED_GPIO_PIN);printf("toggle led pin output\n");
#else
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)if (gpio_read_pin(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN) == false) {printf("user key pressed\n");} else {printf("user key released\n");}
#elseprintf("user key pressed\n");
#endif
#endif}
SDK_DECLARE_EXT_ISR_M(BOARD_APP_GPIO_IRQ, isr_gpio)

        在中断函数中清除HPM_GPIO0.PZ.02中断标志位。

        

三、实战

        首先拷贝gpio工程

cp -r $HPM_SDK_BASE/samples/drivers/gpio ~/workspace/work/hpm
cd ~/workspace/work/hpm/gpio
cp -r ~/workspace/work/hpm/hello_world/.vscode ~/workspace/work/hpm/gpio/
code .

         

 

        选择flash_xip编译并进入调试窗口,然后我们按一下开发板上的PBUTN按键,就会触发中断,我们在中断中添加断点。

        通过查看IF[GPIOZ]我们发现其值为0x4,也就是bit2为1,说明中断触发了。

        然后我们继续执行发现IF[GPIOZ]变成了0x0,因为中断处理函数中我们需要清除中断标志。

        另外串口打印中也有中断触发的打印信息。

 

        至此本篇的内容就结束了,主要讲解了IO映射、IO中断的类型、中断注册以及中断使能。

        

 

        

        

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

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

相关文章

全球汽车行业的数字化转型:产品和后端的渐进之旅

如何管理汽车行业的数字化转型?在我们本篇文章中了解更多有关如何设定长期目标的信息。 正在改变汽车行业的26个数字化主题 最近一篇关于汽车行业数字化转型的论文确定了26个数字技术主题&#xff08;论文详情请点击阅读原文&#xff09;&#xff0c;分为三个主要集群: 1)驾驶…

社交网络分析3:社交网络隐私攻击、保护的基本概念和方法 + 去匿名化技术 + 推理攻击技术 + k-匿名 + 基于聚类的隐私保护算法

社交网络分析3&#xff1a;社交网络隐私攻击、保护的基本概念和方法 去匿名化技术 推理攻击技术 k-匿名 基于聚类的隐私保护算法 写在最前面社交网络隐私泄露用户数据暴露的途径复杂行为的隐私风险技术发展带来的隐私挑战经济利益与数据售卖防范措施 社交网络 用户数据隐私…

centOS7 安装tailscale并启用子网路由

1、在centOS7上安装Tailscale客户端 #安装命令所在官网位置&#xff1a;https://tailscale.com/download/linux #具体命令为&#xff1a; curl -fsSL https://tailscale.com/install.sh | sh #命令执行后如下图所示2、设置允许IP转发和IP伪装。 安装后&#xff0c;您可以启动…

Shell三剑客:正则表达式(元字符)

一、定义&#xff1a;元字符字符是这样一类字符&#xff0c;它们表达的是不同字面本身的含义 二、分类&#xff1a; 1、基本正则表达式元字符 # ^ 行首定位 [rootlocalhost ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/…

webgpu demo阅读 A-Buffer

A-Buffer 简单看看原理code 简单看看原理 这个是OIT里的链表方式&#xff0c;说的是首先把每个像素搞一个链表&#xff0c;然后把深度<opaque的存起来&#xff0c;最后排序&#xff0c;然后混合 code 这里就有这么一个depht判断 再看最后合成 可以看到&#xff0c;确实是…

六:爬虫-数据解析之BeautifulSoup4

六&#xff1a;bs4简介 基本概念&#xff1a; 简单来说&#xff0c;Beautiful Soup是python的一个库&#xff0c;最主要的功能是从网页抓取数据官方解释如下&#xff1a; Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。 它是一个工具箱…

hive常用SQL函数及案例

1 函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Java中的函数。 好处&#xff1a;避免用户反复写逻辑&#xff0c;可以直接拿来使用。 重点&#xff1a;用户需要知道函数叫什么&#xff0c;能做什么。 Hive提供了大量的内置函数&#xff0c;按照其特…

React系列:嵌套路由的使用

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家,51CTO明日之星 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站:vip.zsqt.cc 🤞嵌套路由的使用🤞 🎈嵌套路由是什么 在一级路由中又内嵌了其他路由,这…

企业安全建设与实践-复习资料

文章目录 二、企业安全建设与实践1、复习Windows及Linux基础命令。例如&#xff1a;用户创建、权限提升等。2、复习docker 基础命令&#xff1a;启动、关闭、导入、导入、下载等命令复习建议docker菜鸟教程。3、复习Windows策略相关知识点。4、复习基线加固部分内容。5、渗透测…

STM32启动过程

STM32启动模式&#xff08;自举模式&#xff09; M3/3/7等内核&#xff0c;复位后做的第一件事&#xff1a; 从地址0x0000 0000处取出栈指针MSP的初始值&#xff0c;该值就是栈顶地址。从地址0x0000 0004处取出程序计数器指针PC的初始值&#xff0c;该值是复位向量。 芯片厂商…

DevEco Studio IDE 创建项目时候配置环境

DevEco Studio IDE 创建项目时候配置环境 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、在配置向导的时候意外关闭配置界面该如何二次配置IDE环境。 打开IDE的界面是这样的。 点击Create Project进行环境配置。 点击OK后出现如…

嵌入式人工智能(钱多?好学?前景好?)

概念 嵌入式人工智能&#xff08;Embedded AI&#xff09;是指将人工智能&#xff08;AI&#xff09;技术集成到各种设备和系统中&#xff0c;使其具备智能化和自主性。与传统的中央化计算模型不同&#xff0c;嵌入式人工智能将AI能力嵌入到设备本身&#xff0c;使其能够在本地…

FPGA简易加减法计算器设计

题目要求&#xff1a; &#xff08;1&#xff09;设计10以内的加减法计算器。 &#xff08;2&#xff09;1个按键用于指定加法或减法&#xff0c;一个用于指定加数或被加数&#xff0c;还有两个分别控制加数或被加数的增加或减少。 &#xff08;3&#xff09;设置的结果和计算的…

“华为杯” 第二十届中国研究生数学建模竞赛 数模之星、华为之夜与颁奖大会

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 不以物喜&#xff0c;不以己悲。见众生&#xff0c;见自己。 作为荣获一等奖的学生代表&#xff0c;我有幸参加了 “华为杯” 第二十届中国研究生数学…

Linux c++开发-08-使用Linux API mmap文件内存映射

用途&#xff1a;超大文件&#xff0c;进程间共享内存 API: 示例&#xff1a; 结果&#xff1a;

【ArkTS】样式复用

如下代码&#xff0c;可以发现每个元素的样式一致&#xff0c;这时就可以将公共样式封装起来 此时可以使用Styles修饰符将公共样式进行封装 Styles修饰符 Entry Component struct Index{build() {Column(){Text(我是Text).ComStyle()Button(我是Button).ComStyle()Image().Co…

RabbitMQ手动应答与持久化

1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…

熬了一个通宵,把国内外的大模型都梳理完了!

大家好&#xff0c;大模型越来越多了&#xff0c;真的有点让人眼花缭乱。 为了让大家清晰地了解大模型&#xff0c;我熬了一个通宵把国内和国外的大模型进行了全面梳理&#xff0c;国内有189个&#xff0c;国外有20&#xff0c;同时包括大模型的来源机构、来源信息和分类等。 …

vue中实现使用相框点击拍照,canvas进行前端图片合并下载

拍照和相框合成,下载图片dome 一、canvas介绍 Canvas是一个HTML5元素,它提供了一个用于在网页上绘制图形、图像和动画的2D渲染上下文。Canvas可以用于创建各种图形,如线条、矩形、圆形、文本等,并且可以通过JavaScript进行编程操作。 Canvas元素本身是一个矩形框,可以通…

D3132|贪心算法

435.无重叠区间 初始思路&#xff1a; 我的思路就是如果有两个区间重叠&#xff0c;保留end比较小的那个区间&#xff0c;删除end比较大的区间。 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, new Comparator<int[]>…