当前位置: 首页 > 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函数…...

动态规划:从贝尔曼的智慧到算法竞赛的基石

引言在算法设计的广阔天地中&#xff0c;动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;无疑是一颗璀璨的明星。它既不像二分查找那样简洁直接&#xff0c;也不似深度优先搜索那样易于直觉理解&#xff0c;而是以一种近乎“魔法”的方式&#xff0c;将…...

SecGPT-14B知识库增强:让OpenClaw支持最新CVE漏洞库

SecGPT-14B知识库增强&#xff1a;让OpenClaw支持最新CVE漏洞库 1. 为什么需要给OpenClaw注入CVE知识库 去年处理Log4j2漏洞时&#xff0c;我遇到了一个尴尬场景&#xff1a;当我让OpenClaw帮我检查服务器是否存在CVE-2021-44228漏洞时&#xff0c;它给出的回答是"未找到…...

Arduino轻量级CLI库cmdArduino原理与实战

1. 项目概述cmdArduino 是一个面向 Arduino 平台的轻量级命令行接口&#xff08;CLI&#xff09;库&#xff0c;由 Freaklabs 团队的 Akiba 与 Jacinta 开发。其核心定位并非构建功能完备的嵌入式 Shell&#xff08;如 BusyBox 或 MicroPython REPL&#xff09;&#xff0c;而是…...

锁相双极性PWM电机驱动原理与STM32实现

1. 项目概述Motor_LockedAntiphase是一个面向嵌入式电机控制的轻量级驱动库&#xff0c;专为实现锁相双极性PWM&#xff08;Locked Antiphase PWM&#xff09;控制模式而设计。该模式广泛应用于直流有刷电机&#xff08;DC Brushed Motor&#xff09;的双向调速与精确力矩控制场…...

XUnity.AutoTranslator:为Unity游戏开启多语言世界的智能钥匙

XUnity.AutoTranslator&#xff1a;为Unity游戏开启多语言世界的智能钥匙 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当游戏语言成为障碍&#xff1a;一个翻译插件的诞生背景 你是否曾经遇到过这样的…...

Linux内核中的命名空间技术详解

Linux内核中的命名空间技术详解 引言 命名空间&#xff08;Namespaces&#xff09;是Linux内核中用于隔离系统资源的机制。它允许在同一台主机上运行多个相互隔离的环境&#xff0c;每个环境都有自己独立的资源视图。命名空间是容器技术的核心组件之一&#xff0c;与cgroups配合…...

终极魔兽争霸3性能优化指南:从卡顿到180帧的完整解决方案

终极魔兽争霸3性能优化指南&#xff1a;从卡顿到180帧的完整解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经典RTS游戏&#…...

彻底解决AMD显卡风扇控制失效:FanControl ADLXWrapper初始化失败的终极修复指南

彻底解决AMD显卡风扇控制失效&#xff1a;FanControl ADLXWrapper初始化失败的终极修复指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcod…...

两相交错并联同步整流双向Buck Boost变换器仿真研究

两相交错并联同步整流双向Buck Boost变换器仿真 所有开关管均可实现ZVs软开关 Buck模式 输入&#xff1a;200-360VDC 额定280VDC 输出&#xff1a;140VDC 10A 开关频率&#xff1a;10kHz Boost模式&#xff1a; 输入&#xff1a;120-160VDC 额定140VDC 输出&#xff1a;280VDC…...

C语言的初步认识

大家好&#xff01;我是河南计算机专业的一名大一学生&#xff0c;很高兴今天加入博客大团体并写下我人生中的第一篇博客&#xff0c;在此我将会记录我大学中的编程生活。1.函数函数是C语言的基本组成单位&#xff0c;初识C语言&#xff0c;我们遇见的第一个函数是main函数&…...