arm: day8

news2024/12/24 8:54:11

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] &= (first << ((nod%4)+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;
}

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

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

相关文章

02-Flask框架和项目启动

安装Flask 1. 使用pycharm 企业版,直接选择Flask 2. 手动安装 (1) 进入终端进入虚拟环境 执行 pip list ,查看虚拟环境已安装的已三方库 (2) 手动安装Flask第三方库 pip install flask2.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/ (3) 安装 pymysl ,和数据库关联第三…

HexoAssistant——博客上传助手(含源码)

文章目录 HexoAssistant——博客上传助手(含源码)1 前言2 效果演示3 源码地址4 总结 HexoAssistant——博客上传助手(含源码) 1 前言 旅行之余&#xff0c;用PyQt5写了一个博客上传的工具&#xff0c;旨在更加便捷地将本地文章上传Github博客。之前虽然配置过hexogithub的博客…

2023-8-22 模拟栈

题目链接&#xff1a;模拟栈 #include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while(m--){string op;int x;cin >> op;if(op "push") {cin >> x;stk[tt] x;}else if(op "…

浅入深出充分理解-->(fork())父子进程

目录 进程是如何被管理的 Linux下的进程是如何被管理的 fork()父子进程的创建 1&#xff1a;为什么fork返回给父进程子进程的id&#xff0c;给子进程返回0 2&#xff1a;一个函数是如何做到返回两次的 3&#xff1a;一个变量怎么会有不同内容 在某一个时刻,我正在用电脑打…

【Unity3D】水面特效

1 前言 水波特效 中通过屏幕后处理实现了环形水波效果&#xff0c;本文通过 Shader Graph 实现了模拟水面特效&#xff0c;包含以下特效细节。 深水区和浅水区颜色差异&#xff1b;水面有波纹&#xff0c;并且在移动&#xff1b;水面起伏波动&#xff1b;水面边缘有水泡&#…

《数字图像处理-OpenCV/Python》连载(1)前言

《数字图像处理-OpenCV/Python》连载&#xff08;1&#xff09;前言 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 写作背景 编写本书的初衷&#xff0c;源自作者学习数字图像处理的经历。 在创新实验班开设的专业创新教育课程中&#xff0c;我选择的…

基于springboot灾区物资管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

RestFul API 详解

目录 一、RestFul API 概述1.1 API1.2 RestFul API 二、REST概述三、RestFul API 规范3.1 动作3.2 路径&#xff08;接口命名&#xff09;3.3 过滤信息&#xff08;Filtering&#xff09;3.4 状态码&#xff08;Status Codes&#xff09; 四、RESTful 的极致 HATEOAS 一、RestF…

Node.JS教程

文章目录 Node.JSNode.js学习指南一、Node.js基础1.认识Node.js2.开发环境搭建3. 模块、包、commonJS3.1、为什么要有模块化开发&#xff1f;3.2、CommonJS规范3.3、 modules模块化规范写法 总结 Node.JS Node.js学习指南 服务端开发底层平台周边生态 学习前提 JavaScript、E…

2023年菏泽市中职学校技能大赛“网络安全”赛项规程

2023年菏泽市中职学校技能大赛 “网络安全”赛项规程 一、赛项名称 赛项名称&#xff1a;网络安全 赛项所属专业大类&#xff1a;信息技术类 二、竞赛目的 通过竞赛&#xff0c;检验参赛选手对网络、服务器系统等网络空间中各个信息系统的安全防护能力&#xff0c;以及分析…

第二篇论文写作启发点V5

第二篇论文写作启发点V5 2.LLFLow模型的缺陷&#xff0c;这是先验&#xff0c;如果先验出现错误&#xff0c;那么后面这个模型都会错误。而我们使用了学习的方式去解决 3. 参考文献和实验时的对照模型最好使用最新的&#xff0c;就是没有被引用过的&#xff0c;这样可以降低论文…

【大数据】Linkis 简述

Linkis 简述 1.引言2.背景3.设计初衷4.技术架构5.业务架构6.处理流程7.如何支撑高并发8.用户级隔离度和调度时效性9.总结 Linkis 是微众银行开源的一款 数据中间件&#xff0c;用于解决前台各种工具、应用&#xff0c;和后台各种计算存储引擎间的连接、访问和复用问题。 1.引言…

ImportError: cannot import name ‘SQLDatabaseChain‘ from ‘langchain‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

使用IDEA把Java程序打包成jar

点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的号 选择JAR->From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK Artifacts添加完成后点击右下角OK 在工具栏中找到Build,选择Build Artifacts 刚才创建好的Artifacts,选择Bui…

食品饮料制造行业如何实现数字化转型和工业4.0

随着科技的不断进步和全球产业的不断发展&#xff0c;食品饮料制造行业也正迎来数字化转型和工业4.0的浪潮。这一转型不仅提升了生产效率和质量&#xff0c;还满足了消费者对更健康、更可持续产品的需求。本文将深入探讨食品饮料制造行业在数字化转型和工业4.0方面的趋势、挑战…

文心一言测评,满足你的生活工作方方面面

出品| 大力财经 文 | 魏力 随着国产大模型如雨后春笋般爆发&#xff0c;百度文心一言在多个中文任务中已经超越了ChatGPT。 文心一言的逻辑性强&#xff0c;能够满足提问者的各种需求&#xff0c;并在各个领域都有出色的表现。在多个领域&#xff0c;人工智能需要更准确地回…

SQL - Navicat查看SQL执行计划

我们在工作中肯定写过sql语句&#xff0c;也会进行一下sql语句的优化&#xff0c;在优化sql语句里看过相应的explain 在进行sql语句优化的时候&#xff0c;理解执行计划中各个参数的意思&#xff0c;弄明白执行的顺序&#xff0c;对sql优化有很大的帮助。 1、通过 Explain 命令…

编程的成就感到底在哪里?

一个好的开发人员如何成为一个伟大的开发人员&#xff1f; 暂时忘记伟大&#xff1a;一个体面的开发人员如何成为一个好的开发人员&#xff1f; 从步骤 1 到步骤 n 没有明确的路径。 哎呀&#xff0c;甚至不清楚步骤n是什么。 作为具有逻辑思维的开发人员类型&#xff0c;缺乏…

计算机视觉 -- 图像分割

文章目录 1. 图像分割2. FCN2.1 语义分割– FCN &#xff08;Fully Convolutional Networks&#xff09;2.2 FCN--deconv2.3 Unpool2.4 拓展–DeconvNet 3. 实例分割3.1 实例分割--Mask R-CNN3.2 Mask R-CNN3.3 Faster R-CNN与 Mask R-CNN3.4 Mask R-CNN&#xff1a;Resnet1013…

Gateway简述

前言 ​ 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端调用多个微服务接口的地址。另外微服务架构的请求中&#xff0c;90%的都携带认证信息/用户登录信息&#xff0c;都需要做相关的限制管理&#xff0c;API网关由此应允而生。 这样的架构会存…