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函数…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
