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

Unity噪声图生成(编辑器扩展)
最近发现项目里很多shader都需要噪声图,(shadergraph中有自己的噪声图生成)当遇到需要噪声图时去寻找很麻烦,所以从网上查阅资料编写了一个Unity扩展的噪声图生成。 Perlin噪声 Perlin噪声是一种渐变噪声算法,由Ken …...
http-为什么文件上传要转成Base64
# 前言 最近在开发中遇到文件上传采用Base64的方式上传,记得以前刚开始学http上传文件的时候,都是通过content-type为multipart/form-data方式直接上传二进制文件,我们知道都通过网络传输最终只能传输二进制流,所以毫无疑问他们本…...

htmlCSS-----定位
目录 前言 定位 分类和取值 定位的取值 1.相对定位 2.绝对位置 元素居中操作 3.固定定位 前言 今天我们来学习html&CSS中的元素的定位,通过元素的定位我们可以去更好的将盒子放到我们想要的位置,下面就一起来看看吧! 定位 定位posi…...
腾讯云大数据型CVM服务器实例D3和D2处理器CPU型号说明
腾讯云服务器CVM大数据型D3和D2处理器型号,大数据型D3云服务器CPU采用2.5GHz Intel Xeon Cascade Lake 处理器,大数据型D2云服务器CPU采用2.4GHz Intel Xeon Skylake 6148 处理器。腾讯云服务器网分享云服务器CVM大数据型CPU型号、处理器主频性能&#x…...

计算机科学cs/电子信息ei面试准备——数学基础/线性代数复习
1. 中值定理 中值定理是反映函数与导数之间联系的重要定理,也是微积分学的理论基础,在许多方面它都有重要的作用,在进行一些公式推导与定理证明中都有很多应用。中值定理是由众多定理共同构建的,其中拉格朗日中值定理是核心&…...
极速查找(2)-算法分析
篇前小言 本篇文章是对查找(1)的续讲线性索引查找 线性索引查找(Linear Index Search)是一种基于索引的查找算法。它在数据集合中创建一个索引 结构,然后使用该索引结构来加快对目标元素的查找。 线性索引是一种在数…...

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

网络安全系统教程+学习路线(自学笔记)
一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…...
23. 合并 K 个升序链表
题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组…...

Nexus3部署、配置+SpringBoot项目Demo
Docker部署Nexus 搜索Nexus3镜像:[rootlocalhost ~]# docker search nexus 拉取Nexus3镜像:[rootlocalhost ~]# docker pull sonatype/nexus3 启动Nexus3前查看虚拟机端口是否被占用:[rootlocalhost ~]# netstat -nultp 通过Docker Hub查看安…...

linux下用docker安装mysql
1.mysql Docker镜像 docker pull mysql:[版本号 或 latest]例: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模板项目改造:动态获取菜单路由 这里是在此基础上添加了系统管理模块,包含用户管理,角色管理,菜单管理,字典管理…...
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)------保姆级教程
———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动&#x…...

微信小程序 样式和全局配置
WXSS wxss 把屏幕分为750个物理像素,大屏大,小屏小,随着设备不一致自动适配 推荐使用iPhone6作为标准,1个rpx 0.5个px,把px乘以2就是rpx的参数 import 导入外部样式表 import /common/common.wxss 样式 权重一…...
一.初识C语言
一.初识C语言 C语言标准规定: sizeof(long)>sizeof(int)就可以了变量要定义在当前代码块的最前面 #defin _CRT_SECURE_NO_WARNINGS 1#include <stdio.h> //包含一个stdio.h的文件 std-标准standard input outputint main() //主函数-程序的入口-main函数…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...