arm 外部中断

main.c:

#include"key_inc.h"
//封装延时函数
void delay(int ms)
{int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++){}}
}
int main()
{//按键中断的初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1000);}return 0;
}

key_inc.c:

#include "key_inc.h"
void key1_it_config()
{// 使能GPIOF外设时钟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);// 设置EXTI9中断全局使能GICD->ISENABLER[3] |= (0x1 << 3);// 设置中断优先级GICD->IPRIORITYR[24] &= (~(0x1f << 27));// 设置CPU0处理当前中断GICD->ITARGETSR[24] |= (0x1 << 24);// 设置组0中断可以被转发到GICC层GICD->CTRL |= 0X1;// 设置中断优先级掩码GICC->PMR |= (0x1f << 3);// 设置组0中断交给指定处理器处理GICC->CTRL |= 0x1;
}void key2_it_config()
{// 使能GPIOF外设时钟RCC->MP_AHB4ENSETR |= (0x1 << 5);// 将PF8设置为输入模式GPIOF->MODER &= (~(0x3 << 14));// 设置由PF7管脚产生EXTI7事件EXTI->EXTICR2 &= (~(0XFF << 24));EXTI->EXTICR2 |= (0X05 << 24);// 通过下降沿检测EXTI7事件是否产生EXTI->FTSR1 |= (0x1 << 7);// 取消EXTI7中断屏蔽EXTI->C1IMR1 |= (0x1 << 7);// 设置EXTI7中断全局使能GICD->ISENABLER[3] |= (0x1 << 1);// 设置中断优先级GICD->IPRIORITYR[24] &= (~(0x1f << 11));// 设置CPU0处理当前中断GICD->ITARGETSR[24] |= (0x1 << 8);// 设置组0中断可以被转发到GICC层GICD->CTRL |= 0X1;// 设置中断优先级掩码GICC->PMR |= (0x1f << 3);// 设置组0中断交给指定处理器处理GICC->CTRL |= 0x1;
}void key3_it_config()
{// 使能GPIOF外设时钟RCC->MP_AHB4ENSETR |= (0x1 << 5);// 将PF8设置为输入模式GPIOF->MODER &= (~(0x3 << 16));// 设置由PF8管脚产生EXTI9事件EXTI->EXTICR3 &= (~(0XFF << 0));EXTI->EXTICR3 |= (0X05 << 0);// 通过下降沿检测EXTI8事件是否产生EXTI->FTSR1 |= (0x1 << 8);// 取消EXTI8中断屏蔽EXTI->C1IMR1 |= (0x1 << 8);// 设置EXTI8中断全局使能GICD->ISENABLER[3] |= (0x1 << 2);// 设置中断优先级GICD->IPRIORITYR[24] &= (~(0x1f << 19));// 设置CPU0处理当前中断GICD->ITARGETSR[24] |= (0x1 << 16);// 设置组0中断可以被转发到GICC层GICD->CTRL |= 0X1;// 设置中断优先级掩码GICC->PMR |= (0x1f << 3);// 设置组0中断交给指定处理器处理GICC->CTRL |= 0x1;
}

do_irq.c:

#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.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:printf("key1_intc\n");// 清除GICD中断排队标志GICD->ICPENDR[3] |= (0X1 << 3);// 清除EXTI中断触发标志EXTI->FPR1 |= (0X1 << 9);break;case 98:printf("key3_intc\n");// 清除GICD中断排队标志GICD->ICPENDR[3] |= (0X1 << 2);// 清除EXTI中断触发标志EXTI->FPR1 |= (0X1 << 8);break;case 97:printf("key2_intc\n");// 清除GICD中断排队标志GICD->ICPENDR[3] |= (0X1 << 1);// 清除EXTI中断触发标志EXTI->FPR1 |= (0X1 << 7);break;default:break;}// 清除IAR寄存器中的中断号GICC->EOIR |= irqno;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】域名劫持无处遁形:基于HTTPDNS打造可靠且安全的域名解析体系

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

代码随想录算法训练营 第14天 part03 | 二叉树的迭代遍历

代码随想录 前序遍历&#xff08;迭代法&#xff09; 前序遍历是中左右&#xff0c;每次先处理的是中间节点&#xff0c;那么先将根节点放入栈中&#xff0c;然后将右孩子加入栈&#xff0c;再加入左孩子。 public List<Integer> preorderTraversal(TreeNode root) {Li…

人工智能之Tensorflow批标准化

批标准化&#xff08;Batch Normalization,BN&#xff09;是为了克服神经网络层数加深导致难以训练而诞生的。 随着神经网络的深度加深&#xff0c;训练会越来越困难&#xff0c;收敛速度会很慢&#xff0c;常常会导致梯度消失问题。梯度消失问题是在神经网络中&#xff0c;当前…

【Qt问题】Qt中文乱码问题解决方案(详细汇总)

【Qt问题】Qt中文乱码问题解决方案&#xff08;详细汇总&#xff09; 一、问题描述&#xff1a; 由于Qt对中文的支持不是很好&#xff0c;使用QtCreator进行开发的过程中&#xff0c;经常会出现各种乱七八糟的中文乱码问题&#xff0c;比如我前面遇到的 【Qt问题】初始化菜单…

【Node.js】zlib

gzip 和 deflate 的基本使用 const zlib require("zlib"); const fs require(fs)// 压缩 1. createGzip .gz 2. createDeflate .deflate // const readStream fs.createReadStream(index.txt) // const writeStream fs.createWriteStream(index.txt.gz) // rea…

LeetCode 面试经典150题 14.最长公共前缀

题目&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 思路&#xff1a; 代码&#xff1a; class Solution {public String longestCommonPrefix(String[] strs) {if (strs.length 0) {return &…

nodejs+vue高校社团管理小程序的设计与实现python-flask-django-php

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低学校的运营人员成本&#xff0c;实现了高校社团管理的标准化、制度化、程序化的管理&#xff0c;有效地防止了高校社团管理的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准…

手撕算法-二叉树的层序遍历

描述 分析 层序遍历&#xff0c;需要用到队列。 代码 代码1&#xff1a;独立bfs函数 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(i…

游戏引擎中的地形系统

一、地形的几何 1.1 高度图 记录不同定点的高度&#xff0c;对每个网格/顶点应用高度、材质等信息&#xff0c;我们每个顶点可以根据高度改变位移 但是这种方法是不适用于开放世界的。很难直接画出几百万公里的场景 1.2 自适应网格细分 当fov越来越窄的时候&#xff0c;网格…

设计模式(十二):中介者模式(行为型模式)

Mediator&#xff0c;中介者模式&#xff1a;用一个中介对象封装一些列的对象交互。属于行为型模式 Facade&#xff0c;外观模式&#xff1a;为子系统中的一组接口提供一致的界面&#xff0c;facade 提供了一高层接口&#xff0c;这个接口使得子系统更容易使用。属于结构型模式…

Dynamo与Revit API之间的转换

今天来聊聊 Dynamo 与 Revit 之间图元转换的基础知识&#xff0c;这些需要你牢牢记住哦&#xff0c;不然在 Python script 中写代码&#xff0c;经常会报错的~ 通常来讲&#xff0c;所有来自 Dynamo 节点的几何图形都不是 Revit 的几何对象&#xff0c;所以它们需要与 Revit AP…

深度学习pytorch——多分类问题(持续更新)

回归问题 vs 分类问题&#xff08;regression vs classification&#xff09; 回归问题&#xff08;regression&#xff09; 1、回归问题的目标是使预测值等于真实值&#xff0c;即predy。 2、求解回归问题的方法是使预测值和真实值的误差最小&#xff0c;即minimize dist(p…