当前位置: 首页 > news >正文

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]=1GICD->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]=1GICC->CTRL |= (0x1<<0);//1.设置GICC层中断优先级 GICC_PMR[7:3]=11111GICC->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(){//初始化按键key1hal_exit_init(EXTI9,5,Falling);hal_gic_init(99,0x1f);//初始化按键key2hal_exit_init(EXTI7,5,Falling);hal_gic_init(97,0x1c);//初始化按键key3hal_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初始化 PE10hal_gpio_init(GPIOE,GPIO_PIN_10,&led_a);//LED2初始化 PF10hal_gpio_init(GPIOF,GPIO_PIN_10,&led_a);//LED3初始化 PE8hal_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]=0X1EXTI->FPR1 |= (0x1<<7);//清除GICD层中断挂起标志位 GICD_ICPENDR[3] [3]=1GICD->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]=0X1EXTI->FPR1 |= (0x1<<8);//清除GICD层中断挂起标志位 GICD_ICPENDR[3] [3]=1GICD->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]=0X1EXTI->FPR1 |= (0x1<<9);//清除GICD层中断挂起标志位 GICD_ICPENDR[3] [3]=1GICD->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;
}

 

相关文章:

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,…...

windows 系统安装sonarqube

SonarQube是一种自动代码审查工具&#xff0c;用于检测代码中的错误&#xff0c;漏洞和代码异味。它可以与您现有的工作流程集成&#xff0c;以便在项目分支和拉取请求之间进行连续的代码检查。 官方网站&#xff1a; https://www.sonarqube.org/ 1. 使用前提条件 运行SonarQ…...

Unity噪声图生成(编辑器扩展)

最近发现项目里很多shader都需要噪声图&#xff0c;&#xff08;shadergraph中有自己的噪声图生成&#xff09;当遇到需要噪声图时去寻找很麻烦&#xff0c;所以从网上查阅资料编写了一个Unity扩展的噪声图生成。 Perlin噪声 Perlin噪声是一种渐变噪声算法&#xff0c;由Ken …...

http-为什么文件上传要转成Base64

# 前言 最近在开发中遇到文件上传采用Base64的方式上传&#xff0c;记得以前刚开始学http上传文件的时候&#xff0c;都是通过content-type为multipart/form-data方式直接上传二进制文件&#xff0c;我们知道都通过网络传输最终只能传输二进制流&#xff0c;所以毫无疑问他们本…...

htmlCSS-----定位

目录 前言 定位 分类和取值 定位的取值 1.相对定位 2.绝对位置 元素居中操作 3.固定定位 前言 今天我们来学习html&CSS中的元素的定位&#xff0c;通过元素的定位我们可以去更好的将盒子放到我们想要的位置&#xff0c;下面就一起来看看吧&#xff01; 定位 定位posi…...

腾讯云大数据型CVM服务器实例D3和D2处理器CPU型号说明

腾讯云服务器CVM大数据型D3和D2处理器型号&#xff0c;大数据型D3云服务器CPU采用2.5GHz Intel Xeon Cascade Lake 处理器&#xff0c;大数据型D2云服务器CPU采用2.4GHz Intel Xeon Skylake 6148 处理器。腾讯云服务器网分享云服务器CVM大数据型CPU型号、处理器主频性能&#x…...

计算机科学cs/电子信息ei面试准备——数学基础/线性代数复习

1. 中值定理 中值定理是反映函数与导数之间联系的重要定理&#xff0c;也是微积分学的理论基础&#xff0c;在许多方面它都有重要的作用&#xff0c;在进行一些公式推导与定理证明中都有很多应用。中值定理是由众多定理共同构建的&#xff0c;其中拉格朗日中值定理是核心&…...

极速查找(2)-算法分析

篇前小言 本篇文章是对查找&#xff08;1&#xff09;的续讲线性索引查找 线性索引查找&#xff08;Linear Index Search&#xff09;是一种基于索引的查找算法。它在数据集合中创建一个索引 结构&#xff0c;然后使用该索引结构来加快对目标元素的查找。 线性索引是一种在数…...

flask路由添加参数

flask路由添加参数 在 Flask 中&#xff0c;可以通过两种方式在路由中添加参数&#xff1a;在路由字符串中直接指定参数&#xff0c;或者通过 request 对象从请求中获取参数。 在路由字符串中指定参数&#xff1a;可以将参数直接包含在路由字符串中。参数可以是字符串、整数、…...

网络安全系统教程+学习路线(自学笔记)

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…...

23. 合并 K 个升序链表

题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组…...

Nexus3部署、配置+SpringBoot项目Demo

Docker部署Nexus 搜索Nexus3镜像&#xff1a;[rootlocalhost ~]# docker search nexus 拉取Nexus3镜像&#xff1a;[rootlocalhost ~]# docker pull sonatype/nexus3 启动Nexus3前查看虚拟机端口是否被占用&#xff1a;[rootlocalhost ~]# netstat -nultp 通过Docker Hub查看安…...

linux下用docker安装mysql

1.mysql Docker镜像 docker pull mysql:[版本号 或 latest]例&#xff1a;docker pull mysql:5.7 2.查看拉取的docker镜像 docker images3.设置 Docker 卷 docker volume create mysql-data列出 Docker 已知的所有卷 docker volume ls4.运行一个 MySQL Docker 容器 docke…...

Vue - 可视化用户角色、菜单权限、按钮权限配置(动态获取菜单路由)

GitHub Demo 地址 在线预览 前言 关于动态获取路由已在这里给出方案 Vue - vue-admin-template模板项目改造&#xff1a;动态获取菜单路由 这里是在此基础上添加了系统管理模块&#xff0c;包含用户管理&#xff0c;角色管理&#xff0c;菜单管理&#xff0c;字典管理&#xf…...

hive库操作示例

hive库操作示例 1、常规表 创建数据库 CREATE DATABASE mydatabase;使用数据库 USE mydatabase;创建表 CREATE TABLE mytable (id INT,name STRING,age INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;插入数据 INSERT INTO TABLE mytable VALUE…...

LeetCode第 N 个泰波那契数 (认识动态规划)

认识动态规划 编写代码代码空间优化 链接: 第 N 个泰波那契数 编写代码 class Solution { public:int tribonacci(int n) {if(n 0){return 0;}else{if(n 1 || n 2)return 1;}vector<int> dp(n 1);dp[0] 0;dp[1] 1;dp[2] 1;for(int i 3;i < n;i){dp[i] dp[i-3]…...

线程安全问题(内存可见性)

导致的原因 内存可见性问题的出现主要是因为编译器优化多线程导致的 示例代码 package 线程安全问题;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2023-07-26* Time: 13:49*/ public class Demo2 {private volatile sta…...

STM32MX配置EEPROM(AT24C02)------保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…...

微信小程序 样式和全局配置

WXSS wxss 把屏幕分为750个物理像素&#xff0c;大屏大&#xff0c;小屏小&#xff0c;随着设备不一致自动适配 推荐使用iPhone6作为标准&#xff0c;1个rpx 0.5个px&#xff0c;把px乘以2就是rpx的参数 import 导入外部样式表 import /common/common.wxss 样式 权重一…...

一.初识C语言

一.初识C语言 C语言标准规定&#xff1a; sizeof(long)>sizeof(int)就可以了变量要定义在当前代码块的最前面 #defin _CRT_SECURE_NO_WARNINGS 1#include <stdio.h> //包含一个stdio.h的文件 std-标准standard input outputint main() //主函数-程序的入口-main函数…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...