arm: day8

1.中断实验:按键控制led灯

流程:

key.h

/*************************************************************************
    > File Name: include/key.h
    > Created Time: 2023年08月21日 星期一 17时03分20秒
 ************************************************************************/

#ifndef __KEY_H__
#define __KEY_H__

//引脚编号封装
#define EXTI7 7
#define EXTI8 8
#define EXTI9 9

#define GPIO_PIN_0 0
#define GPIO_PIN_1 1
#define GPIO_PIN_2 2
#define GPIO_PIN_3 3
#define GPIO_PIN_4 4
#define GPIO_PIN_5 5
#define GPIO_PIN_6 6
#define GPIO_PIN_7 7
#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10
#define GPIO_PIN_11 11
#define GPIO_PIN_12 12
#define GPIO_PIN_13 13
#define GPIO_PIN_14 14
#define GPIO_PIN_15 15

#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gic.h"

typedef enum{
	FALL_DIS,	//禁用下降沿 0
	FALL_EN		//启用下降沿 1
}exti_ftsr1_t;

//RCC/GPIO/EXTI章节初始化
void HAL_EXTI_INIT(unsigned int pin, unsigned int gp, exti_ftsr1_t falling);

//GIC章节初始化
void HAL_GIC_INIT(unsigned int nod, unsigned int first);
 

//***************点灯***************//
//MODER模式寄存器
typedef enum{
	INPUT,	//输入 0
	OUPUT,	//输出 1
	ALT,	//复用 2
	ANALOG	//模拟 3
}gpio_moder_t;

//OTYPER输出类型寄存器
typedef enum{
	PP,		//推挽 0
	OD		//开漏 1
}gpio_otyper_t;

//OSPEEDR输出速率寄存器
typedef enum{
	LOW,		//低速 0
	MED,		//中速 1
	HIGH,		//高速 2 
	VERY_HIGH	//快速 3
}gpio_ospeedr_t;

//PUPDR是否需要上下拉电阻寄存器
typedef enum{
	NO_PU_PD,	//禁止 0 
	PU,			//上拉 1
	PD,			//下拉 2
	RES			//保留 3
}gpio_pupdr_t;

typedef struct{
	gpio_moder_t moder;		//模式寄存器
	gpio_otyper_t otyper;	//输出类型寄存器
	gpio_ospeedr_t ospeedr;	//输出速率寄存器
	gpio_pupdr_t pupdr;		//是否需要上下拉电阻寄存器
}gpio_init_t;


//GPIO引脚初始化函数 PE10 PF10 PE8
//void hal_gpio_init(GPIO组编号,引脚编号,初始化的值)
void hal_gpio_initl(gpio_t* gpiox, unsigned int pin, gpio_init_t *gpio_init);

//GPIO引脚写操作函数 0:熄灭 1:点亮
//void hal_gpio_write(GPIO组编号,引脚编号,操作的值)
void hal_gpio_writel(gpio_t* gpiox, unsigned int pin);



#endif

key.c

/*************************************************************************
    > File Name: src/key.c
    > Created Time: 2023年08月21日 星期一 17时03分20秒
 ************************************************************************/

#include "key.h"

//RCC/GPIO/EXTI章节初始化
void HAL_EXTI_INIT(unsigned int pin, unsigned int gp, exti_ftsr1_t falling)
{
	//RCC使能GPIOF组 MP_AHB4ENSETR[5] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 5);

	//设置GPIOF引脚模式为输出
	GPIOF->MODER &= (~(0x3 << (pin*2)));

	//EXTI外部中断选择GPIOF
	unsigned int n = pin/4 + 1;
	switch (n)
	{
		case 3 :
			EXTI->EXTICR3 &= (~(0xff << ((pin%4)*8)));
			EXTI->EXTICR3 |= (gp << ((pin%4)*8));
			break;
		case 2:
			EXTI->EXTICR2 &= (~(0xff << ((pin%4)*8)));
			EXTI->EXTICR2 |= (gp << ((pin%4)*8));
			break;
	}
	//EXTI事件触发为下降沿
	EXTI->FTSR1 |= (falling << pin);
	
	//EXTI设置不屏蔽 C1IMR1[9] = 1
	EXTI->C1IMR1 |= (0X1 << pin);

}

//GIC章节初始化
void HAL_GIC_INIT(unsigned int nod, unsigned int first)
{
	//1.GICD层
	//使能GICD层 CTRL[0] = 1
	GICD->CTRL |= (0x1 << 0);

	//中断设置使能(99) ISENABLER[3]第3位写1
	GICD->ISENABLER[nod/32] |= (0X1 << (nod%32));

	//中断优先级设置  IPRIORITYR[24]第[31:27] = 0b00000
	GICD->IPRIORITYR[nod/4] &= (~(0x1f << ((nod%4)*8+3)));
	GICD->IPRIORITYR[nod/4] |= (first << ((nod%4)*8+3));

	//选择CPU0  ITARGETSR[24]第[25:24] = 0b01
	GICD->ITARGETSR[nod/4] &= (~(0X3 << ((nod%4)*8)));
	GICD->ITARGETSR[nod/4] |= (0X1 << ((nod%4)*8));
	
	//2.GICC层
	//使能GICC层  CTRL[0] = 1
	GICC->CTRL |= (0X1 << 0);

	//输入中断优先级 PMR[7:3] = 0b11111
	GICC->PMR |= (0x1f << 3);
}




//**************点灯******************//
void hal_gpio_initl(gpio_t* gpiox, unsigned int pin, gpio_init_t *gpio_init)
{
	//1.设置gpio引脚模式MODER 每两位管理一个引脚
	gpiox->MODER &= (~(0x3 << (pin * 2)));
	gpiox->MODER |= (gpio_init->moder << (pin * 2));

	//2.设置gpio引脚输出类型
	gpiox->OTYPER &= (~(0x1 << pin));
	gpiox->OTYPER |= (gpio_init->otyper << pin);

	//3.设置gpio引脚输出速率
	gpiox->OSPEEDR &= (~(0x3 << (pin * 2)));
	gpiox->OSPEEDR |= (gpio_init->ospeedr << (pin * 2));
	
	//4.设置gpio引脚禁止上下拉电阻
	gpiox->PUPDR &= (~(0x3 << (pin * 2)));
	gpiox->PUPDR |= (gpio_init->pupdr << (pin * 2));
}

void hal_gpio_writel(gpio_t* gpiox, unsigned int pin)
{	
		gpiox->ODR ^= (0x1 << pin);
}

do_lrq.c

#include "key.h"
 
extern void printf(const char *fmt, ...);
unsigned int i = 0;

void do_irq(void) 
{
	unsigned int num = 0;
 
	//获取中断号
	num = GICC->IAR & 0X3FF;
	switch (num)
	{
		case 99:
			{
				printf("***key1***\n");

				hal_gpio_writel(GPIOE, GPIO_PIN_8);

				//清除EXTI层挂起标志位
				EXTI->FPR1 |= (0x1 <<9);
 
				//清除GICD层挂起标志位
				GICD->ICPENDR[3] |= (0X1 <<3);
			}
			break;

		case 97:
			{
				printf("***key2***\n");
				hal_gpio_writel(GPIOF, GPIO_PIN_10);

				//清除EXTI层挂起标志位
				EXTI->FPR1 |= (0x1 <<7);

				//清除GICD层挂起标志位
				GICD->ICPENDR[3] |= (0X1 <<1);
			}
			break;

		case 98:
			{
				printf("***key3***\n");
				hal_gpio_writel(GPIOE, GPIO_PIN_10);

				//清除EXTI层挂起标志位
				EXTI->FPR1 |= (0x1 <<8);

				//清除GICD层挂起标志位
				GICD->ICPENDR[3] |= (0X1 <<2);
			}
			break;
	}
	//清除中断号
	GICC->EOIR &= (~(0X3FF));
	GICC->EOIR |= num;
}

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++);
}
 
void led_init()
{
	//初始化时钟 GPIOE和GPIOF组时钟使能
	RCC->MP_AHB4ENSETR |= (0x3 << 4);
	//结构体进行初始化
	//gpio_init_t init;
	//init.moder = OUPUT;
	//init.otyper = PP;
	//init.ospeedr = LOW;
	//init.pupdr = NO_PU_PD;
	gpio_init_t init = {OUPUT, PP, LOW, NO_PU_PD};
	hal_gpio_initl(GPIOE, GPIO_PIN_10, &init);
	hal_gpio_initl(GPIOF, GPIO_PIN_10, &init);
	hal_gpio_initl(GPIOE, GPIO_PIN_8, &init);
}
 
int main()
{
	led_init();

	HAL_EXTI_INIT(EXTI9, 0x05, FALL_EN);
	HAL_EXTI_INIT(EXTI7, 0x05, FALL_EN);
	HAL_EXTI_INIT(EXTI8, 0x05, FALL_EN);

	HAL_GIC_INIT(99, 9);
	HAL_GIC_INIT(97, 7);
	HAL_GIC_INIT(98, 8);

	while(1)
	{
	
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海外网红营销中的创新技术与趋势:AI、AR和VR的应用探索

随着全球数字化时代的不断发展&#xff0c;互联网已经成为连接人们的桥梁&#xff0c;而社交媒体则在其中扮演着举足轻重的角色。在这个全球性的社交媒体网络中&#xff0c;海外网红以其独特的个人魅力和内容创作能力迅速崭露头角。而为了在竞争激烈的市场中脱颖而出&#xff0…

LeetCode150道面试经典题-- 二叉树的最大深度(简单)

1.题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 2.示例 3.思路 深度优先遍历 一个二叉树要查询到最大深度&#xff0c;可以将问题转为从根节点出发&#xff0c;查看左右子树的最大深度&am…

AMBA总线协议(8)——AHB(六):分割传输

一、前言 在之前的文章中&#xff0c;我们重点介绍了AHB传输的仲裁&#xff0c;首先介绍了仲裁相关的信号&#xff0c;然后分别介绍了请求总线访问&#xff0c;授权总线访问&#xff0c;猝发提前终止&#xff0c;锁定传输和默认主机总线&#xff0c;在本文中我们将继续介绍AHB的…

【unity小技巧】Unity实现视差效果与无限地图(附git源码)

文章目录 前言下载素材1. 角色素材 环境搭建和人物移动视差效果无限背景源码参考完结 前言 如何提升你的画面感&#xff1f;动态的背景设计可以丰富我们的游戏效果&#xff0c;当你在游戏中行走或奔跑时&#xff0c;你将能够感受到身体在空间中的运动&#xff0c;仿佛真的置身…

服务机器人,正走向星辰大海

大数据产业创新服务媒体 ——聚焦数据 改变商业 国内机器人联盟&#xff08;IFR&#xff09;将机器人划分为工作机器人、服务机器人、特种机器人三类。服务机器人广泛应用于餐饮场景、酒店场景&#xff0c;早已构成一道靓丽的风景。行业数据显示&#xff0c; 作为服务机器人发…

C#反编译工具ILSPY

ILSPY ILSpy 是一个开源的.Net程序集浏览器和反编译工具。 Visual Studio 2022附带了默认情况下启用的F12反编译支持&#xff08;使用我们的引擎v7.1&#xff09;。 在Visual Studio 2019中&#xff0c;您必须手动启用F12支持。转到“工具”/“选项”/“文本编辑器”/C#/Adva…

【Axure模板】APP帮助中心原型,在线客服意见反馈模块高保真原型

作品概况 页面数量&#xff1a;共 10 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;原型设计模板 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 该模板作品为APP帮助与客服的通用模块&#xff0c;…

Docker详解

文章目录 Docker详解一、Docker简介什么是容器 &#xff1f;容器技术有哪些优点 &#xff1f;什么是Docker &#xff1f;Docker的特点Docker的使用场景 二、Docker的基本组成Docker 客户端 / 守护进程Docker Image 镜像Docker Container 容器Docker Registry 仓库 三、Docker 依…

docker之DockerFile与网络

目录 DockerFile 构建步骤 基础知识 指令 实战&#xff1a;构建自己的centos 第一步&#xff1a;编写dockerfile文件 第二步&#xff1a;构建镜像文件 docker网络 原理 功能 网络模式 host模式 container模式 none模式 bridge模式 DockerFile dockerfile 是用来…

Next.js - Loading UI and Streaming

特殊文件 loading.js 可帮助您使用 React Suspense 创建有意义的加载用户界面。使用此约定&#xff0c;您可以在加载路由段内容时显示来自服务器的即时加载状态。渲染完成后&#xff0c;新的内容会自动切换进来。 即时加载状态 即时加载状态是在导航时立即显示的后备用户界面…

macOS上编译obs-studio

前言 最近基于obs的1个二开程序&#xff0c;需要移植到macOS平台上&#xff0c;由于遇到些问题&#xff0c;本文记录下如何在macOS上配置&编译&运行obs程序完整过程。 下载 首先下载cmake-gui工具&#xff0c;下载CMAKE&#xff0c;选择对应macOS平台的cmake版本&…

【HMS Core】在线语种检测返回结果错误

【关键字】 在线语种检测、机器学习 【问题描述】 集成在线语种检测服务&#xff0c;检测蒙古文之后&#xff0c;返回结果为中文 【问题分析】 1、在线语种服务目前不支持蒙古文&#xff0c;具体可见官网语种支持列表&#xff1a; 【ML Kit】语种检测支持的语言列表 2、目前…

(4)将固件加载到没有ArduPilot固件的主板上

文章目录 前言 4.1 下载驱动程序和烧录工具 4.2 下载ArduPilot固件 4.3 使用测试版和开发版 4.3.1 测试版 4.3.2 最新开发版本 4.4 将固件上传到自动驾驶仪 4.5 替代方法 4.6 将固件加载到带有外部闪存的主板上 前言 ArduPilot 的最新版本&#xff08;Copter-3.6, Pl…

基于swing的旅游管理系统java jsp旅行团信息mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的旅游管理系统 系统有1权限&#xff1a;管…

uni-app中监听网络状态,并在嵌入webView页面的组件中添加网络监测

uni-app中监听网络状态&#xff0c;并在嵌入webView页面的组件中添加网络监测 uni-app中监听网络状态 下载插件 打开网络异常组件页面&#xff0c;点击"下载插件并导入HBuilderX"按钮&#xff0c;打开HBuilderX软件后&#xff0c;选择需要导入插件的项目&#xff…

使用威胁搜寻增加网络安全

什么是威胁搜寻 威胁搜寻&#xff08;也称为网络威胁搜寻&#xff09;是一种主动网络安全方法&#xff0c;涉及主动搜索隐藏的威胁&#xff0c;例如组织网络或系统内的高级持续性威胁和入侵指标。威胁搜寻的主要目标是检测和隔离可能绕过网络外围防御的威胁&#xff0c;使管理…

在Qt窗口中添加右键菜单

在Qt窗口中添加右键菜单 基于鼠标的事件实现流程demo 基于窗口的菜单策略实现Qt::DefaultContextMenuQt::ActionsContextMenuQt::CustomContextMenu信号API 基于鼠标的事件实现 流程 需要使用:事件处理器函数(回调函数) 在当前窗口类中重写鼠标操作相关的的事件处理器函数&a…

小程序中通过canvas生成并保存图片

1. html <canvas class"canvas" id"photo" type"2d" style"width:200px;height: 300px;"></canvas> <button bindtap"saveImage">保存</button> <!-- 用来展示生成的那张图片 --> <image…

js判断用户当前网络状态和判断网速

前端判断用户当前网络状态和判断网速 一、第一种是通过 HTML5 提供的 navigator 去检测网络(1)、原理介绍:(2)、兼容性 二、监听window.ononline和window.onoffline事件:三、通过ajax进行请求判断(兼容性好-推荐)(1)、原理介绍:(2)、注意: 四、navigator.connection方法监听网络…

Quartz任务调度框架介绍和使用

一、Quartz介绍 Quartz [kwɔːts] 是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;完全由Java开发&#xff0c;可以用来执行定时任务&#xff0c;类似于java.util.Timer。但是相较于Timer&#xff0c; Quartz增加了很多功能&#xff1a; 1.持久性作业 …