ARM12.26

news2025/3/14 20:37:42

整理三个按键中断代码

key_it.h

#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_gic.h"
#include"stm32mp1xx_exti.h"
#include"stm32mp1xx_rcc.h"
#include"led.h"
void key1_it_config();
void key2_it_config();
void key3_it_config();
void delay(int ms);
#endif

led.h

#ifndef __LED_H__
#define __LED_H__

#define RCC_GPIO (*(unsigned int *)0x50000a28)
#define GPIOE_MODER (*(unsigned int *)0x50006000)
#define GPIOF_MODER (*(unsigned int *)0x50007000)
#define GPIOE_OTYPER (*(unsigned int *)0x50006004)
#define GPIOF_OTYPER (*(unsigned int *)0x50007004)
#define GPIOE_OSPEEDR (*(unsigned int *)0x50006008)
#define GPIOF_OSPEEDR (*(unsigned int *)0x50007008)
#define GPIOE_PUPDR (*(unsigned int *)0x5000600C)
#define GPIOF_PUPDR (*(unsigned int *)0x5000700c)
#define GPIOE_ODR (*(unsigned int *)0x50006014)
#define GPIOF_ODR (*(unsigned int *)0x50007014)

void all_led_init();
void led1_on();
void led1_off();
void led2_on();
void led2_off();
void led3_on();
void led3_off();

#endif

key_it.c

#include"key_it.h"
void key1_it_config()
{
    //使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF9管脚为输入
    GPIOF->MODER &= (~(0x3<<18));
    //设置PF9作为EXTI9事件的输入
    EXTI->EXTICR3 &= (~(0x1f<<8));
    EXTI->EXTICR3 |= (0x05<<8);
    //设置下降沿使能检测EXTI9事件
    EXTI->FTSR1 |= (0x1<<9);
    //设置EXTI9事件不屏蔽
    EXTI->C1IMR1 |= (0x1<<9);
    //GICD使能EXTI9(99号)中断
    GICD->ISENABLER[3] |= (0x1<<3);
    //GICD 设置99号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<27));
    //选择CPU0处理当前中断
    GICD->ITARGETSR[24] |= (0x1<<24);
    //全局使能组0中断被转发到GICC
    GICD->CTRL |= (0X1);
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //允许组0中断被CPU处理
    GICC->CTRL |= (0x1);
}

void key2_it_config()
{
    //使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF7管脚为输入
    GPIOF->MODER &= (~(0x3<<14));
    //设置PF7作为EXTI9事件的输入
    EXTI->EXTICR2 &= (~(0x1f<<24));
    EXTI->EXTICR2 |= (0x05<<24);
    //设置下降沿使能检测EXTI7事件
    EXTI->FTSR1 |= (0x1<<7);
    //设置EXTI7事件不屏蔽
    EXTI->C1IMR1 |= (0x1<<7);
    //GICD使能EXTI7(97号)中断
    GICD->ISENABLER[3] |= (0x1<<1);
    //GICD 设置97号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<11));
    //选择CPU0处理当前中断
    GICD->ITARGETSR[24] |= (0x1<<8);
    //全局使能组0中断被转发到GICC
    GICD->CTRL |= (0X1);
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //允许组0中断被CPU处理
    GICC->CTRL |= (0x1);
}
void key3_it_config()
{
    //使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF8管脚为输入
    GPIOF->MODER &= (~(0x3<<16));
     //设置PF8作为EXTI8事件的输入
    EXTI->EXTICR3 &= (~(0x1f));
    EXTI->EXTICR3 |= (0x05);
     //设置下降沿使能检测EXTI8事件
    EXTI->FTSR1 |= (0x1<<8);
    //设置EXTI8事件不屏蔽
    EXTI->C1IMR1 |= (0x1<<8);
    //GICD使能EXTI8(98号)中断
    GICD->ISENABLER[3] |= (0x1<<2);
      //GICD 设置98号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<19));
     //选择CPU0处理当前中断
    GICD->ITARGETSR[24] |= (0x1<<16);
    //全局使能组0中断被转发到GICC
    GICD->CTRL |= (0X1);
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //允许组0中断被CPU处理
    GICC->CTRL |= (0x1);
}

led.c

#include "led.h"
void all_led_init()
{
    RCC_GPIO |= (0X3<<4);//时钟使能
    GPIOE_MODER &=(~(0X3<<20));//设置PE10输出
    GPIOE_MODER |= (0X1<<20);
    //设置PE10为推挽输出
    GPIOE_OTYPER &=(~(0x1<<10));
    //PE10为低速输出
    GPIOE_OSPEEDR &= (~(0x3<<20));
    //设置无上拉下拉
    GPIOE_PUPDR &= (~(0x3<<20));

    //LED2
    GPIOF_MODER &=(~(0X3<<20));//设置Pf10输出
    GPIOF_MODER |= (0X1<<20);
    //设置Pf10为推挽输出
    GPIOF_OTYPER &=(~(0x1<<10));
    //Pf10为低速输出
    GPIOF_OSPEEDR &= (~(0x3<<20));
    //设置无上拉下拉
    GPIOF_PUPDR &= (~(0x3<<20));

    //LED3
    GPIOE_MODER &=(~(0X3<<16));//设置PE8输出
    GPIOE_MODER |= (0X1<<16);
    //设置PE8为推挽输出
    GPIOE_OTYPER &=(~(0x1<<8));
    //PE8为低速输出
    GPIOE_OSPEEDR &= (~(0x3<16));
    //设置无上拉下拉
    GPIOE_PUPDR &= (~(0x3<<16));
}
void led1_on()
{
    GPIOE_ODR |= (0x1<<10);
}
void led1_off()
{
    GPIOE_ODR &= (~(0x1<<10));
}
void led2_on()
{
    GPIOF_ODR |= (0x1<<10);
}
void led2_off()
{
    GPIOF_ODR &= (~(0x1<<10));
}
void led3_on()
{
    GPIOE_ODR |= (0x1<<8);
}
void led3_off()
{
    GPIOE_ODR &= (~(0x1<<8));
}

do_irq.c

#include "key_it.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
    all_led_init();
    int irqno = (GICC->IAR & 0x3ff);
    switch (irqno)
    {
    case 99: // key1
        printf("KEY1_INT\n");
        led1_on();
        delay(2000);
        led1_off();
        // 清除GICD的中断排队标志
        GICD->ICPENDR[3] |= (0x1<<3);
        // 清除exti的事件触发标志
        EXTI->FPR1 |= (0x1<<9);
        break;
    case 97: // KEY2
        printf("KEY2_INT\n");
        led2_on();
        delay(2000);
        led2_off();
        // 清除GICD的中断排队标志
        GICD->ICPENDR[1] |= (0x1<<1);
        // 清除exti的事件触发标志
        EXTI->FPR1 |= (0x1<<7);
        break;
    case 98: // key3
       printf("KEY3_INT\n");
       led3_on();
        delay(2000);
        led3_off();
        // 清除GICD的中断排队标志
        GICD->ICPENDR[2] |= (0x1<<2);
        // 清除exti的事件触发标志
        EXTI->FPR1 |= (0x1<<8);
        break;
    }
    // 清除中断号
    GICC->EOIR = irqno;
}

main.c

#include "key_it.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("do main...\n");

	delay(2000);

}



}

效果图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九、Seata的AT模式

目录 9.1 什么是弱一致性 &#xff1f;9.2 Seata的弱一致性9.3 Seata的AT模式介绍9.4 AT模式流程图9.5 AT模式注意点9.6 全局锁的理解1、认识全局锁2、注册全局锁3、校验&#xff08;获取&#xff09;全局锁4、释放锁5、结论 9.7 AT的多数据源场景 9.1 什么是弱一致性 &#xf…

算符优先语法分析设计原理与实现

前言&#xff1a; 作者的词法分析程序以及算符优先语法分析设计程序仓库链接 1、目标任务 **[实验项目] **以专题 1 词法分析程序的输出为语法分析的输入&#xff0c;实现算符优先分析算法&#xff0c;完成以下描述算术表达式的算符优先文法的算符优先分析过程。 G[E]:E→E…

PgSQL技术内幕 - ereport ERROR跳转机制

PgSQL技术内幕 - ereport ERROR跳转机制 使用客户端执行SQL的时候经常遇到报ERROR错误&#xff0c;然后SQL语句就退出了。当然&#xff0c;事务也会回滚掉。本文我们看下它是如何做到退出SQL语句并回滚事务的。 1、以insert一个numeric类型值为例 表一个字段为numeric(10,2)类型…

账号与权限管理

一、Linux用户 1.1用户类型 1.普通用户&#xff1a;权限受到限制的用户 2.超级管理员&#xff1a;至高无上的权限 3.程序用户&#xff1a;是给程序使用的&#xff0c;不允许登录(为了安全性考虑) 能不能打开文件和用户有关&#xff0c;用户有自己的权限 运行程序不能使用超…

关于chatglm3 function calling的理解

ChatGLM3-6B开源了工具调用&#xff0c;好奇他是怎么实现的&#xff0c;所以写了这个文章记录。 一、测试官方的示例 官方给的示例很简单&#xff0c;只不过给的两个函数 track 和 text-to-speech 没有具体的实现&#xff0c;模型的输出也只是给出了需要调用的函数名和参数。剩…

w16php系列之基础数组

一、索引数组 概念 索引数组 是指键名为整数的数组。默认情况下&#xff0c;索引数组的键名是从0开始&#xff0c;并依次递增。它主要适用于利用位置&#xff08;0、1、2……&#xff09;来标识数组元素的情况。另外&#xff0c;索引数组的键名也可以自己指定 示例代码 <…

网络调优,部署内网备份冗余和负载分担---实验

目录 网络调优&#xff0c;部署内网备份冗余和负载分担---实验 拓扑 需求 配置步骤&#xff1a; 配置命令: 网络调优&#xff0c;部署内网备份冗余和负载分担---实验 拓扑 需求 主机获取IP地址&#xff0c;访问WEB服务器&#xff0c;WEB服务器网关在SW5上SW5作为VLAN10,V…

【实施】共享目录防火墙

文章目录 一、共享文件1.1 为什么需要配置文件夹共享功能1.2 配置文件夹共享功能1.3 访问共享文件1.4 普通共享和高级共享 二、安装JDK和Tomcat2.1 安装JDK2.2 安装Tomcat 三、防火墙配置 一、共享文件 1.1 为什么需要配置文件夹共享功能 我们在工作和生活中经常有需要将自己…

2024年五个大胆的网络安全预测

纵观历史&#xff0c;网络安全行业不断对攻击者的转变以及运营现实的变化做出反应&#xff0c;新的一年也不例外。随着人工智能和云计算等新技术改变网络安全格局&#xff0c;攻击者和防御者之间的猫捉老鼠游戏肯定会加剧&#xff0c;并且会变得更加复杂。 再加上其他因素&…

带你学C语言~指针(3)

目录 ✍0.前言 &#x1f680;1.字符指针变量 &#x1f685;2.数组指针变量 &#x1f431;‍&#x1f3cd;2.1.数组指针变量是什么 &#x1f431;‍&#x1f3cd;2.2数组指针变量怎么初始化 &#x1f6a2;3.二维数组传参的本质 &#x1f680;4.函数指针变量 ✈4.1函数指…

15个主流设计灵感网站,激发你的创作灵感!

即时设计 即时设计是一种强大的云设计工具&#xff0c;已成为许多设计师、产品经理和开发人员的首选工具之一。即时设计用户可以使用内置的工具和功能快速创建和编辑设计&#xff0c;或与其他用户共享和合作。此外&#xff0c;即时设计还有一个丰富的资源社区&#xff0c;为用…

制造业数字化转型的核心不止是技术

一、制造业的数字化转型意味着什么&#xff1f; 在当今的制造业领域&#xff0c;数字化转型意味着通过集成数字技术来增强传统的制造方法、产品和劳动力的过程。这些技术包括一系列创新&#xff0c;如自动化软件、电子商务系统、传感器、工业机器人等。 二、制造业数字化转型的…

ubuntu 安装apisix -亲测可用

官方未提供在ubuntu系统中安装apisix的方式&#xff0c;似乎只能通过源码方式安装&#xff0c;但是并不推荐&#xff0c;非常容易失败&#xff0c; 具体操作方式如下&#xff1a; ubuntu和Debian其实类似的&#xff0c;可使用DEB方式安装&#xff0c;如下截图 注意&#xff1…

22000mAh 电池,这款国产新机来了场「续航」震撼

见惯了主流智能手机&#xff0c;是时候上一波离谱新机震撼了。 三防手机这一细分类型&#xff0c;咱们普通用户可能接触得比较少&#xff1b; 但对于极限运动、野外探险爱好者来说&#xff0c;这玩意儿可是关键时候能救命的必备神器。 在真正严苛环境面前&#xff0c;性能啥的…

《Vue2.X 进阶知识点》- 防 ElementUI Divider 分割线

前言 使用 el-divider 背景为白色是没问题的。 但当背景换成其它颜色&#xff0c;问题就出现了&#xff01;&#xff01; 仔细看原来是两层&#xff0c;默认背景色是白色。 想着把背景色改为透明应该能用&#xff0c;结果发现背面是一条实线&#xff0c;难怪要用白色遮挡…不符…

使用LLaMA-Factory微调ChatGLM3

1、创建虚拟环境 略 2、部署LLaMA-Factory &#xff08;1&#xff09;下载LLaMA-Factory https://github.com/hiyouga/LLaMA-Factory &#xff08;2&#xff09;安装依赖 pip3 install -r requirements.txt&#xff08;3&#xff09;启动LLaMA-Factory的web页面 CUDA_VI…

HarmonyOS4.0系统性深入开发05ArkTS卡片运行机制

ArkTS卡片运行机制 实现原理 图1 ArkTS卡片实现原理 卡片使用方&#xff1a;显示卡片内容的宿主应用&#xff0c;控制卡片在宿主中展示的位置&#xff0c;当前仅系统应用可以作为卡片使用方。卡片提供方&#xff1a;提供卡片显示内容的应用&#xff0c;控制卡片的显示内容、…

ElasticSearch 聚合统计

聚合统计 度量聚合&#xff1a;求字段的平均值&#xff0c;最小值&#xff0c;最大值&#xff0c;总和等 桶聚合&#xff1a;将文档分成不同的桶&#xff0c;桶的划分可以根据字段的值&#xff0c;范围&#xff0c;日期间隔 管道聚合&#xff1a;在桶聚合的结果上执行进一步计…

【MYSQL】MYSQL 的学习教程(七)之 慢 SQL 优化思路

1. 慢 SQL 优化思路 慢查询日志记录慢 SQLexplain 分析 SQL 的执行计划profile 分析执行耗时Optimizer Trace 分析详情确定问题并采用相应的措施 1. 慢查询日志记录慢 SQL 如何定位慢SQL呢&#xff1f; 我们可以通过 慢查询日志 来查看慢 SQL。 ①&#xff1a;开启慢查询日志…

围栏中心点

后端返回的数据格式是 [{height: 0,lat: 30.864277169098443,lng:114.35252972024682}{height: 1,lat: 30.864277169098443,lng:114.35252972024682}.........]我们要转换成 33.00494857612568,112.53886564762979;33.00307854503083,112.53728973842954;33.00170296814311,11…