ARM day9 (按键中断控制led亮灭)

news2024/9/25 13:25:42

key.h

#ifndef __KEY_H__
#define __KEY_H__

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


//事件号
#define EXTI_7 7
#define EXTI_8 8
#define EXTI_9 9

//中断号
#define EXTI7 97
#define EXTI8 98
#define EXTI9 99

//key_exit初始化
void hal_key_exti_init(volatile unsigned int exti,gpio_t* gpiox,volatile unsigned int* style);

//key_gic初始化
void hal_key_gic_init(unsigned int extid);

/********LED*章节*********/
//寄存器的模型
typedef enum{
	INPUT,  	//输入 0
	OUTPUT,   	//输出 1 
	ALT, 		//2
	ANALOG, 	//3
}gpio_moder_t;
//寄存器输出类型
typedef enum{
	PP, 	//推挽 0
	OD, 	//开漏 1
}gpio_otyper_t;
//寄存器数据输出速率
typedef enum{
	LOW, 	//低速 00
	MED, 	//中速 01
	HIGH, 	//高速 10
	HIGHEST,//超高速 11
}gpio_ospeedr_t;
//上下拉电阻寄存器
typedef enum{
	NO_PUPDR, 	//禁止 0
	PU,  		//上拉 1
	PD, 		//下拉 2
}gpio_pupdr_t;

//高低电平
typedef enum{
	GPIO_RESET_T,  	//低电平 0
	GPIO_SET_T, 	//高电平 1
}gpio_odr_t;

typedef struct{
	gpio_moder_t moder; 	//引脚模式
	gpio_otyper_t otyper; 	//输出类型
	gpio_ospeedr_t ospeedr; //输出速度
	gpio_pupdr_t pupdr; 	//是否上下拉
}gpio_init_t;


//LED_GPIO初始化
void hal_led_gpio_init(gpio_t* gpiox,unsigned int pin,gpio_init_t* init);

//LED_操作
void operate_led(gpio_t* gpiox,unsigned int pin);

//LED_ON
void turn_on(gpio_t* gpiox,unsigned int pin);

//LED_OFF
void turn_off(gpio_t* gpiox,unsigned int pin);

#endif

key.c

#include "key.h"
extern void delay_ms(int ms);

//key_exit初始化
void hal_key_exti_init(unsigned int exti,gpio_t* gpiox,volatile unsigned int* style)
{
	//   RCC章节初始化
	//  1.GPIO使能
	//
	//unsigned int a = (unsigned int)(gpiox - GPIOA)/256;

	RCC->MP_AHB4ENSETR |= (0x1 << 5);

	//    GPIO章节初始化GPIOF_MODER
	gpiox->MODER &= (~(0x3 << exti*2));

	//   EXTI章节初始化 
	//2.设置EXTI选择寄存器 EXTI_EXITCRx
	*(&(EXTI->EXTICR1) + (exti/4)) &= (~(0xff << (exti%4)*8)); 
	*(&(EXTI->EXTICR1) + (exti/4)) |= (5 << (exti%4)*8);
	/*	

		switch(exti/4)
		{
		case 1:
		EXTI->EXTICR2 &= (~(0xff << (exti%4)*8));
		EXTI->EXTICR2 |= (0x5 << (exti%4)*8);
		break;
		case 2:
		EXTI->EXTICR3 &= (~(0xff << (exti%4)*8));
		EXTI->EXTICR3 |= (0x5 << (exti%4)*8);
		break;
		case 3:
		EXTI->EXTICR4 &= (~(0xff << (exti%4)*8));
		EXTI->EXTICR4 |= (0x5 << (exti%4)*8);
		break;
		}
		*/
	//2.设置中断通信为下降沿触发EXTI_FTSR1
	*style |= (0x1 << exti);

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

//key_gic初始化
void hal_key_gic_init(unsigned int extid)
{

	//       GICD章节初始化
	//1.设置GICD层组控制器使能
	GICD->CTRL |= 0x1;

	//2.设置GICD层中断设置使能寄存器
	GICD->ISENABLER[extid/32] |= (0x1 << extid%32);

	//3.设置GICD层中断优先级寄存器
	GICD->IPRIORITYR[extid/4] &= (~(0x1f << ((extid%4)*8+3)));

	//4.设置GICD层中断目标分配寄存器
	GICD->ITARGETSR[extid/4] &= (~(0x3 << (extid%4)*8));
	GICD->ITARGETSR[extid/4] |= (0x1 << (extid%4)*8);

	//       GICC章节初始化
	//1.设置GICC层控制使能寄存器
	GICC->CTRL |= (0x1 << 0);

	//2.设置GICC层中断优先级寄存器
	GICC->PMR |= (0x1f << 3);

}




/********LED*章节*********/
//LED_GPIO初始化
void hal_led_gpio_init(gpio_t* gpiox,unsigned int pin,gpio_init_t* init)
{
	// moder; 	//引脚模式
	gpiox->MODER &= (~(0x3  << pin*2));
	gpiox->MODER |= (init->moder << pin*2);

	// otyper; 	//输出类型
	gpiox->OTYPER &= (~(0x1 << pin));
	gpiox->OTYPER |= (init->otyper << pin);


	// ospeedr; //输出速度
	gpiox->OSPEEDR &= (~(0x3 << pin));
	gpiox->OSPEEDR |= (init->ospeedr << pin*2 );


	// pupdr; 	//是否上下拉
	gpiox->PUPDR &= (~(0x3 << pin*2));
	gpiox->PUPDR |= (init->pupdr << pin*2);

}

//LED_操作
void operate_led(gpio_t* gpiox,unsigned int pin)
{
	if((gpiox->ODR & (0x1 << pin)) == 0)
	{
		turn_on(gpiox,pin);
	}
	else
	{
		turn_off(gpiox,pin);
	}
}

//LED_ON
void turn_on(gpio_t* gpiox,unsigned int pin)
{
	gpiox->ODR |= (0x1 << pin);
}

//LED_OFF
void turn_off(gpio_t* gpiox,unsigned int pin)
{
	gpiox->ODR &= (~(0x1 << pin));
}



do_irq.c

#include "key.h"

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

	//判断中断号
	//99--->KEY1
	//98--->KEY3
	//97--->KEY2

	switch(num)
	{
	case 97:
		printf("key2 pressed!!!!!!\n");
		//LED2
		operate_led(GPIOF,10);
		//1.消除EXTI层中断挂起标志位 FPR1 [9] = 1
		EXTI->FPR1 |= (0x1 << 7);
		//2.消除GICD层中断挂起标志位 ICPENDR[3] |= (0x1 << 3) 
		GICD->ICPENDR[num/32] |= (0x1 << (num%32));
		break;
	case 98:
		printf("key3 pressed!!!!!!\n");
		//LED1
		operate_led(GPIOE,10);
		//1.消除EXTI层中断挂起标志位 FPR1 [9] = 1
		EXTI->FPR1 |= (0x1 << 8);
		//2.消除GICD层中断挂起标志位 ICPENDR[3] |= (0x1 << 3) 
		GICD->ICPENDR[num/32] |= (0x1 << (num%32));
		break;
	case 99:
		printf("key1 pressed!!!!!!\n");
		//LED3
		operate_led(GPIOE,8);
		//1.消除EXTI层中断挂起标志位 FPR1 [9] = 1
		EXTI->FPR1 |= (0x1 << 9);
		//2.消除GICD层中断挂起标志位 ICPENDR[3] |= (0x1 << 3) 
		GICD->ICPENDR[num/32] |= (0x1 << (num%32));
		break;
	}
	//3.消除GICC层挂起标志位
	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 hal_exti_init()
{
	hal_key_exti_init(EXTI_7,GPIOF,&EXTI->FTSR1);
	hal_key_exti_init(EXTI_8,GPIOF,&EXTI->FTSR1);
	hal_key_exti_init(EXTI_9,GPIOF,&EXTI->FTSR1);
}

void hal_gic_init()
{
	hal_key_gic_init(EXTI7);
	hal_key_gic_init(EXTI8);
	hal_key_gic_init(EXTI9);
}
void hal_led_init()
{
	//RCC使能
	RCC->MP_AHB4ENSETR |= (0x3 << 4);
	//设定init
	gpio_init_t init = {OUTPUT,PP,LOW,NO_PUPDR};

	//LED1 PE10
	hal_led_gpio_init(GPIOE,10,&init);
	//LED2 PF10
	hal_led_gpio_init(GPIOF,10,&init);
	//LED3 PE8
	hal_led_gpio_init(GPIOE,8,&init);
}

int main()
{
	//exti初始化
	hal_exti_init();

	//gic初始化
	hal_gic_init();

	//led初始化
	hal_led_init();

	hal_put_string("KEY TEXT READY\n");
	while(1){}
	return 0;
}

 

 

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

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

相关文章

特征选择算法 | Matlab实现基于ReliefF特征选择算法的分类数据特征选择 ReliefF

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab实现基于ReliefF特征选择算法的分类数据特征选择 ReliefF 部分源码 %--------------------

机器学习基础之《特征工程(2)—特征工程介绍、特征抽取》

一、什么是特征工程 机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ” 注&#xff1a;业界广泛流传&#xff1a;数据和特…

看完这篇 教你玩转渗透测试靶机Vulnhub——Hackable: III

Vulnhub靶机hackableII渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;端口敲门&#xff1a;③&#xff1a;SSH暴力破解&#xff1a;④&am…

java入门概念个人理解之package与import浅析

java入门概念个人理解之package与import浅析 由于近来学习java&#xff0c;遇到了一些在c上没有的概念&#xff0c;将它记http://录下&#xff0c;以自己复习使用&#xff0c;如有不理解妥之处&#xff0c;望大家批评指导。资料均由网上经过自己整合理解而来&#xff0c;如有侵…

Permission denied (publickey,password)问题的解决办法

[15:29:00.146] Terminal shell path: C:\WINDOWS\System32\cmd.exe [15:29:01.703] > root59.110.21.45: Permission denied (publickey,password). 解决&#xff1a; RSA key 登录方法/home/user/ 目录下建立 .ssh/ 文件夹 cd ~/ mkdir .ssh # 注意.ssh文件夹的权限 ch…

STM32+PWM+输入捕获测频

外部时钟&#xff0c;主频64M 定时器1 通道1发出PWM波 频率1K 定时器2 通道1输入捕获&#xff0c;上升沿触发 串口 /* USER CODE BEGIN 0 */ uint32_t time_up_num0;//上升沿计数 float time_frequency;//频率 /* USER CODE END 0 */ 初始换打开定时器 /* USER CODE BEGIN 2 …

ubuntu系统字体太小调整方法,亲测有效,2分钟解决!

背景&#xff1a;我们在ubuntu系统下写程序时&#xff0c;文件夹及文档的字体太小&#xff0c;看起来很累眼&#xff0c;现将字体调大方法记录如下&#xff0c;只需2分钟即可解决&#xff01;&#xff01; 1、打开终端&#xff0c;安装gnome-tweaks sudo apt install gnome-t…

express框架使用express-generator工具

1.全局安装 npm install -g express-generator 2.检测是否安装成功 express -h 3. 快速创建Express应用程序的工具 express -e express-generator 说明&#xff1a;express-e和express-generator都是用于快速创建Express应用程序的工具。express-e是一个命令行工具&#xff0…

基于深度学习的高精度球场足球检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度球场足球检测识别系统可用于日常生活中或野外来检测与定位球场足球目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的球场足球目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

什么是操作系统

操作系统&#xff08;Operating System&#xff09; 什么是操作系统 操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有&#xff1a;Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等 操作系统的定位 操作系统的基本功能 操作系统由…

【报告】从GLM-130B到ChatGLM:大模型预训练与微调学习记录

本文主要是记录《【报告】从GLM-130B到ChatGLM&#xff1a;大模型预训练与微调》此次讲座的汇报内容&#xff0c;如有不适请联系删除即可&#xff0c;总结记录内容纯粹为了后面学习使用方便&#xff0c;文档性质的资料还是要比看视频更加方便的。

将Json结构展平

前言 技术群里面一个哥们在群里提了一个问题&#xff0c;怎么把Json的树形结构展平成一层 在线Json格式化工具 将这个JSON 展平成这样 代码 使用方法 static void Main(string[] args) {//将测试对象转换成测试Jsonvar json JsonConvert.SerializeObject(new{Id 1,Name …

【数据分析 - 基础入门之NumPy⑤】NumPy基本操作 - 二

知识目录 前言一、聚合函数二、矩阵操作2.1 算术运算2.2 线性代数2.3 其他数学操作 三、广播机制3.1 广播的原则3.2 案例 四、排序五、文件操作结语相关导读 前言 大家好&#xff01;本期给大家带来的是【数据分析 - 基础入门之NumPy⑤】NumPy基本操作 - 二&#xff0c;收录于…

t113i不查网线启动,内核[ cut here ]崩溃问题解决

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.SDK T113-i_v1.0 3.单板 迅龙TLT113-EVM-A1.1-000 自制底板 # 一、现象 插上网线启动&#xff0c;内核打印信息正常 不插网线启动&#xff0c;内核存在CPU崩溃打印[ cut here ] 二、问题根因 根据错误…

超详细JDK下载与安装步骤

目录 一、创建软件文件夹 二、安装软件 三、配置环境变量 四、 测试环境变量 一、创建软件文件夹 c盘目录创建devloop/Java/jdk1.8文件夹和devloop/Java/jre1.8文件夹 二、安装软件 打开jdk安装包 选择下一步 三、配置环境变量 右击此电脑&#xff0c;点击属性 点击高级系…

leetcode 513. 找树左下角的值

2023.7.7 题意要求是最底层的节点&#xff0c;则用层序遍历是最合适的&#xff0c;每一层遍历将元素放入一个数组中&#xff0c;等到最后一层遍历完之后&#xff0c;取这个数组的第一个元素即为所求节点值。 下面上代码&#xff1a; class Solution { public:int findBottomLe…

OpenCV在一张图片上以不同的透明度添加另一张图片

// 包含必要的OpenCV头文件 #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv;// 定义全局变量 #define WINDOW_NAME "线

ACL 2023|如何智能生成吸引人又符合实际的标题?

夕小瑶科技说 原创 作者 | 小戏、Python 标题生成&#xff0c;乍一看似乎并不是一个复杂的任务&#xff0c;要数据简单的爬虫就可以获得许多标题-文本对&#xff0c;要评价通过用户点击与浏览的次数就多少可以区分“好标题”与“坏标题”&#xff0c;万事俱备使用一些经典的监…

Tomcat安装与配置(详细教程)

一、安装Tomcat服务器 1.下载地址&#xff08;Tomcat官网&#xff09;http://tomcat.apache.org/ 2.将下载的zip文件解压到指定的目录&#xff08;例如&#xff1a;D盘&#xff0c;目录不要有中文&#xff09; D:\apache-tomcat-9.0.43 二、配置Tomcat环境变量 &#xff08;…

Scrap爬虫框架集成Selenium来解析动态网页

1、爬虫项目单独使用scrpay框架的不足 当前网站普遍采用了javascript 动态页面&#xff0c;特别是vue与react的普及&#xff0c;使用scrapy框架定位动态网页元素十分困难&#xff0c;而selenium是最流行的浏览器自动化工具&#xff0c;可以模拟浏览器来操作网页&#xff0c;解…