STM32MP157按键中断实验

2023-10-13 09:36

本文主要是介绍STM32MP157按键中断实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

按键配置

#include "key_it.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_rcc.h"void key_it_config()
{/* RCC使能GPIOF时钟 */RCC->MP_AHB4ENSETR |= (1<<5);/* 设置PF9 PF7 PF8输入 */GPIOF->MODER &= (~(0x3 << 14));GPIOF->MODER &= (~(0x3 << 16));GPIOF->MODER &= (~(0x3 << 18));/* 设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx */EXTI->EXTICR2 &= ~(0xff<<24);EXTI->EXTICR2 |= (0x05<<24);EXTI->EXTICR3 &= ~(0xff);EXTI->EXTICR3 |= (0x05);EXTI->EXTICR3 &= ~(0xff<<8);EXTI->EXTICR3 |= (0x05<<8);/* 设置事件触发方式为下降沿触发EXTI_FISR1 */EXTI->FTSR1 |= (1<<7);EXTI->FTSR1 |= (1<<8);EXTI->FTSR1 |= (1<<9);/* 设置EXTI事件触发不屏蔽XITI_IMR1 */EXTI->C1IMR1 |= (1<<7);EXTI->C1IMR1 |= (1<<8);EXTI->C1IMR1 |= (1<<9);/* 使能中断能转发到特定的CPU接口层GICD_ISENABLERx */GICD->ISENABLER[3] |= (1<<3);GICD->ISENABLER[3] |= (1<<2);GICD->ISENABLER[3] |= (1<<1);/* GICD_IPPIORITYRx设置中断优先级 */GICD->IPRIORITYR[24] &= ~(0x1f<<27);GICD->IPRIORITYR[24] &= ~(0x1f<<19);GICD->IPRIORITYR[24] &= ~(0x1f<<11);/* 设置当前终端被转发到哪一个CPU处理GIC_ITARGETSRx */GICD->ITARGETSR[24] &= ~(0x03<<24);GICD->ITARGETSR[24] |= (0x01<<24);GICD->ITARGETSR[24] &= ~(0x03<<16);GICD->ITARGETSR[24] |= (0x01<<16);GICD->ITARGETSR[24] &= ~(0x03<<8);GICD->ITARGETSR[24] |= (0x01<<8);/* 使能组0转发终端GICD_CTLR */GICD->CTRL |= 0x1;/* 设置中断优先级掩码GICC_PMR */GICC->PMR |= (0x1f<<3);/* 使能CPU可以处理组0转发的终端GICC_CTLR */GICC->CTRL |= 0x1;}

中断实现

#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
#include "beep.h"#define EXTI9_IRQ 99
#define EXTI8_IRQ 98
#define EXTI7_IRQ 97extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{/* 保存终端号 */int irqno;irqno = GICC->IAR & 0x3ff;if(irqno == EXTI9_IRQ){delay(1000);if(irqno == EXTI9_IRQ){/* KEY1中断处理 */printf("KEY1 pressed!\n\r");/* 蜂鸣器 */hal_gpio_write(GPIOB, 6, !hal_gpio_read(GPIOB, 6));/* 清除挂起中断标志位GICD_ICPENDRx */GICD->ICPENDR[3] |= (1<<3);	/* 清除终端触发标志EXTI_FRR1 */EXTI->FPR1 |= (1<<9);}}else if(irqno == EXTI8_IRQ){delay(1000);if(irqno == EXTI8_IRQ){/* KEY3中断处理 */printf("KEY3 pressed!\n\r");/* 风扇 */hal_gpio_write(GPIOE, 8, !hal_gpio_read(GPIOE, 8));/* 清除挂起中断标志位GICD_ICPENDRx */GICD->ICPENDR[3] |= (1<<2);/* 清除终端触发标志EXTI_FRR1 */EXTI->FPR1 |= (1<<8);}}else if(irqno == EXTI7_IRQ){delay(1000);if(irqno == EXTI7_IRQ){/* KEY2中断处理 */printf("KEY2 pressed!\n\r");/* LED灯 */hal_gpio_write(GPIOE, 9, !hal_gpio_read(GPIOE, 9));/* 清除挂起中断标志位GICD_ICPENDRx */GICD->ICPENDR[3] |= (1<<1);/* 清除终端触发标志EXTI_FRR1 */EXTI->FPR1 |= (1<<7);}}/* 清除处理完的中断号GICC_EOIR */GICC->EOIR = irqno;}

在这里插入图片描述

这篇关于STM32MP157按键中断实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/202303

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

Cortex-A7:ARM官方推荐的嵌套中断实现机制

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版 1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断,开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套中断的,这从Cortex-A7中断向量表中仅为外部中断设置了一个中断向量可以看出。本文介绍ARM官方推荐使用的嵌套中断实现机

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

外部中断的边缘触发和电平触发

MCS-51单片机中的边缘触发是指当输入引脚电平由高到低发生跳变时,才引起中断。而电平触发是指只要外部引脚为低电平就引起中断。         在电平触发方式下,当外部引脚的低电平在中断服务返回前没有被拉高时(即撤除中断请求状态),会引起反复的不需要的中断,造成程序执行的错误。这类中断方式下,需要在中断服务程序中设置指令,清除外部中断的低电平状态,使之变为高电平。

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置