RAMday9

news2024/12/23 10:10:19

设置按键中断,按键1按下,LED亮,再按一次,灭;按键2按下,蜂鸣器响,再按一次,不响;按键3按下,风扇转,再按一次,风扇停

代码

do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
unsigned int num1 = 0, num2 = 0,num3 = 0; //用于记录按键按下次数
void do_irq(void) 
{
    int irqno;//保存中断号
    irqno=GICC->IAR & 0X3FF;
    switch(irqno)
    {
        case 99://key1
            //按键1中断处理
            printf("KEY1 INT\n");
            //灯亮
            if(num1 == 0)
            {
                //PF10
                GPIOF->ODR |= (0x1<<10);
                //PE10 PE8
                GPIOE->ODR |= (0x5<<8);
                num1++;
            }
            //灯灭
            else if(num1 > 0)
            {
                //PF10
                GPIOF->ODR &= ~(0x1<<10);
                //PE10 PE8
                GPIOE->ODR &= ~(0x5<<8);
                num1 = 0;
            }
            //清除挂起中断标志位GICD_ICPENDRx
            GICD->ICPENDR[3] |= (0x1<<3);
            //清除中断触发标志位EXTI_FPR1
            EXTI->FPR1 |= (0x1<<9);
            break;
        case 97://key2
            //按键2中断处理
            printf("KEY2 INT\n");
            //蜂鸣器转
            if(num2 == 0)
            {
                //PB6
                GPIOB->ODR |= (0x1<<6);
                num2++;
            }
            //蜂鸣器停
            else if(num2 > 0)
            {
                //PB6
                GPIOB->ODR &= ~(0x1<<6);
                num2 = 0;
            }
            //清除挂起中断标志位GICD_ICPENDRx
            GICD->ICPENDR[3] |= (0x1<<1);
            //清除中断触发标志位EXTI_FPR1
            EXTI->FPR1 |= (0x1<<7);
            break;
        case 98://key3
            //按键3中断处理
            printf("KEY3 INT\n");
            //风扇转
            if(num3 == 0)
            {
                //PE9
                GPIOE->ODR |= (0x1<<9);
                num3++;
            }
            //风扇停
            else if(num3 > 0)
            {
                //PE9
                GPIOE->ODR &= ~(0x1<<9);
                num3 = 0;
            }
            //清除挂起中断标志位GICD_ICPENDRx
            GICD->ICPENDR[3] |= (0x1<<2);
            //清除中断触发标志位EXTI_FPR1
            EXTI->FPR1 |= (0x1<<8);
            break;
    }
    //清除处理完的中断号GICC_EOIR
    GICC->EOIR =irqno;
}

led.c

#include "led.h"
//延时
void delay(int ms)
{
	int i,j;
	for(i = 0;i < ms;i++)
	{
		for(j = 0;j < 2000;j++);
	}
}
//给RCC使能
void rcc_start()
{
	RCC->MP_AHB4LPENSETR |= (0x3<<4);
}
//GPIO初始化
void gpio_start()
{
	//PE10 PE9 PE8设置为输出模式
	GPIOE->MODER &= (~(0x3f<<16));
	GPIOE->MODER |= (0x15<<16);
	//PF10设置为输出模式
	GPIOF->MODER &= (~(0x3<<20));
	GPIOF->MODER |= (0x1<<20);
	//PB6设置为输出模式
	GPIOB->MODER &= (~(0x3<<12));
	GPIOB->MODER |= (0x1<<12);
	//PE10 PE9 PE8设置为推挽输出
	GPIOE->OTYPER &= (~(0x7<<8));
	//PF10设置为推挽输出
	GPIOF->OTYPER &= (~(0x1<<10));
	//PB6设置为推挽输出
	GPIOB->OTYPER &= (~(0x1<<6));
	//PE10 PE9 PE8设置为低速输出
	GPIOE->OSPEEDR &= (~(0x3f<<16));
	//PF10设置为低速输出
	GPIOF->OSPEEDR &= (~(0x3<<20));
	//PB6设置为低速输出
	GPIOB->OSPEEDR &= (~(0x3<<12));
	//PE10 PE9 PE8设置为无上拉下拉电阻
	GPIOE->PUPDR &= (~(0x3f<<16));
	//PF10设置为无上拉下拉电阻
	GPIOF->PUPDR &= (~(0x3<<20));
	//PB6设置为无上拉下拉电阻
	GPIOB->PUPDR &= (~(0x3<<16));
}

led.h

#ifndef __LED_H__
#define __LED_H__
#include "../common/include/stm32mp1xx_exti.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_gic.h"
//延时
void delay(int ms);
//给RCC使能
void rcc_start();
//GPIO初始化
void gpio_start();
#endif

key.c

#include"key.h"
//按键3的配置
void key3_config()
{
    //RCC使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF8 GPIO输入
    GPIOF->MODER &= (~(0x3<<16));
    //设置PF8产生EXTI事件 EXTI_EXTICRx
    EXTI->EXTICR3 &=(~(0xFF<<0));
    EXTI->EXTICR3 |= (0x5<<0);
    //设置事件触发方式为下降沿触发EXTI_FTSR1
    EXTI->FTSR1 |= (0x1<<8);
    //设置EXTI事件触发不屏蔽EXTI_IMR1
    EXTI->C1IMR1 |= (0x1<<8);
    //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    GICD->ISENABLER[3] |= (0X1<<2); 
    // GICD_ISENABLERx设置中断优先级
    GICD->IPRIORITYR[24] &= (~(0X1F<<19)); 
    //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    GICD->ITARGETSR[24]  &= (~(0X3<<16));
    GICD->ITARGETSR[24] |= (0X1<<16);
    //设置中断优先级掩码GICC_PMR
    GICC->PMR |= (0x1F<<3);
    //使能CPU可以处理组0转发的中断GICC_CTLR
    GICC->CTRL |= 0X1;
}
//按键1 按键2以及GICC层的配置
void key_config()
{
    //RCC使能GPIOF时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //设置PF9 PF7GPIO输入
    //PF9
    GPIOF->MODER &= (~(0x3<<18));
    //pf7
    GPIOF->MODER &= (~(0x3<<14));
    //设置PF9 PF7 产生EXTI事件 EXTI_EXTICRx
    //pf7
    EXTI->EXTICR2 &=(~(0xFF<<24));
    EXTI->EXTICR2 |= (0x5<<24);
    //pf9
    EXTI->EXTICR3 &=(~(0xFF<<8));
    EXTI->EXTICR3 |= (0x5<<8);
    //设置事件触发方式为下降沿触发EXTI_FTSR1
    //pf7
    EXTI->FTSR1 |= (0x1<<7);
    //pf9
    EXTI->FTSR1 |= (0x1<<9);
    //设置EXTI事件触发不屏蔽EXTI_IMR1
    //PF7
    EXTI->C1IMR1 |= (0x1<<7);
    //PF9
    EXTI->C1IMR1 |= (0x1<<9);
    //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    //PF7 97号中断
    GICD->ISENABLER[3] |= (0X1<<1); 
    //PF9 99号中断
    GICD->ISENABLER[3] |= (0X1<<3); 
    // GICD_ISENABLERx设置中断优先级
    //PF7
    GICD->IPRIORITYR[24] &= (~(0X1F<<11)); 
    //PF9
    GICD->IPRIORITYR[24] &= (~(0X1F<<27)); 
    //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    //pf7 97中断
    GICD->ITARGETSR[24]  &= (~(0X3<<8));
    GICD->ITARGETSR[24] |= (0X1<<8);
    //pf9 99中断
    GICD->ITARGETSR[24]  &= (~(0X3<<24));
    GICD->ITARGETSR[24] |= (0X1<<24);
    //使能组0转发中断GICD_CTLR
    GICD->CTRL |= 0X1;
    //设置中断优先级掩码GICC_PMR
    GICC->PMR |= (0x1F<<3);
    //使能CPU可以处理组0转发的中断GICC_CTLR
    GICC->CTRL |= 0X1;  
}

key.h

#ifndef __KEY_H__
#define __KEY_H__
#include "../common/include/stm32mp1xx_exti.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_gic.h"
void key_config();
void key3_config();
#endif

main.c

#include "key.h"
#include "led.h"
int main()
{
    //中断初始化
    key_config();
	key3_config();
	//GPIO串口初始化
	gpio_start();
    while(1)
    {
        //保证主程序不结束
    }
    return 0;
}

现象

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

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

相关文章

火狐浏览器页面翻译

打开扩展 扩展搜索tran 点击谷歌快译组件 设置翻译语言 安装完成后即可右键翻译页面

【数据库——MySQL(实战项目1)】(3)图书借阅系统——存储函数

目录 1. 简述2. 功能代码2.1 创建存储函数&#xff0c;根据图书编号查借阅人姓名&#xff0c;并调用该函数查询‘ **小邓在森林** ’已借未还的图书情况&#xff1b;2.2 创建存储函数&#xff0c;计算某借阅人还能借阅的图书数目&#xff0c;学生限额 5 本&#xff0c;教师限额…

两个连续变量乘积线性化——McCormick envelope近似

两个连续变量乘积的形式&#xff0c;可以进行近似线性化转化&#xff08;没有完全等价的线性化方法&#xff09;。要说明的是这是一种近似线性化&#xff0c;并不是完全等价&#xff0c;存在一定的误差。转化的方法是&#xff0c;McCormick envelope近似&#xff08;McCormick …

快速解决“找不到msvcr120.dll无法执行代码”问题,总结5解决方法

计算机已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;在使用计算机的过程中&#xff0c;我们常常会遇到各种问题&#xff0c;其中之一就是找不到msvcr120.dll文件。这个问题可能会可能导致计算机程序软件&#xff0c;游戏无法正常运行&#xff0c;影响到我们的工…

试图带你一文搞懂transformer注意力机制(Self-Attention)的本质

这篇文章主要想搞懂以下几个问题&#xff1a; 1、什么是自注意力&#xff08;Self-Attention&#xff09; 2、Q,K,V是什么 好了废话不多说&#xff0c;直接进入正题 Q,K,V分别代表query&#xff0c;key和value&#xff0c;这很容易让人联想到python的字典数据结构&#xff…

西安交大转子数据集故障诊断(Python代码,MSCNN结合LSTM结合注意力机制模型)

1.运行效果&#xff1a;西安交大转子数据集故障诊断&#xff08;Python代码&#xff0c;MSCNN结合LSTM结合注意力机制模型&#xff09;_哔哩哔哩_bilibili 2.环境库版本 如果库版本不一样&#xff0c; 一般也可以运行&#xff0c;这里展示我运行时候的库版本&#xff0c;是为了…

多线程 - 锁策略 CAS

常见的锁策略 此处谈到的锁策略,不局限于 Java,C,Python,数据库,操作系统……但凡是涉及到锁,都是可以应用到下列的锁策略的 乐观锁 vs 悲观锁 锁的实现者,预测接下来锁冲突(锁竞争,两个线程针对一个对象加锁,产生阻塞等待了)的概率是大,还是不大,根据这个冲突的概率,来接下…

30+程序员:如何成为工作领域专家丨IDCF

想要独立完成有一定复杂度的开发和维护工作&#xff0c;或者带领团队完成产品发布、项目交付&#xff1f;要成为研发经理、核心项目负责人&#xff1f; 但又苦于没有丰富的实战经验、或是有经验但是没有可以证明能力水平的认证。 在IT行业&#xff0c;年龄是一个敏感话题。特…

AI一体化运维监控方案助力医院监控体系信息化、智能化

智慧医院是现代医疗领域的新兴概念&#xff0c;是通过先进的物联网技术和新兴技术联合人工智能&#xff0c;实现一体化医院运维监控管理&#xff0c;旨在提升医院的安全性、运行效率和服务质量。 具体方案 1、 视频监控系统 医院可以安装视频监控摄像头&#xff0c;覆盖关键区…

vue-mixin

1.vue中&#xff0c;混入(mixin)是一种特殊的使用方式。一个混入对象可以包含任意的组件配置选项(data, props, components, watch,computed…)可以根据需求"封装"一些可复用的单元&#xff0c;并在使用时根据一定的策略合并到组件的选项中&#xff0c;使用时和组件自…

记录使用vant组件库的Popup的问题

使用过程中,需要实现点击遮罩层不关闭,智能点击关闭按钮或提交按钮才能关闭遮罩层,看了官网要使用close-on-click-overlay属性, 一开始的写法是错误的: close-on-click-overlayfalse 这个写法明显传递的是string, 而官网中明确要求要穿布尔值, 所以需要在前面加冒号 :clos…

【基础篇】三、Flink集群角色、系统架构以及作业提交流程

文章目录 1、集群角色2、部署模式3、Flink系统架构3.1 作业管理器&#xff08;JobManager&#xff09;3.2 任务管理器&#xff08;TaskManager&#xff09; 4、独立部署会话模式下的作业提交流程5、Yarn部署的应用模式下作业提交流程 1、集群角色 Flink提交作业和执行任务&…

04在命令行中使用Maven命令创建Maven版的Web工程,并将工程部署到服务器的步骤

创建Maven版的Web工程 使用命令生成Web工程 使用mvn archetype:generate命令生成Web工程时&#xff0c;需要使用一个专门生成Web工程骨架的archetype(参照官网看到它的用法) -D表示后面要附加命令的参数&#xff0c;字母D和后面的参数是紧挨着的&#xff0c;中间没有任何其它…

Mac下通过nvm管理node

背景 本地有两个项目&#xff0c;老项目需要用到node 14&#xff0c;新项目需要用node 16&#xff0c;所以只能通过nvm来管理node了 卸载原始的node 我的node是通过官网的.pkg文件安装的&#xff0c;可以通过以下命令进行删除 sudo rm -rf /usr/local/{bin/{node,npm},lib/…

第四篇Android--TextView使用详解

TextView是View体系中的一员&#xff0c;继承自View&#xff0c;用于在界面中展示文字。 基本用法&#xff1a; <TextViewandroid:id"id/textview"android:layout_width"wrap_content"android:layout_height"wrap_content"android:padding&q…

一文带你上手自动化测试中的PO模式!

在UI的自动化测试中&#xff0c;我们需要把测试使用到的数据分离到文件中&#xff0c;如果单纯的写在我们的测试模块里面&#xff0c;不是一个好的设计&#xff0c;所以不管是什么类型的自动化测试&#xff0c;都是需要把数据分离出来的。当然分离到具体的文件里面&#xff0c;…

Arcgis实现Tiff合并

Arcgis实现Tiff合并 现有四幅Tiff影像 打开数据管理工具 输入使用这四幅影像 下面这个就是建立数据库&#xff0c;这个不对 点击确定 合成完毕

Facebook广告账户被封?最全防封及申诉指南

Facebook广告是海外营销的一大利器&#xff0c;但是随着互联网的发展&#xff0c;有部分不法分子正在利用他进行盈利&#xff0c;导致Facebook官方安全审核日益严格&#xff0c;不少卖家遭遇封号问题&#xff01;这篇文章就来教你如何更好地管理 Facebook广告帐户&#xff0c;实…

精品Python的美食推荐系统厨房点餐订餐

《[含文档PPT源码等]精品Python的美食推荐系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、VUE.…

大模型增长时代!低代码和 AI 的能力远不止 APP 开发

从低代码开发引发效率革命&#xff0c;到生成式 AI 打破传统限制、颠覆想象&#xff0c;一个前所未有的创造力时代已然开启。作为这场技术变革的见证者和参与者&#xff0c;让创新技术真正“为己所用”&#xff0c;解锁更多的潜在应用场景和机会&#xff0c;无疑是我们共同的目…