ARM的学习

键控灯

mykey.h

#ifndef __MYKEY_H__
#define __MYKEY_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_exti.h"
void key1_int_config();
void key2_int_config();
void key3_int_config();

#endif

mykey.c

#include "mykey.h"
 
 
void key1_int_config()
{
    //使能GPIO外设时钟
    RCC->MP_AHB4ENSETR |=(0x1<<5);
    //设置PF9为输入
    GPIOF->MODER &=(~(0x3<<18));
    //设置PF9产生EXTI9事件
    EXTI->EXTICR3 &=(~(0xff << 8));
    EXTI->EXTICR3 |=(0x05 << 8);
    //设置下降沿检测EXTI9事件
    EXTI->FTSR1 |= (0x1 << 9);
    //取消EXTI9事件的屏蔽
    EXTI->C1IMR1 |= (0x1 << 9);
    // 全局使能99号中断
    GICD->ISENABLER[3] |= (0x1 << 3);
    //设置99号中断的优先级
    GICD->IPRIORITYR[24] &=(~(0x1f << 27));
    //设置99号中断的目标处理器
    GICD->ITARGETSR[24] |=(0x1 <<24);
    //允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
    // 设置中断优先级掩码
   GICC->PMR |=(0x1f << 3);
   // 允许组0中断被转发给处理器
   GICC->CTRL |= 0x1;
}
 
 
 
void key2_int_config()
{
//使能GPIO外设时钟
    RCC->MP_AHB4ENSETR |=(0x1<<5);
    //设置PF7为输入
    GPIOF->MODER &=(~(0x3<<14));
    //设置PF7产生EXTI7事件
    EXTI->EXTICR2 &=(~(0xff << 24));
    EXTI->EXTICR2 |=(0x05 << 24);
    //设置下降沿检测EXTI7事件
    EXTI->FTSR1 |= (0x1 << 7);
    //取消EXTI7事件的屏蔽
    EXTI->C1IMR1 |= (0x1 << 7);
    // 全局使能97号中断
    GICD->ISENABLER[3] |= (0x1 << 1);
    //设置97号中断的优先级
    GICD->IPRIORITYR[24] &=(~(0x1f << 11));
    //设置97号中断的目标处理器
    GICD->ITARGETSR[24] |=(0x1 <<8);
    //允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
    // 设置中断优先级掩码
   GICC->PMR |=(0x1f << 3);
   // 允许组0中断被转发给处理器
   GICC->CTRL |= 0x1;
}
 
 
 
void key3_int_config()
{
    //使能GPIO外设时钟
    RCC->MP_AHB4ENSETR |=(0x1<<5);
    //设置PF8为输入
    GPIOF->MODER &=(~(0x3<<16));
    //设置PF8产生EXTI8事件
    EXTI->EXTICR3 &=(~(0xff ));
    EXTI->EXTICR3 |=(0x05 );
    //设置下降沿检测EXTI8事件
    EXTI->FTSR1 |= (0x1 << 8);
    //取消EXTI8事件的屏蔽
    EXTI->C1IMR1 |= (0x1 << 8);
    // 全局使能98号中断
    GICD->ISENABLER[3 ]|= (0x1 << 2);
    //设置98号中断的优先级
    GICD->IPRIORITYR[24] &=(~(0x1f << 19));
    //设置98号中断的目标处理器
    GICD->ITARGETSR[24] |=(0x1 <<16);
    //允许组0中断被转发到GICC层
    GICD->CTRL |= 0x1;
   // 设置中断优先级掩码
   GICC->PMR |=(0x1f << 3);
   // 允许组0中断被转发给处理器
   GICC->CTRL |= 0x1;
 
}


do_irq.c

#include "mykey.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
     //获取中断号
    unsigned int irqno=(GICC->IAR&0x3ff);
    switch(irqno)
    {
        case 99:
            //中断处理逻辑
            i=!i;
            if(i==0)
            GPIOE->ODR |=(0x1<<10);
            else
            GPIOE->ODR &=(~(0x1<<10));
            //清除GICD的中断标志
            GICD->ICPENDR[3] |=(0X1<<3);
            //清除EXTI中的中断触发标志
            EXTI->FPR1 |=(0x1<<9);
            break;
        case 98:
          //中断处理逻辑
          i=!i;
            if(i==0)
            GPIOE->ODR |=(0x1<<8);
            else
            GPIOE->ODR &=(~(0x1<<8));
         //清除GICD的中断标志
          GICD->ICPENDR[3] |=(0X1<<2);
         //清除EXTI中的中断触发标志
         EXTI->FPR1 |=(0x1<<8);
          break;
        case 97:
         //中断处理逻辑
           i=!i;
            if(i==0)
            GPIOF->ODR |=(0x1<<10);
            else
            GPIOF->ODR &=(~(0x1<<10));
        //清除GICD的中断标志
        GICD->ICPENDR[3] |=(0X1<<1);
        //清除EXTI中的中断触发标志
         EXTI->FPR1 |=(0x1<<7);
         break;
    }
    //清除IAR寄存器中保存的中断号
    GICC->EOIR=irqno;
}
 
 

main.c

#include "mykey.h"
 
#include "uart4.h"
 
//手动封装延时函数
 
void delay_ms(int ms)
 
{
 
	int i,j;
 
	for(i=0;i<ms;i++)
 
	{
 
		for(j=0;j<2000;j++)
 
		{
 
 
 
		}
 
	}
 
}
 
int main()
 
{
 
	//按键中断初始化
 
	key1_int_config();
 
	key2_int_config();
 
	key3_int_config();
 
	//串口初始化
 
	uart4_config();
 
	//char str[100];
 
 
 
	while(1)
 
	{
 
		//死循环不让程序结束
 
 
 
	}
 
 
 
	return 0;
 
}
 

效果演示

键控灯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/550598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode-合并两个有序链表

目录 题目 图解 方法一 方法二 代码(解析在注释中) 方法一 ​编辑方法二 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1…

第11章 数据仓库和数据智能知识点梳理

第11章 数据仓库和数据智能知识点梳理&#xff08;附带页码&#xff09; ◼ 数据仓库&#xff08;Data Warehouse&#xff0c;DW&#xff09;&#xff1a;始于 20 世纪 80 年代&#xff0c;发展于 20 世纪 90 年代&#xff0c;后与商务智能&#xff08;Business Inteligence,BI…

MAC上如何将某个目录制作成iso格式磁盘文件,iso文件本质是什么?以及挂载到ParallelDesktop中?(hdiutil makehybrid )

背景 ParallelsDesktop没有安装ParallelsTools的无法共享目录&#xff0c;可以通过ParallelsDesktop提供CD磁盘的方式共享进去 命令 # 准备文档 mkdir mytestdir cp xxx mytestdir# 生成iso hdiutil makehybrid -o output.iso mytestdir -iso -joliethdiutil是MAC提供的磁盘…

使用FastDDS编译IDL文件

1.安装FastDDS环境 Ubuntu22.04 1.1安装依赖的软件 sudo apt-get update //基础工具安装 sudo apt install cmake g python3-pip wget git //Asio 是一个用于网络和低级 I/O 编程的跨平台C库&#xff0c;它提供了一致的 异步模型。 TinyXML2是一个简单&#xff0c;小巧&…

DFS算法系列题 全排列II

DFS算法系列题 – 全排列II DFS精选题- > 这次我们挑战的对象是&#xff1a; 全排列II 题目链接&#xff1a;47. 全排列 II - 力扣&#xff08;LeetCode&#xff09; 这道题和我们之前做的全排列不同的点在于这道题的题目包含了重复的数字&#xff0c;要求我们返回不重复…

Transformer的Decoder的输入输出都是什么

目录 1 疑问&#xff1a;Transformer的Decoder的输入输出都是什么 2 推理时Transformer的Decoder的输入输出 2.1 推理过程中的Decoder输入输出 2.2 整体右移一位 3 训练时Decoder的输入 参考文献&#xff1a; 1 疑问&#xff1a;Transformer的Decoder的输入输出都是什么 …

SQLite数据库中JSON 函数和运算符

返回&#xff1a;SQLite—系列文章目录 上一篇:维护SQLite的私有分支&#xff08;二十六&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ 1. 概述 默认情况下&#xff0c;SQLite 支持 29 个函数和 2 个运算符 处理 JSON 值。还有两个表值函数可用于分解 JSON…

最优算法100例之52-合并两个单调递增的单链表

专栏主页&#xff1a;计算机专业基础知识总结&#xff08;适用于期末复习考研刷题求职面试&#xff09;系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 合并两个单调递增的单链表 题解报告 解法1&#xff1a;采用尾插法首先确定一个头结点出来&a…

【Java EE】关于Spring MVC 响应

文章目录 &#x1f38d;返回静态页面&#x1f332;RestController 与 Controller 的关联和区别&#x1f334;返回数据 ResponseBody&#x1f38b;返回HTML代码片段&#x1f343;返回JSON&#x1f340;设置状态码&#x1f384;设置Header&#x1f338;设置Content-Type&#x1f…

【halcon】C# halcon 内存暴增 续,找到一个解决方案

这里写自定义目录标题 背景释放临时缓存具体的使用感受背景 在之前的文章《【halcon】C# halcon 内存暴增 》中我们提到了一些会导致内存暴增的原因。 其中一个就是使用了计算复杂的算子,且图片很大时,此时内存就会暴增,而且内存无法被释放。 这次,我在做一个项目时,用到…

一个开源的全自动视频生成软件MoneyPrinterTurbo

只需提供一个视频 主题 或 关键词 &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然后合成一个高清的短视频。 一&#xff1a;功能特性 完整的 MVC架构&#xff0c;代码 结构清晰&#xff0c;易于维护&#xff0c;支持 API 和 Web界面…

软件杯 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

复习回顾ES6基础篇(一小时学会es6)

基本语法 多行注释 /* 这里的所有内容 都是注释。 */单行注释 // 这是一条注释。变量定义 var x "" //定义范围变量 let y "" //定义局部变量 const z "" //定义常量运算符 变量类型 流程语句 if (condition) {/* 条件为真时运行的代…

LVM与磁盘配额

目录 一.LVM概述 1.LVM &#xff08;Logical Vokume Manager &#xff09;逻辑卷管理 2.LVM的管理命令 3.创建并使用LVM操作步骤 二.磁盘配额概述 1.实现磁盘限额的条件 2.Linux磁盘限额的特点 3.实现磁盘配额的步骤 三.总结&#xff1a; 一.LVM概述 1.LVM &#xff…

【静态分析】软件分析课程实验-前置准备

课程&#xff1a;南京大学的《软件分析》课程 平台&#xff1a;Tai-e&#xff08;太阿&#xff09;实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架&#xff0c;相比于已有的知名静态程序分析框架&#xff08;如 Soot、Wala 等&#xff09;&#xf…

《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)

1.简介 页面对象模型&#xff08;Page Object Model&#xff09;在Selenium Webdriver自动化测试中使用非常流行和受欢迎&#xff0c;作为自动化测试工程师应该至少听说过POM这个概念。本篇介绍POM的简介&#xff0c;接下来宏哥一步一步告诉你如何在你JavaSelenium3自动化测试…

算法打卡day36

今日任务&#xff1a; 1&#xff09;01背包问题理论基础(卡码网&#xff1a;46. 携带研究材料) 2&#xff09;01背包问题滚动数组(卡码网&#xff1a;46. 携带研究材料) 3&#xff09;416. 分割等和子集 4&#xff09;复习day11 卡码网&#xff1a;46. 携带研究材料 题目链接&…

35、链表-LRU缓存

思路&#xff1a; 首先要了解LRU缓存的原理&#xff0c;首先定下容量&#xff0c;每次get请求和put请求都会把当前元素放最前/后面&#xff0c;如果超过容量那么头部/尾部元素就被移除&#xff0c;所以最近最少使用的元素会被优先移除&#xff0c;保证热点数据持续存在。 不管放…

排序(三)——快速排序(递归以及栈和队列实现非递归)超详细

目录 1.hoare法 2.挖坑法 3.前后指针法 4.快排的非递归 4.1 栈实现快排非递归 4.2 队列实现快排非递归 快排我们之前在学习通讯录的时候就用了&#xff0c;那时候我们知道快排是一个很牛逼的排序算法&#xff0c;那他到底是怎么实现的呢&#xff1f; 1.hoare法 快速排序…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…
最新文章