ARM day8 key1/2/3led

news2025/1/15 21:55:29

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;
}

 

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

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

相关文章

D. Maximum Subarray

Problem - 1796D - Codeforces 思路&#xff1a;想了个假dp做法推了半天&#xff0c;果然是dp。考虑用dp[i][j]表示以i结尾的&#xff0c;并且选择j个&#xff0b;x的最长连续子序列&#xff0c;那么如果我不选择第i位&#xff0c;那么会有f[i][j]max(w[i]-x,f[i-1][j]w[i]-x)&…

理解基本的Android编程(2/2)

6、Android Activity 活动代表了一个具有用户界面的单一屏幕&#xff0c;如 Java 的窗口或者帧。 如果你曾经用 C,C 或者 Java 语言编程&#xff0c;你应该知道这些程序从 main() 函数开始。很类似的&#xff0c;Android 系统初始化它的程序是通过活动中的 onCreate() 回调的…

IO进程线程day2(2023.7.26)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;全缓冲 //由于编译器优化&#xff0c;只打开不操作&#xff0c;此时不会真正申请缓冲区。 fputc(a, fp); printf("%ld\n", fp->_IO_buf_end - fp->_IO_buf_base ); 刷新条件&#xff…

[算法很美打卡] 多维数组篇 (打卡第一天)

文章目录 顺时针打印二维数组0所在的行列清零 顺时针打印二维数组 package 每日算法学习打卡.算法打卡.七月份.七月二十六号;public class test1 {public static void main(String[] args) {int[][] matrix {{1,2},{5,6},{9,10},{13,14},};print(matrix);}static void print(i…

⛳ 面向对象面试题

面向对象面试题目录 ⛳ 面向对象面试题&#x1f69c; 一&#xff0c;成员变量&#xff0c;局部变量&#xff0c;类变量存储在内存的什么地方&#xff1f;&#x1f43e; 1.1&#xff0c;类变量&#xff08;静态成员变量&#xff09;&#x1f4dd; 1.2&#xff0c;成员变量⭐ 1.3…

代码随想录算法训练营第59天|503 42

503 我的思路是既然是循环数组 那就最多遍历两圈 其他的跟单调栈写法一模一样 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);if (nums.size()1) return result;stack<int>…

HttpRunner自动化测试之响应中文乱码处理

响应中文乱码&#xff1a; 当调用接口&#xff0c;响应正文返回的中文是乱码时&#xff0c;一般是响应正文的编码格式不为 utf-8 导致&#xff0c;此时需要根据实际的编码格式处理 示例&#xff1a; 图1中 extract 提取title标题&#xff0c;output 输出 title 变量值&#x…

yolov8系列[五]-项目实战-yolov8模型无人机检测

yolov8系列[五]-项目实战-yolov8模型无人机检测 项目介绍项目展示功能简介代码结构如何启动 开发者模式1. 安装依赖环境2. 启动程序 源代码下载其他 项目介绍 无人机识别项目,无人机搭载nvidia jetson边缘计算板子,进行实时识别。使用yolov8算法&#xff0c;训练了识别无人机的…

leetcode 1870. Minimum Speed to Arrive on Time(准时到达的最小速度)

需要找一个speed, 使得dist[i] / speed 加起来的时间 < hour, 而且如果前一个dist[i] / speed求出来的是小数&#xff0c;必须等到下一个整数时间才计算下一个。 speed最大不会超过107. 不存在speed满足条件时返回-1. 思路&#xff1a; 如果前一个dist[i] / speed求出来的…

【万字详解】Linux进程信号||一文搞定进程信号||附测试代码

进程信号 &#x1f373;信号理解&#x1f9c8;什么是信号&#xff1f;&#x1f95e;进程信号&#x1f953;查看系统信号&#x1f969;在技术角度理解信号&#x1f357;注意 &#x1f356;信号处理&#x1f9c7;信号异步机制 &#x1f354;信号产生&#x1f35f;通过终端按键产生…

【CSS】手写 Tooltip 提示组件

文章目录 效果示例代码实现 效果示例 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>一颗不甘坠落的流星</title><style>body {padding: 120px;}.tooltip {position: relative;display: inline-blo…

Wish入驻防封指南——附最新运营要点

近日来&#xff0c;跨境电商平台Wish有了新改革&#xff0c;为提高产品质量把控效率&#xff0c;Wish最近将入驻机制又完全开放转变为“邀请制”&#xff0c;加强了品控措施&#xff0c;也意味着商家入驻门槛变高&#xff0c;流程与之前截然不同。但对于已有跨境电商经验/没有跨…

剑指offer12 矩阵中的路径 13 机器人的运动范围 34.二叉树中和为某一值得路径

class Solution { public:bool exist(vector<vector<char>>& board, string word) {int rowboard.size(),colboard[0].size();int index0,i0,j0;if(word.size()>row*col) return 0;//vector<vector<int>> visit[row][col];//标记当前位置有没有…

ES6: 对象简写/symbol()/ Iterator/set/map/await.......

对象简写 对象名字为变量 复制对象/还有个assign方法 symbol() 这种写法用户怎么添加属性都ok 获取属性,这个方法获取symbol属性 获取属性,这个方法获取symbol和普通属性 Iterator 比较复杂,可以看视频 有迭代器的可用for..of循环 012-ES6-Iterator_哔哩哔哩_bilibili Set 它…

安防监控视频汇聚平台EasyCVR修改录像计划等待时间较长是什么原因?

安防监控视频EasyCVR视频融合汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检…

【UE5 多人联机教程】05-更改角色颜色

效果 步骤 1. 打开“BP_ThirdPersonCharacter”&#xff0c;找到角色的材质 创建材质实例 2. 在“BP_ThirdPersonCharacter”中新建一个整型变量&#xff0c;命名为“PlayerColorIndex” 勾选可编辑实例、生成时公开&#xff0c;复制选择“RepNotify” 复制选择“RepNotify”…

7.26 作业 QT

1.继续完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中&#xff1a; 结果图&#xff1a; second.h: #define SECOND_H#include <QWidget> #include<QDebug> //信息调试类&#xff0c;用于打印输出的 #inc…

学C的第三十天【自定义类型:结构体、枚举、联合】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第二十九天【字符串函数和内存函数的介绍&#xff08;二&#xff09;】_高高的胖子的博客-CSDN博客 1 . 结构体 &#xff08;1&#xff09;. 结构体的基础知识&#xff1a; 结构…

docker-compose yml配置、常用命令

下载完docker-compose后&#xff0c;如果想使用docker-compose命令开头&#xff0c;需要创建软连接 sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose 1.docker-compose.yml文件编排 一个 docker-compose.yml 文件的顶层元素有&#xff…

线程的同步

一、互斥锁 java语言中&#xff0c;引入了对象互斥锁的概念&#xff0c;来保证共享数据操作的完整性。每个对象都对应与一个可称为“互斥锁”的标记&#xff0c;这个标记用来保证在任一时刻&#xff0c;只能有 一个线程访问该对象。关键字synchronized用来与对象的互斥锁联系。…