arm: day8
1.中断实验:按键控制led灯
流程:

key.h
/*************************************************************************> File Name: include/key.h> Created Time: 2023年08月21日 星期一 17时03分20秒************************************************************************/#ifndef __KEY_H__
#define __KEY_H__//引脚编号封装
#define EXTI7 7
#define EXTI8 8
#define EXTI9 9#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
#define GPIO_PIN_11 11
#define GPIO_PIN_12 12
#define GPIO_PIN_13 13
#define GPIO_PIN_14 14
#define GPIO_PIN_15 15#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gic.h"typedef enum{FALL_DIS, //禁用下降沿 0FALL_EN //启用下降沿 1
}exti_ftsr1_t;//RCC/GPIO/EXTI章节初始化
void HAL_EXTI_INIT(unsigned int pin, unsigned int gp, exti_ftsr1_t falling);//GIC章节初始化
void HAL_GIC_INIT(unsigned int nod, unsigned int first);//***************点灯***************//
//MODER模式寄存器
typedef enum{INPUT, //输入 0OUPUT, //输出 1ALT, //复用 2ANALOG //模拟 3
}gpio_moder_t;//OTYPER输出类型寄存器
typedef enum{PP, //推挽 0OD //开漏 1
}gpio_otyper_t;//OSPEEDR输出速率寄存器
typedef enum{LOW, //低速 0MED, //中速 1HIGH, //高速 2 VERY_HIGH //快速 3
}gpio_ospeedr_t;//PUPDR是否需要上下拉电阻寄存器
typedef enum{NO_PU_PD, //禁止 0 PU, //上拉 1PD, //下拉 2RES //保留 3
}gpio_pupdr_t;typedef struct{gpio_moder_t moder; //模式寄存器gpio_otyper_t otyper; //输出类型寄存器gpio_ospeedr_t ospeedr; //输出速率寄存器gpio_pupdr_t pupdr; //是否需要上下拉电阻寄存器
}gpio_init_t;//GPIO引脚初始化函数 PE10 PF10 PE8
//void hal_gpio_init(GPIO组编号,引脚编号,初始化的值)
void hal_gpio_initl(gpio_t* gpiox, unsigned int pin, gpio_init_t *gpio_init);//GPIO引脚写操作函数 0:熄灭 1:点亮
//void hal_gpio_write(GPIO组编号,引脚编号,操作的值)
void hal_gpio_writel(gpio_t* gpiox, unsigned int pin);#endif
key.c
/*************************************************************************> File Name: src/key.c> Created Time: 2023年08月21日 星期一 17时03分20秒************************************************************************/#include "key.h"//RCC/GPIO/EXTI章节初始化
void HAL_EXTI_INIT(unsigned int pin, unsigned int gp, exti_ftsr1_t falling)
{//RCC使能GPIOF组 MP_AHB4ENSETR[5] = 1RCC->MP_AHB4ENSETR |= (0x1 << 5);//设置GPIOF引脚模式为输出GPIOF->MODER &= (~(0x3 << (pin*2)));//EXTI外部中断选择GPIOFunsigned int n = pin/4 + 1;switch (n){case 3 :EXTI->EXTICR3 &= (~(0xff << ((pin%4)*8)));EXTI->EXTICR3 |= (gp << ((pin%4)*8));break;case 2:EXTI->EXTICR2 &= (~(0xff << ((pin%4)*8)));EXTI->EXTICR2 |= (gp << ((pin%4)*8));break;}//EXTI事件触发为下降沿EXTI->FTSR1 |= (falling << pin);//EXTI设置不屏蔽 C1IMR1[9] = 1EXTI->C1IMR1 |= (0X1 << pin);}//GIC章节初始化
void HAL_GIC_INIT(unsigned int nod, unsigned int first)
{//1.GICD层//使能GICD层 CTRL[0] = 1GICD->CTRL |= (0x1 << 0);//中断设置使能(99) ISENABLER[3]第3位写1GICD->ISENABLER[nod/32] |= (0X1 << (nod%32));//中断优先级设置 IPRIORITYR[24]第[31:27] = 0b00000GICD->IPRIORITYR[nod/4] &= (~(0x1f << ((nod%4)*8+3)));GICD->IPRIORITYR[nod/4] |= (first << ((nod%4)*8+3));//选择CPU0 ITARGETSR[24]第[25:24] = 0b01GICD->ITARGETSR[nod/4] &= (~(0X3 << ((nod%4)*8)));GICD->ITARGETSR[nod/4] |= (0X1 << ((nod%4)*8));//2.GICC层//使能GICC层 CTRL[0] = 1GICC->CTRL |= (0X1 << 0);//输入中断优先级 PMR[7:3] = 0b11111GICC->PMR |= (0x1f << 3);
}//**************点灯******************//
void hal_gpio_initl(gpio_t* gpiox, unsigned int pin, gpio_init_t *gpio_init)
{//1.设置gpio引脚模式MODER 每两位管理一个引脚gpiox->MODER &= (~(0x3 << (pin * 2)));gpiox->MODER |= (gpio_init->moder << (pin * 2));//2.设置gpio引脚输出类型gpiox->OTYPER &= (~(0x1 << pin));gpiox->OTYPER |= (gpio_init->otyper << pin);//3.设置gpio引脚输出速率gpiox->OSPEEDR &= (~(0x3 << (pin * 2)));gpiox->OSPEEDR |= (gpio_init->ospeedr << (pin * 2));//4.设置gpio引脚禁止上下拉电阻gpiox->PUPDR &= (~(0x3 << (pin * 2)));gpiox->PUPDR |= (gpio_init->pupdr << (pin * 2));
}void hal_gpio_writel(gpio_t* gpiox, unsigned int pin)
{ gpiox->ODR ^= (0x1 << pin);
}
do_lrq.c
#include "key.h"extern void printf(const char *fmt, ...);
unsigned int i = 0;void do_irq(void)
{unsigned int num = 0;//获取中断号num = GICC->IAR & 0X3FF;switch (num){case 99:{printf("***key1***\n");hal_gpio_writel(GPIOE, GPIO_PIN_8);//清除EXTI层挂起标志位EXTI->FPR1 |= (0x1 <<9);//清除GICD层挂起标志位GICD->ICPENDR[3] |= (0X1 <<3);}break;case 97:{printf("***key2***\n");hal_gpio_writel(GPIOF, GPIO_PIN_10);//清除EXTI层挂起标志位EXTI->FPR1 |= (0x1 <<7);//清除GICD层挂起标志位GICD->ICPENDR[3] |= (0X1 <<1);}break;case 98:{printf("***key3***\n");hal_gpio_writel(GPIOE, GPIO_PIN_10);//清除EXTI层挂起标志位EXTI->FPR1 |= (0x1 <<8);//清除GICD层挂起标志位GICD->ICPENDR[3] |= (0X1 <<2);}break;}//清除中断号GICC->EOIR &= (~(0X3FF));GICC->EOIR |= num;
}
main.c
#include "key.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++);
}void led_init()
{//初始化时钟 GPIOE和GPIOF组时钟使能RCC->MP_AHB4ENSETR |= (0x3 << 4);//结构体进行初始化//gpio_init_t init;//init.moder = OUPUT;//init.otyper = PP;//init.ospeedr = LOW;//init.pupdr = NO_PU_PD;gpio_init_t init = {OUPUT, PP, LOW, NO_PU_PD};hal_gpio_initl(GPIOE, GPIO_PIN_10, &init);hal_gpio_initl(GPIOF, GPIO_PIN_10, &init);hal_gpio_initl(GPIOE, GPIO_PIN_8, &init);
}int main()
{led_init();HAL_EXTI_INIT(EXTI9, 0x05, FALL_EN);HAL_EXTI_INIT(EXTI7, 0x05, FALL_EN);HAL_EXTI_INIT(EXTI8, 0x05, FALL_EN);HAL_GIC_INIT(99, 9);HAL_GIC_INIT(97, 7);HAL_GIC_INIT(98, 8);while(1){}return 0;
}
相关文章:
arm: day8
1.中断实验:按键控制led灯 流程: key.h /*************************************************************************> File Name: include/key.h> Created Time: 2023年08月21日 星期一 17时03分20秒***************************************…...
k8s容器加入host解析字段
一、通过edit或path来修改 kubectl edit deploy /xxxxx. x-n cattle-system xxxxx为你的资源对象名称 二、添加字段 三、code hostAliases:- hostnames:- www.rancher.localip: 10.10.2.180...
浅谈开发过程中完善的注释的重要性
第一部分:引言 1.1 简述编程注释的定义和功能 编程注释是一种在源代码中添加的辅助性文字,它不参与编译或执行,但对于理解源代码起着至关重要的作用。注释可以简单地描述代码的功能,也可以详细地解释算法的工作原理、设计决策的…...
Docker 微服务实战
1. 通过IDEA新建一个普通微服务模块 1.1 建Module docker_boot 1.2 改写pom <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…...
JupyterHub实战应用
一、JupyerHub jupyter notebook 是一个非常有用的工具,我们可以在浏览器中任意编辑调试我们的python代码,并且支持markdown 语法,可以说是科研利器。但是这种情况适合个人使用,也就是jupyter notebook以我们自己的主机作为服务器…...
【MySQL】视图
目录 一、什么是视图 二、视图的操作 2.1 创建视图 2.2 删除视图 三、视图规则和限制 一、什么是视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表(创建视图所…...
基于 Android 剧院购票APP的开发与设计
摘要:近年来,随着社会的发展和科技方面的创新,越来越多的人选择使用手机应用程序来购买剧场票。本文将探讨基于 Android 平台的剧院购票应用程序的开发和设计。该应用程序将为用户提供浏览剧场列表、查看剧场详情、选择座位并购买剧场票的功能…...
反转链表II
江湖一笑浪滔滔,红尘尽忘了 题目 示例 思路 链表这部分的题,不少都离不开单链表的反转,参考:反转一个单链表 这道题加上哨兵位的话会简单很多,如果不加的话,还需要分情况一下,像是从头节点开始…...
HTML 和 CSS 来实现毛玻璃效果(Glassmorphism)
毛玻璃效果简介 它的主要特征就是半透明的背景,以及阴影和边框。 同时还要为背景加上模糊效果,使得背景之后的元素根据自身内容产生漂亮的“变形”效果,示例: 代码实现 首先,创建一个 HTML 文件,写入如下…...
【技术】国标GB28181视频平台EasyGBS通过对应密钥上传到其他平台展示的详细步骤
国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台,支持多路设备同时接入,并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…...
SpeedBI数据可视化工具:浏览器上做分析
SpeedBI数据分析云是一种在浏览器上进行数据可视化分析的工具,它能够将数据以可视化的形式呈现出来,并支持多种数据源和图表类型。 所有操作,均在浏览器上进行 在浏览器中打开SpeedBI数据分析云官网,点击【免费使用】进入&#…...
8.21笔记
Deeplab-MSc-LargrFOC 此图除了主输出之外,还有五个支线输出,他们池化层与VGG网络不同,其中卷积核大小是3,而VGG中卷积核大小为2(这个网络一开始是基于VGG网络提出的,因为那时候提出比较早,没有…...
MyBatis-Plus中公共字段的统一处理
数据库中一些表的公共字段,例如修改时间、修改人、创建时间、创建人,我们一般都是这样来处理的: employee.setCreateTime(LocalDateTime.now()); employee.setUpdateTime(LocalDateTime.now()); employee.setCreateUser(UserHolder.get()); …...
SQL的导出与导入
1、导入 使用命令行导入 1.登录sql界面; 2.create database Demo新建一个库; 3.选中数据库use Demo;选中导入路径source D:Demo.sql; 4.查看表show tables; 2、导出 整个sql mysqldump -u username -ppassword dbname > dbname.sq…...
记录一次wordpress项目的发布过程
背景:发布一套已完成的代码到线上,有完整的代码包,sql文件,环境是linux 宝塔。无wordpress相关经验。 过程:正常的发布代码 问题1:访问自己的域名后跳转到别的域名。 解决: 修改数据表wp_optio…...
HTML详解连载(8)
HTML详解连载(8) 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽浮动-产品区域布局场景 解决方法清除浮动方法一:额外标签发方法二:单伪元素法方法三:双伪元素法方法四:overflow浮动-总结…...
Linux系统之安装OneNav个人书签管理器
Linux系统之安装OneNav个人书签管理器 一、OneNav介绍1.OneNav简介2.OneNav特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查本地yum仓库状态 四、安装httpd服务4.1 安装httpd4.2 启动httpd服务4…...
主程技术分享: 游戏项目帧同步,状态同步如何选
网络游戏开发项目中帧同步,状态同步如何选? 网络游戏的核心技术之一就是玩家的网络同步,主流的网络同步有”帧同步”与”状态同步”。今天我们来分析一下这两种同步模式。同时教大家如何在自己的项目中采用最合适的同步方式。接下来从以下3个方面来阐述: 对啦&…...
ChatGPT-4: 半年的深度使用思考
几个月的时间一直在使用 ChatGpt-4,以口述语音转文字的形式说一下自己的体会。 1、选择版本 大前提:我使用的都是 GPT4 的版本。也就是说至少每个月要付费20$。 因为 3.5 的版本,实际上使用体验是非常差的,主要体现在答非所问上。…...
【健康医疗】Axure用药提醒小程序原型图,健康管理用药助手原型模板
作品概况 页面数量:共 20 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:健康管理,用药助手 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本作品为「用药提醒」小程序原型图…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
