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

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.中断实验&#xff1a;按键控制led灯 流程&#xff1a; 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...

浅谈开发过程中完善的注释的重要性

第一部分&#xff1a;引言 1.1 简述编程注释的定义和功能 编程注释是一种在源代码中添加的辅助性文字&#xff0c;它不参与编译或执行&#xff0c;但对于理解源代码起着至关重要的作用。注释可以简单地描述代码的功能&#xff0c;也可以详细地解释算法的工作原理、设计决策的…...

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 是一个非常有用的工具&#xff0c;我们可以在浏览器中任意编辑调试我们的python代码&#xff0c;并且支持markdown 语法&#xff0c;可以说是科研利器。但是这种情况适合个人使用&#xff0c;也就是jupyter notebook以我们自己的主机作为服务器…...

【MySQL】视图

目录 一、什么是视图 二、视图的操作 2.1 创建视图 2.2 删除视图 三、视图规则和限制 一、什么是视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff08;创建视图所…...

基于 Android 剧院购票APP的开发与设计

摘要&#xff1a;近年来&#xff0c;随着社会的发展和科技方面的创新&#xff0c;越来越多的人选择使用手机应用程序来购买剧场票。本文将探讨基于 Android 平台的剧院购票应用程序的开发和设计。该应用程序将为用户提供浏览剧场列表、查看剧场详情、选择座位并购买剧场票的功能…...

反转链表II

江湖一笑浪滔滔&#xff0c;红尘尽忘了 题目 示例 思路 链表这部分的题&#xff0c;不少都离不开单链表的反转&#xff0c;参考&#xff1a;反转一个单链表 这道题加上哨兵位的话会简单很多&#xff0c;如果不加的话&#xff0c;还需要分情况一下&#xff0c;像是从头节点开始…...

HTML 和 CSS 来实现毛玻璃效果(Glassmorphism)

毛玻璃效果简介 它的主要特征就是半透明的背景&#xff0c;以及阴影和边框。 同时还要为背景加上模糊效果&#xff0c;使得背景之后的元素根据自身内容产生漂亮的“变形”效果&#xff0c;示例&#xff1a; 代码实现 首先&#xff0c;创建一个 HTML 文件&#xff0c;写入如下…...

【技术】国标GB28181视频平台EasyGBS通过对应密钥上传到其他平台展示的详细步骤

国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台&#xff0c;支持多路设备同时接入&#xff0c;并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…...

SpeedBI数据可视化工具:浏览器上做分析

SpeedBI数据分析云是一种在浏览器上进行数据可视化分析的工具&#xff0c;它能够将数据以可视化的形式呈现出来&#xff0c;并支持多种数据源和图表类型。 所有操作&#xff0c;均在浏览器上进行 在浏览器中打开SpeedBI数据分析云官网&#xff0c;点击【免费使用】进入&#…...

8.21笔记

Deeplab-MSc-LargrFOC 此图除了主输出之外&#xff0c;还有五个支线输出&#xff0c;他们池化层与VGG网络不同&#xff0c;其中卷积核大小是3&#xff0c;而VGG中卷积核大小为2&#xff08;这个网络一开始是基于VGG网络提出的&#xff0c;因为那时候提出比较早&#xff0c;没有…...

MyBatis-Plus中公共字段的统一处理

数据库中一些表的公共字段&#xff0c;例如修改时间、修改人、创建时间、创建人&#xff0c;我们一般都是这样来处理的&#xff1a; employee.setCreateTime(LocalDateTime.now()); employee.setUpdateTime(LocalDateTime.now()); employee.setCreateUser(UserHolder.get()); …...

SQL的导出与导入

1、导入 使用命令行导入 1.登录sql界面&#xff1b; 2.create database Demo新建一个库&#xff1b; 3.选中数据库use Demo&#xff1b;选中导入路径source D:Demo.sql; 4.查看表show tables; 2、导出 整个sql mysqldump -u username -ppassword dbname > dbname.sq…...

记录一次wordpress项目的发布过程

背景&#xff1a;发布一套已完成的代码到线上&#xff0c;有完整的代码包&#xff0c;sql文件&#xff0c;环境是linux 宝塔。无wordpress相关经验。 过程&#xff1a;正常的发布代码 问题1&#xff1a;访问自己的域名后跳转到别的域名。 解决&#xff1a; 修改数据表wp_optio…...

HTML详解连载(8)

HTML详解连载&#xff08;8&#xff09; 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽浮动-产品区域布局场景 解决方法清除浮动方法一&#xff1a;额外标签发方法二&#xff1a;单伪元素法方法三&#xff1a;双伪元素法方法四&#xff1a;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…...

主程技术分享: 游戏项目帧同步,状态同步如何选

网络游戏开发项目中帧同步,状态同步如何选&#xff1f; 网络游戏的核心技术之一就是玩家的网络同步,主流的网络同步有”帧同步”与”状态同步”。今天我们来分析一下这两种同步模式。同时教大家如何在自己的项目中采用最合适的同步方式。接下来从以下3个方面来阐述: 对啦&…...

ChatGPT-4: 半年的深度使用思考

几个月的时间一直在使用 ChatGpt-4&#xff0c;以口述语音转文字的形式说一下自己的体会。 1、选择版本 大前提&#xff1a;我使用的都是 GPT4 的版本。也就是说至少每个月要付费20$。 因为 3.5 的版本&#xff0c;实际上使用体验是非常差的&#xff0c;主要体现在答非所问上。…...

【健康医疗】Axure用药提醒小程序原型图,健康管理用药助手原型模板

作品概况 页面数量&#xff1a;共 20 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;健康管理&#xff0c;用药助手 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为「用药提醒」小程序原型图…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项&#xff0c;设置文件夹共享为总是启用&#xff0c;点击添加&#xff0c;可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download&#xff08;这是我共享的文件夹&#xff09;&…...

华为OD机考- 简单的自动曝光/平均像素

import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…...