arm学习cortex-A7中断按键控制led灯亮灭

news2024/9/21 16:35:56

main.c

#include "key.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}
int main()
{
	//rcc初始化 
	RCC->MP_AHB4ENSETR |= (0x3 << 4);
	//初始化按键GPIOF模式为输入模式
	hal_key_gpio_init(GPIOF,GPIO_PIN_9);
	hal_key_gpio_init(GPIOF,GPIO_PIN_8);
	hal_key_gpio_init(GPIOF,GPIO_PIN_7);
	//初始化EXTI设置中断触发为下降沿不屏蔽
	hal_exti_init(EXTI,GPIO_PIN_8,DOWN);
	hal_exti_init(EXTI,GPIO_PIN_7,DOWN);
	hal_exti_init(EXTI,GPIO_PIN_9,DOWN);
	//初始化GICC、GICD使能并设置优先级
	hal_gic_init(TERMINAL_CODE_7,PIN_7);
	hal_gic_init(TERMINAL_CODE_8,PIN_8);
	hal_gic_init(TERMINAL_CODE_9,PIN_9);
	//LED灯初始化为输出模式,推挽,低速,不上下拉
	hal_led_init(GPIOE,GPIO_PIN_10);
	hal_led_init(GPIOF,GPIO_PIN_10);
	hal_led_init(GPIOE,GPIO_PIN_8);
	while(1)
	{
	}
	return 0;
}

key.c

#include "key.h"
//led灯使能初始化
void hal_led_init(gpio_t* gpios,unsigned int pin){ 
	//引脚初始化	
	gpios->MODER  &= (~(0x3 << pin*2));
	gpios->MODER |= (0x1 << pin*2);
	gpios->OTYPER &= (~(0x1 << pin));
	gpios->OSPEEDR &= (~(0x3 << pin*2));
	gpios->PUPDR &= (~(0x3 << pin*2));
}
//led开关
void hal_led_set(gpio_t* gpios,unsigned int GPIO_PIN){
	//获取灯当前状态
	unsigned int status = (gpios->ODR & (0x1 << GPIO_PIN)) >> GPIO_PIN;
	//判断后取反
	if(status == 1){
		gpios->ODR &= (~(0x1 << GPIO_PIN));
	}else{
		gpios->ODR |= (0x1 << GPIO_PIN);
	}
}

void hal_key_gpio_init(gpio_t* gpios,unsigned int pin){
	//gpio初始化
	gpios->MODER &= (~(0x3 << pin*2));
}

//对rcc gpio exti 进行初始化
void hal_exti_init(exti_t* extis,unsigned int pin,ftsr_t stat){
		//exti初始化
	//设置exti选择寄存器
	if(pin == 9){
		extis->EXTICR3 &=(~(0xff << 8));
		extis->EXTICR3 |=(0x5 << 8);
	}
	if(pin == 7){
		extis->EXTICR2 &=(~(0xff << 24));
		extis->EXTICR2 |=(0x5 << 24);
	}
	if(pin == 8){
		extis->EXTICR3 &=(~(0xff));
		extis->EXTICR3 |=(0x5);
	}
	//设置中断触发为下降沿触发
	extis->FTSR1 |= (stat << pin);
	//设置中断不屏蔽
	extis->C1IMR1 |= (stat << pin);

}
//对gic初始化
void hal_gic_init(unsigned int t_code,unsigned int pin){
	//gicd初始化
	//设置gicd层组控制器使能
	GICD->CTRL |= (0x1);	
	//设置gicd层中断设置使能寄存器
	GICD->ISENABLER[t_code/32] |=(0x1 << t_code%32);
	//设置gicd层中断优先级寄存器
	GICD->IPRIORITYR[t_code/4] &=(~(0x1f << ((t_code%4)*8+3)));
	//设置gicd层中断目标分配寄存器
	GICD->ITARGETSR[t_code/4] &=(~(0x3 << (t_code%4)*8));
	GICD->ITARGETSR[t_code/4] |=(0x1 << (t_code%4)*8);
	//gicc初始化
	//设置gicc层组控制器使能
	GICC->CTRL |=(0x1);
	//设置gicc层中断优先级寄存器
	GICC->PMR |= (pin << 3);
}

key.h

#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
#define GPIO_PIN_10 10
#define GPIO_PIN_9 9
#define GPIO_PIN_8 8
#define GPIO_PIN_7 7
#define PIN_9 9
#define PIN_8 8
#define PIN_7 7
#define TERMINAL_CODE_7 97
#define TERMINAL_CODE_8 98
#define TERMINAL_CODE_9 99

typedef enum{
	UP,
	DOWN,
}ftsr_t;
//对rcc gpio exti 进行初始化
void hal_exti_init(exti_t* extis,unsigned int pin,ftsr_t stat);
//对gic初始化
void hal_gic_init(unsigned int t_code,unsigned int pin);

//key gpio初始化
void hal_key_gpio_init(gpio_t* gpios,unsigned int pin);

//led灯使能初始化
void hal_led_init(gpio_t* gpios,unsigned int GPIO_PIN);
//led开关
void hal_led_set(gpio_t* gpios,unsigned int GPIO_PIN);
#endif

do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
	unsigned int num;
	//获取中断号
	num = (GICC->IAR & (0x3ff));
	//判中断号
	//99-----》key1 ----->printf
	//98-----》key3 ----->printf
	//97-----》key4 ----->printf
	//清除对应挂起位
	switch(num){
	case 97:
		//key2开关控制led灯2的亮灭
		hal_led_set(GPIOF,GPIO_PIN_10);
		printf("key2 press!!!!!!\n");
		EXTI->FPR1 |=(0x1 << 7);
		GICD->ICPENDR[3] |=(0x1 << 1);
		break;
	case 98:
		//key3开关控制led灯3的亮灭
		hal_led_set(GPIOE,GPIO_PIN_8);
		printf("key3 press!!!!!!\n");
		EXTI->FPR1 |=(0x1 << 8);
		GICD->ICPENDR[3] |=(0x1 << 2);
		break;
	case 99:
		//key1开关控制led灯1的亮灭
		hal_led_set(GPIOE,GPIO_PIN_10);
		printf("key1 press!!!!!!\n");
		//清除exti层中断挂起的标志位
		EXTI->FPR1 |=(0x1 << 9);
		//清除gicd层中断挂起的标志位
		GICD->ICPENDR[3] |=(0x1 << 3);
		break;
	}
	//清除所获取到的中断号
	GICC->EOIR = num;
}

在这里插入图片描述

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

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

相关文章

cyclo(-D-Ala-Val),15136-27-3,可以通过肽筛选发现的多肽

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ 为大家介绍&#xff08;CAS&#xff1a;15136-27-3&#xff09;,试剂仅用于科学研究&#xff0c;不可用于人类&#xff0c;非药用&#xff0c;非食用。 英文名称&#xff1a…

从刷题到解决问题再到研究创新

题记&#xff1a;死的知识学再多也没大用。 明明自觉学会了不少知识&#xff0c;可真正开始做题时&#xff0c;却还是出现了“一支笔&#xff0c;一双手&#xff0c;一道力扣&#xff08;Leetcode&#xff09;做一宿”的窘境&#xff1f;你是否也有过这样的经历&#xff0c;题…

移动端H5页面引入高德地图的一些问题记录

web端显示 移动端显示 移动端和web端显示的地图范围一样大&#xff0c;并且在移动端地图的zoom和web端一致 这个问题是在公司开发邀请函的时候碰到的&#xff0c;因为要在移动端显示的范围足够大&#xff0c;使用zoom并不能满足需求了&#xff0c;例如如下代码 amap new AMa…

Sqlserver 中nchar(n)、varchar(n)、nvarchar(n)和nvarchar(max)的区别

nchar(n): 固定大小字符串数据。 n 用于定义字符串大小&#xff08;以双字节为单位&#xff09;&#xff0c;并且它必须是 1 到 4,000 之间的值。 存储大小为 n 字节的两倍。 varchar(n): 长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间…

解决Rstudio server is taking longer than usual.

经常用Rstudio server访问服务器&#xff0c;但长时间使用未清理缓存时出现了以下界面&#xff1a; 点任何一个键都无法解决&#xff0c;查询了一下原因是由于当使用RStudio Server处理占内存极大的数据后&#xff0c;长时间不清理内存&#xff0c;当再次打开rstudio&#xff0…

IPC-核间通讯

1. IPC通讯是AUTOSAR体系结构中的核心组成部分&#xff0c;它使得不同的软件组件可以相互通信、协同工作&#xff0c;从而实现整车系统的功能。IPC可以理解为核间通讯&#xff0c;就是一个芯片有多个核&#xff0c;现在想让多核之间通信&#xff0c;达到下面几个目的&#xff1…

Docker自学记录笔记

安装联系Docker命令 1. 搜索镜像 docker search nagin 2. 下载镜像 3. 启动nginx 强调文本 强调文本 加粗文本 加粗文本 标记文本 删除文本 引用文本 H2O is是液体。 210 运算结果是 1024. 插入链接与图片 链接: link. 图片: 带尺寸的图片: 居中的图片: 居中并…

初识win32

很多人都说windows编程凉了&#xff0c;实则不然&#xff0c;因为微软不倒&#xff0c;我们还在使用微软提供的winddows操作系统&#xff0c;windows编程就不会消亡&#xff0c;MFC也是一样&#xff0c;不可否认其他编程语言的方便&#xff0c;强大&#xff0c;但是windows编程…

深入理解linux物理内存

目录 物理内存热插拔 从 CPU 角度看物理内存架构 内核如何管理 NUMA 节点 NUMA 节点物理内存区域的划分 NUMA 节点的状态 node_states 物理内存区域中的水位线 物理内存区域中的冷热页 内核如何描述物理内存页 匿名页的反向映射 物理内存热插拔 物理热插拔阶段&#xff…

『赠书活动 | 第十四期』《Spring Cloud Alibaba核心技术与实战案例》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十四期』 本期书籍&#xff1a;《Spring Cloud Alibaba核心技术与实战案例》 公众号赠书&#xff1a;第五期 参与方式&#xff1a;关注公…

【Linux 驱动篇(四)】设备树

文章目录 一、什么是设备树二、DTS、 DTB 和 DTC三、DTS 语法1. .dtsi 头文件2. 设备节点3. 标准属性3.1 compatible 属性3.2 model 属性3.3 status 属性3.4 #address-cells 和#size-cells 属性3.5 reg 属性 ...... 一、什么是设备树 设备树(Device Tree)&#xff0c;将这个词分…

为什么不建议企业用薪资系统来跟踪项目时间?

身处在一个每分钟都很重要的世界里&#xff0c;企业必须勤于管理时间和工资。 虽然使用薪资系统进行时间跟踪似乎是一个实用的解决方案&#xff0c;但这种方法可能导致许多问题。 本文将讨论专用的时间跟踪软件对任何组织都必不可少的原因&#xff0c;以及依靠薪资系统进行时…

推特、微博对手Threads软件的下载、注册、使用最新超详细教程

经过马斯克不断折腾&#xff0c;推特面临用户大量流失的风险&#xff0c;尤其近期限制推文阅读量&#xff0c;更是导致大量用户出走。 于是乎&#xff0c;Meta公司7月6日正式发布对标推特的新社交平台 Threads&#xff0c;当前Threads只能在 iOS、Android 平台上安装 APP 使用&…

【JAVA】爱心代码--java特供(可直接复制,亲测有效)

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录 前言爱心的数学原理爱心代码基本版本带二种 前言 回看过去我发现我的第一篇博客竟然是一篇关于C语言爱心代码的博客&#xff08;真是个奇怪的开始&#xff09;&#xff0c;不过这么长时间过去了&#xff0c;我的编程语…

软件设计模式与体系结构-设计模式-行为型软件设计模式-策略模式

目录 四、策略模式类图代码实例使用策略模式对中国的十二属相&#xff08;Chinese Zodiac&#xff09;设计查询系统。策略模式与状态模式课程作业 四、策略模式 类图 代码 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算…

【Django】Django框架使用指南

Django使用指南 作者简介&#xff1a;嗨~博主目前是长安大学软件工程专硕在读&#x1f4d8;&#xff0c;喜欢钻研一些自己感兴趣的计算机技术&#xff0c;求关注&#x1f609;&#xff01; 框架简介&#xff1a;Django是一个基于Python语言的开源Web应用框架&#xff0c;采用 M…

路径规划算法:基于学生心理学优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于学生心理学优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于学生心理学优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

Django框架-11

聚合查询 1.聚合函数 使用aggregate()过滤器调用聚合函数。聚合函数包括&#xff1a;Avg 平均&#xff0c;Count 数量&#xff0c;Max 最大&#xff0c;Min 最 小&#xff0c;Sum 求和&#xff0c;被定义在django.db.models中。 例&#xff1a;查询图书的总阅读量。 from mo…

数据结构错题集 第七章 查找

7.2 124 等比 1(1-2^h)/(1-2) 2^h - 1 查找失败的最小次数相等吗&#xff1f; 13.A D 推一下公式 &#xff08;M1&#xff09;/2 平均查找长度 17.有序 就可二分查找 记住向下取整就是往右 13题就是个例子 向上取整就是往左 7.3 A错 不会分裂 不是平衡树 12。 C 黑高…

硬件基础——数字电路门电路

门电路与D触发器 一、与门 1.基本定义 与门又称 “与电路”、逻辑“积”、逻辑“与”电路&#xff0c;是执行“与”运算的基本逻辑门电路。有多个输入端&#xff0c;一个输出端。当所有的输入同时为高电平&#xff08;逻辑1&#xff09;时&#xff0c;输出才为高电平&#xf…