ARM day8 key1/2/3led

key_led.h

#ifndef _KEY_H_
#define _KEY_H_

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

//EXTI编号
typedef enum
{
	EXTI0,
	EXTI1,
	EXTI2,
	EXTI3,
	EXTI4,
	EXTI5,
	EXTI6,
	EXTI7,
	EXTI8,
	EXTI9,
	EXTI10,
}EXTI_t;

//上升沿 下降沿
typedef enum
{
	Falling,
	Upping,
}Ftsr1_t;

//封装引脚编号
#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

//模式寄存器
typedef enum
{
	Input,//输入模式
	Output,//输出模式
	Alt,//复用功能模式
	Analog,//模拟模式
}gpio_moder_t;

//输出类型寄存器
typedef enum
{
	Push_pull,//推挽输出
	Open_drain//开漏输出
}gpio_otyper_t;

//输出速率寄存器
typedef enum
{
	Low_speed,//低速
	Medium_speed,//中速
	High_speed,//高速
	Very_high_speed//超高速
}gpio_ospeed_t;

//是否需要上下拉电阻寄存器
typedef enum
{
	No_up_down,//不用上下拉
	Pull_up,//上拉
	Oull_down,//下拉
	Reserved//保留
}gpio_pupdr_t;

//输出高低电平寄存器
typedef enum
{
	Off,//低电平
	On//高电平
}gpio_odr_t;

//封装初始化结构体
typedef struct
{
	gpio_moder_t moder;
	gpio_otyper_t otyper;
	gpio_ospeed_t ospeedr;
	gpio_pupdr_t pupdr;

}gpio_init_t;

/*函数功能:GPIO引脚初始化操作*/
void hal_gpio_init(volatile gpio_t* GPIOx,unsigned int pin,gpio_init_t *init);
/*操控灯亮灯灭*/
void hal_gpio_write(volatile gpio_t* GPIOx,unsigned int pin,gpio_odr_t status);

//初始化RCC
void rcc_init();
//EXIT初始化
void hal_exit_init(EXTI_t EXTIx,unsigned int Gpio_num,Ftsr1_t f_type);
//GIC初始化
void hal_gic_init(unsigned int Inte_num,unsigned int Inte_level);

#endif

key_led.c

#include "key_led.h"

//EXTI初始化
//第一个参数:EXTI号,第二个参数:GPIO组号,第三个参数:触发方式
void hal_exit_init(EXTI_t EXTIx,unsigned int Gpio_num,Ftsr1_t f_type)
{
	/*******RCC章节初始化*******/
	//使能GPIOF组控制器  RCC->MP_AHB4ENSETR[5]=1 
	RCC->MP_AHB4ENSETR |= (0X1<<5);

	/*******GPIO章节初始化******/
	//设置key1/2/3为输入模式 
	GPIOF->MODER &= (~(0x3<< (EXTIx*2) ));

	/*******EXTI章节初始化******/
	//1.设置key1/2/3与EXTI进行连接 
	unsigned int a=EXTIx/4;
	unsigned int b=EXTIx%4;

	if(a==2)
	{
		EXTI->EXTICR3 &= (~( 0xff<<(8*b) ));
		EXTI->EXTICR3 |= ( Gpio_num<<(8*b) );
	}
	else if(a==1)
	{
		EXTI->EXTICR2 &= (~( 0xff<<(8*b) ));
		EXTI->EXTICR2 |= ( Gpio_num<<(8*b) );
	}

	//2.设置key1/2/3为下降沿触发 
	if(f_type==Falling)
	{
		EXTI->FTSR1 |= (0x1<<EXTIx);	
	}

	//3.设置key1/2/3中断不屏蔽 
	EXTI->C1IMR1 |= (0x1<<EXTIx);
}

//GIC初始化
//第一个参数:中断号,第二个参数:中断级别
void hal_gic_init(unsigned int Inte_num,unsigned int Inte_level)
{	
	/*******GICD章节初始化******/
	//1.使能GICD层(cpu0) GICD_CTRL[0]=1
	GICD->CTRL |= (0X1<<0);

	//2.设置key1/2/3 GICD层中断使能(中断号) 
	unsigned int a=Inte_num/32;
	unsigned int b=Inte_num%32;

	GICD->ISENABLER[a] |= (0x1<<b);

	//3.设置GICD层中断优先级  值越低,级别越高
	unsigned int c=Inte_num/4;
	unsigned int d=Inte_num%4;
	GICD->IPRIORITYR[c] &= (~( Inte_level<<(d*8+3) )); 

	//4.设置中断目标分配寄存器 分配给cpu0,
	unsigned int e=Inte_num/4;
	unsigned int f=Inte_num%4;
	GICD->ITARGETSR[e] &= (~( 0x3<<(f*8) ));
	GICD->ITARGETSR[e] |= ( 0x1<<(f*8) );


	/*******GICC章节初始化******/
	//2.使能组0中断 GICC_CTRL[0]=1
	GICC->CTRL |= (0x1<<0);

	//1.设置GICC层中断优先级 GICC_PMR[7:3]=11111
	GICC->PMR &= (~(0x1f<<3));
	GICC->PMR |= (Inte_level<<3);

}

//RCC初始化
void rcc_init()
{
	//使能GPIOE组
	//使能GPIOF组
	RCC->MP_AHB4ENSETR |= (0X1<<4);
	RCC->MP_AHB4ENSETR |= (0X1<<5);
}

//函数功能:GPIO引脚初始化操作
//参数:第一个参数:GPIO组号; 第二个参数:引脚编号; 第三个参数:初始化内容
void hal_gpio_init(volatile gpio_t* GPIOx,unsigned int pin,gpio_init_t *init)
{
	//1.设置模式
	GPIOx->MODER &= ( ~ (0x3 << (pin*2)) );
	GPIOx->MODER |= ( (init->moder) << (pin*2) );
	//2.设置输出类型
	GPIOx->OTYPER &=( ~(0x1<<pin));
	GPIOx->OTYPER |= ( (init->otyper) << pin );
	//3.设置输出速率
	GPIOx->OSPEEDR &= ( ~ (0x3 << (pin*2)) );
	GPIOx->OSPEEDR |= ( (init->ospeedr) << (pin*2) );
	//4.设置输出是否需要上下拉电阻
	GPIOx->PUPDR &= ( ~ (0x3 << (pin*2)) );
	GPIOx->PUPDR |= ( (init->pupdr) << (pin*2) );

}
/*操控灯亮灯灭*/
//参数:第一个参数:GPIO组号; 第二个参数:引脚编号; 第三个参数:写0(熄灭)/写1(点亮)
void hal_gpio_write(volatile gpio_t* GPIOx,unsigned int pin,gpio_odr_t status)
{
	if(status==Off)
	{
		GPIOx->ODR &=(~(0x1<<pin));
	}
	else
	{	
		GPIOx->ODR |=(0x1<<pin);
	}
}

main.c

#include "key_led.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()

{

	//初始化按键key1

	hal_exit_init(EXTI9,5,Falling);

	hal_gic_init(99,0x1f);

	//初始化按键key2

	hal_exit_init(EXTI7,5,Falling);

	hal_gic_init(97,0x1c);

	//初始化按键key3

	hal_exit_init(EXTI8,5,Falling);

	hal_gic_init(98,0x1a);



	//RCC初始化

    rcc_init();

	//初始化结构体

	gpio_init_t led_a={Output,Push_pull,Low_speed,No_up_down};

	//LED1初始化 PE10

	hal_gpio_init(GPIOE,GPIO_PIN_10,&led_a);

	//LED2初始化 PF10

	hal_gpio_init(GPIOF,GPIO_PIN_10,&led_a);

	//LED3初始化 PE8

	hal_gpio_init(GPIOE,GPIO_PIN_8,&led_a);	

	

	while(1)

	{

	}

	return 0;

}

do_irq.c

#include "key_led.h"

extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
void do_irq(void) 
{
	unsigned int num;
	//获取中断号 IAR[9:0]
	num = GICC->IAR & (0x3ff);

	switch(num)
	{
	case 97:
		printf("this is key2 $$$$$$$$$$$$$$ \n");
		//key1清除EXTI层中断挂起标志位 EXTI_FPR1[9]=0X1
		EXTI->FPR1 |= (0x1<<7);

		//清除GICD层中断挂起标志位 GICD_ICPENDR[3] [3]=1
		GICD->ICPENDR[3] |= (0x1<<1);

		//调用LED2点亮函数
		hal_gpio_write(GPIOF,GPIO_PIN_10,On);
		delay_ms(500);

		//调用LED2熄灭函数
		hal_gpio_write(GPIOF,GPIO_PIN_10,Off);		
		delay_ms(500);	

		break;
	case 98:
		printf("this is key3 ############# \n");
		//key1清除EXTI层中断挂起标志位 EXTI_FPR1[9]=0X1
		EXTI->FPR1 |= (0x1<<8);

		//清除GICD层中断挂起标志位 GICD_ICPENDR[3] [3]=1
		GICD->ICPENDR[3] |= (0x1<<2);

		//调用LED1点亮函数
		hal_gpio_write(GPIOE,GPIO_PIN_10,On);
		delay_ms(500);

		//调用LED1熄灭函数
		hal_gpio_write(GPIOE,GPIO_PIN_10,Off);
		delay_ms(500);

		break;
	case 99:
		printf("this is key1 \n");
		//key1清除EXTI层中断挂起标志位 EXTI_FPR1[9]=0X1
		EXTI->FPR1 |= (0x1<<9);

		//清除GICD层中断挂起标志位 GICD_ICPENDR[3] [3]=1
		GICD->ICPENDR[3] |= (0x1<<3);

		//调用LED3点亮函数
		hal_gpio_write(GPIOE,GPIO_PIN_8,On);
		delay_ms(500);
	
		//调用LED3熄灭函数
		hal_gpio_write(GPIOE,GPIO_PIN_8,Off);
		delay_ms(500);	
		
		break;
	}
	//清除获取到的中断号 
	GICC->EOIR = num;
}

 

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

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

相关文章

陪诊小程序软件|陪诊系统定制|医院陪诊小程序

开发一个陪诊小程序需要投入一定的费用&#xff0c;具体金额会因项目的复杂程度、功能需求和推广政策而有所差异在投入资金之前&#xff0c;建议进行市场调研和需求分析&#xff0c;制定出合理的预算&#xff0c;并选择专业的开发团队进行合作&#xff0c;那么开发陪诊小程序需…

SpringBoot-6

Spring Boot 中的 MVC 支持 Spring Boot 的 MVC 支持主要来最常用的几个注解&#xff0c;包括RestController 用于声明控制器、RequestMapping用于实现方法映射地址、PathVariable 用于接受路径中的参数、RequestParam 用于接受 request 请求中的参数以及RequestBody 用于接受…

【机器学习】支持向量机SVM入门

优化目标 相较于之前学习的线性回归和神经网络&#xff0c;支持向量机&#xff08;Supprot Vector Machine&#xff0c;简称SVM&#xff09;在拟合复杂的非线性方程的时候拥有更出色的能力&#xff0c;该算法也是十分经典的算法之一。接下来我们需要学习这种算法 首先我们回顾…

使用html和css技巧提升网站加载速度

使用html和css技巧提升网站加载速度 加载时间每增加一秒&#xff08;0-5 秒之间&#xff09;&#xff0c;网站转化率平均就会下降 4.42%。页面加载时间的前五秒对转化率的影响最大。 通过更改html和css文件可以提高网站的页面加载速度,本文现在就来介绍一下怎么实现。 延迟加载…

Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)

目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项&#xff1a; 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…

解读维达国际2023半年度财报:后续发力“高端、高利润、高质量”

随着国内直播电商市场的迅速发展&#xff0c;对于希望在国内市场取得成功的品牌来说&#xff0c;直播电商已经成为所有大众消费品牌的竞争关键。 以生活用纸品牌维达为例&#xff0c;截至2023年7月25日&#xff0c;据抖音平台直播动态显示&#xff0c;维达官方旗舰店今年上半年…

免费商城搭建、免费小程序商城搭建、之java商城 电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

Linux-Shell

1.什么是Bash shell(壳) Bash Shell是一个命令解释器&#xff0c;它在操作系统的最外层&#xff0c;负责用户程序与内核进行交互操作的一种接口&#xff0c;将用户输入的命令翻译给操作系统&#xff0c;并将处理后的结果输出至屏幕。 通过xshell连接&#xff0c;就是打开了一…

黑客自学笔记(网络安全)

一、黑客是什么 原是指热心于计算机技术&#xff0c;水平高超的电脑专家&#xff0c;尤其是程序设计人员。但后来&#xff0c;黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实&#xff0c;网络信息空间安全已经成为海陆空之…

Ajax 黑马学习

Ajax 资源 数据是服务器对外提供的资源,通过 请求 - 处理 - 响应方式获取 请求服务器数据, 用到 XMLHttpRequest 对象 XMLHttpRequest 是浏览器提供的js成员, 通过它可以请求服务器上的数据资源 let xmlHttpRequest new XMLHttpRequest(); 请求方式 : get向服务器获取数据…

RNN架构解析——认识RNN模型

目录 RNN模型作用分类按照输入和输出的结构进行分类按照RNN的内部构造进行分类 RNN模型 RNN单层网络结构 作用 分类 按照输入和输出的结构进行分类 按照RNN的内部构造进行分类

臻图信息以数字孪生赋能智慧文旅新发展

随着AI、元宇宙的热度持续攀升&#xff0c;以及中共中央办公厅、国务院办公厅此前印发了《“十四五”文化发展规划》、《关于推进实施国家文化数字化战略的意见》等重要文件&#xff0c;要求各地区各部门发挥好对产业的引导、扶持和监管作用。 数字孪生作为元宇宙建设的基石&am…

系统架构设计师-软件架构设计(4)

目录 一、软件架构评估 1、敏感点 2、权衡点 3、风险点 4、非风险点 5、架构评估方法 5.1 基于调查问卷或检查表的方式 5.2 基于度量的方式 5.3 基于场景的方式 6、基于场景的评估方法 6.1 软件架构分析法&#xff08;SAAM&#xff09; 6.2 架构权衡分析法&#xff08;ATAM&am…

【CAS6.6源码解析】源码构建时-默认service配置不生效解决方案

CAS6的源码提供了默认的HTTPSandIMAPS-10000001.json配置用于授权所有的https和imaps服务&#xff0c;但是当添加JsonServiceRegistry模块启动后&#xff0c;会发现service是没有被注册的&#xff0c;是由于json路径引起的错误&#xff0c;可以把路径修改为绝对路径以解决此问题…

支付宝原生小程序组件与父级传递数据(微信小程序基本一样)

1. 声明组件 在对应的目录下,右击点击 新建小程序,之后会生成对应的文件 2. 子组件 Component({data: {colorList: [#165FF6, #3D16F6,

vue3+ts+elementui-plus二次封装弹框

一、弹框组件BaseDialog <template><div classmain><el-dialog v-model"visible" :title"title" :width"dialogWidth" :before-close"handleClose"><!-- 内容插槽 --><slot></slot><template…

Go基础—反射,性能和灵活性的双刃剑

Go基础—反射&#xff0c;性能和灵活性的双刃剑 1 简介2 结构体成员赋值对比3 结构体成员搜索并赋值对比4 调用函数对比5 基准测试结果对比 1 简介 现在的一些流行设计思想需要建立在反射基础上&#xff0c;如控制反转&#xff08;Inversion Of Control&#xff0c;IOC&#x…

基于Spring包扫描工具和MybatisPlus逆向工程组件的数据表自动同步机制

公司产品产出的项目较多。同步数据库表结构工作很麻烦。一个alter语句要跑到N个客户机上执行脚本。超级费时麻烦。介于此&#xff0c;原有方案是把增量脚本放到一resource包下&#xff0c;项目启动时执行逐行执行一次。但由于模块开发人员较多&#xff0c;总有那么一两个机灵鬼…

【运维】DevOps全流程笔记(未完成)

运维笔记 DevOps基本流程Code阶段工具&#xff08;gitlab安装&#xff09;Build阶段工具&#xff08;Maven安装&#xff09;Integrate阶段工具JenkinsJenkins介绍Jenkins安装Jenkins入门配置 CI/CD操作集成Sonar Qube集成HarborJenkins流水线Kubernetes编排工具 DevOps全流程笔…

1400*C. Strong Password

Example input 5 88005553535123456 2 50 56 123412341234 3 111 444 1234 4 4321 4321 459 2 49 59 00010 2 10 11output YES NO YES NO YES解析&#xff1a; 题目要求有一种密码不在数据库中即可&#xff0c;所以枚举每一位的所有可能的数字&#xff0c;记录这一位数字在数…