华清远见作业第五十三天——ARM(第七天)

代码

key_inc.h

#ifndef __KEY_INC_H__
#define __KEY_INC_H__
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
 void key1_it_config();
 void key2_it_config();
 void key3_it_config();
#endif

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);
    //将PF7设置为输入模式
    GPIOF->MODER &= (~(0x3<<14));
  
    //设置由PF9管脚产生EXTI9事件
    //设置由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] &=( ~(0x3<<8));
    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);
    //将PF7设置为输入模式
    GPIOF->MODER &= (~(0x3<<16));
  
    //设置由PF9管脚产生EXTI9事件
    //设置由PF8管脚产生EXTI8事件
    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] &=( ~(0x3<<16));
    GICD->ITARGETSR[24] |= (0x1<<16);
    //设置组0中断可以被转发到GICC层
    GICD->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 97:
        printf("key2_initc\n");
        //清除GICD中断排队标志
        GICD->ICPENDR[3] |= (0X1<<1);
        //清除EXTI中断触发标志
        EXTI->FPR1 |= (0X1<<7);

        break;
    case 98:
        printf("key3_initc\n");
        //清除GICD中断排队标志
        GICD->ICPENDR[3] |= (0X1<<2);
        //清除EXTI中断触发标志
        EXTI->FPR1 |= (0X1<<8);
        break;
    default:
        break;
    }
    //清除IAR寄存器中的中断号
    GICC->EOIR |= irqno;
}

main.c

#include"uart.h"

#include"uart4.h"

#include"led.h"

#include"key_inc.h"

//封装比较函数

int strings_bijiao(const char* str1, const char* str2) {

    while (*str1 && *str2) {

        if (*str1 != *str2) {

            return 0; // 字符不相等,返回0表示字符串不相等

        }

        str1++;

        str2++;

    }

    

    if (*str1 == '\0' && *str2 == '\0') {

        return 1; // 字符串相等

    } else {

        return 0; // 字符串长度不同,不相等

    }

}

//封装延时函数

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;

}

 运行效果

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

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

相关文章

C++概述

目录 一、C关键字&#xff08;63个&#xff09; 二、C几个关键点&#xff1a; 三、C语言缺陷一&#xff1a;命名冲突 四、C新概念&#xff1a;命名空间&#xff08;namespace&#xff09; 五、命名空间的嵌套&#xff1a; 六、展开命名空间&#xff1a;&#xff08;using …

【收藏】什么是API测试?这是我见过的最全的测试指南!

在最近的部署中&#xff0c;当我被问到“什么是API测试&#xff1f;”时&#xff0c;我正与客户一起制定API测试策略。那时我突然意识到&#xff0c;要描述API测试居然是一件如此具有挑战性的事情&#xff0c;即使你如实地描述了它&#xff0c;也往往听起来很无聊和复杂。 好吧…

FloodFill算法——岛屿数量

文章目录 题目解析算法解析代码解析 题目解析 岛屿数量 题目依旧是熟悉的配方&#xff0c;熟悉的味道&#xff0c;还是那个0还是那个1还是那个二维矩阵&#xff0c;这时候BFS和DFS闻着味就来了&#xff0c;我们来看一下这个题目&#xff0c;这个题目也很容易理解如下图有一个…

【No.14】蓝桥杯贪心法|最少硬币问题|活动安排问题(4)|翻硬币|快乐司机|防御力|答疑(C++)

算法优点 容易理解&#xff1a;生活常见 操作简单&#xff1a;在每一步都选局部最优 效率高&#xff1a;复杂度常常是O(1)的 算法缺点 局部最优不一定是全局最优 贪心算法&#xff08;Greedy algorithm&#xff09;&#xff0c;又称贪婪算法。是一种在每一步选择中都采取在…

教你在PC客户端中集成镭速高速传输插件

企业一直以来对文件传输的速度和安全性都有着严苛的要求&#xff0c;传统的FTP/HTTP传输方式因速度慢、易受网络延迟影响、数据包丢失等问题而不再适应现代企业的需求。镭速高速传输插件应运而生&#xff0c;为企业提供了一个快速、安全的文件传输新选择。本文将详细介绍如何在…

代码随想录算法训练营第day54|392.判断子序列 、 115.不同的子序列

目录 392.判断子序列 115.不同的子序列 392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字…

【WEEK4】 【DAY3】整合SSM框架之功能实现—修改、删除数据【中文版】

2024.3.20 Wednesday 接上文【WEEK4】 【DAY2】整合SSM框架之功能实现—总览、添加数据【中文版】 目录 7.6.修改功能7.6.1.修改BookController.java7.6.2.修改allBook.jsp7.6.3.新建updateBook.jsp7.6.4.修改MyBatis-config.xml7.6.5.运行 7.7.删除功能7.7.1.修改BookContro…

unicloud快速上手,unicloud项目创建以及项目创建注意事项

uniCloud快速上手 本项目地址https://gitee.com/qayrup/unicloud-demo 创建unicloud项目 新建一个uni项目,并选择启用unicloud,选择阿里云或腾讯云 阿里云和支付宝云都支持一个月免费的云,如果只想体验啥的,可以选择这两个, 但是需要注意,支付宝云需要配置跨域,否则很多云函…

ModuleNotFoundError: No module named ‘Crypto‘的解决办法

Crypto模块是什么 在Python中&#xff0c;Crypto模块&#xff08;有时也被称为pycrypto&#xff09;是一个强大的加密库&#xff0c;它提供了各种加密算法的实现&#xff0c;包括AES、DES、RSA等。 在Python 3中&#xff0c;由于pycrypto库与新版本的Python3不兼容&#xff0…

DES加密原理及python脚本

一、加密 1、秘钥处理 ​ DES算法会先对64位密钥进行处理生成48位子密钥后再参与到算法的轮操作中&#xff0c;在每一轮的迭代过程中&#xff0c;使用不同的子密钥。其中的处理包括置换选择、循环左移、压缩置换。 1.1 置换选择 DES秘钥有64位&#xff0c;其中每8位有一个校…

[HackMyVM]靶场 XMAS

kali:192.168.56.104 靶机:192.168.56.126 注意在/etc/hosts 添加 192.168.56.126 christmas.hmv # cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 kali2 192.168.223.131 dc-2 192.168.223.134 wordy 192.168.56.105 midn…

【嵌入式开发 Linux 常用命令系列 4.3 -- git add 时单独排除某个目录或者文件】

文章目录 git add 时单独排除某个目录或者文件使用 .gitignore 文件使用命令行排除文件或目录 git add 时单独排除某个目录或者文件 在使用 git add 命令时&#xff0c;如果你想要排除特定的目录或文件&#xff0c;可以使用 .gitignore 文件或使用路径规范来指定不想添加的文件…

智能T0算法交易促进年化收益

T0交易越来越得到普及&#xff0c;越来越多的人在关注T0交易。按照交易主体来看&#xff0c;一种是人工T0交易&#xff0c;另一种是自动化智能T0算法交易。人工T0交易会受制于操作员的计算能力、反应速度以及主观判断等因素的影响&#xff0c;稳定性不如智能自动化T0算法交易。…

搭建自己的博客-拾壹博客

写在前面 唠叨两句 作为一个技术开发人员&#xff0c;没有一个自己的博客&#xff0c;人生注定缺少点什么东西&#xff0c;是不是&#xff1f;最近研究了一些博客搭建&#xff0c;本文是使用开源项目”拾壹博客“进行搭建。 推荐等级 所需技术难度&#xff1a;4星 后续自定义…

GPU云服务器与自建GPU服务器的对比

GPU云服务器是一种基于GPU的计算服务&#xff0c;广泛应用于深度学习、图形图像处理和科学计算等领域。其快速、稳定、灵活的特点使其备受青睐。与标准的CVM云服务器一样&#xff0c;GPU云服务器提供方便快捷的管理方式&#xff0c;通过其强大的计算性能&#xff0c;能够快速处…

直播行业网络安全建设

一、引言 直播行业近年来蓬勃发展&#xff0c;吸引了大量用户和资本的关注。然而&#xff0c;随着行业的壮大&#xff0c;网络安全问题也日益凸显。构建一个安全、稳定的直播行业网络对于保障用户权益、维护行业秩序具有重要意义。本文将详细探讨直播行业安全网络的构建与保障…

zookeeper分布式锁原理剖析

在ZooKeeper的CLI中&#xff0c;create命令用于在指定路径上创建一个新的节点。以下是create命令的参数解释&#xff1a; -s&#xff1a;顺序节点标志。如果指定了该选项&#xff0c;则创建的节点将是顺序节点。顺序节点的名称将以“path”后跟一个连字符和递增的数字序列结尾…

基于python+vue食品安全信息管理系统flask-django-nodejs-php

食品安全信息管理系统设计的目的是为用户提供食品信息、科普专栏、食品检测、检测结果、交流论坛等方面的平台。 与PC端应用程序相比&#xff0c;食品安全信息管理系统的设计主要面向于用户&#xff0c;旨在为管理员和用户提供一个食品安全信息管理系统。用户可以通过APP及时查…

在面对一个大型的代码,需要分文件编写的时候,应该怎么办呢;以及在编写出一个功能时,有人想要买这个功能,怎么在不给出源代码的情况下让买家可以使用这个代码功能呢?

我们一点点来&#xff0c;首先&#xff0c;假设我们要写一个加法功能的实现&#xff0c; 这里是在单个文件里调用函数&#xff0c;实现一个加法的功能&#xff0c; 下面我们把自定义函数放在下面&#xff0c;上面对自定义函数进行一个声明&#xff0c; 下面我们把代码放到多个…

httprunner4详解

httpruuner官方文档:https://httprunner.com/docs/introduction/overview/ 案例1:使用电商开源项目演示: 项目地址:https://github.com/macrozheng/mall 案例2:使用erp2项目演示: 开源项目:http://erp2.hzb-it.com/ 1.Httprunner环境搭建 HttpRunner v4.0 同时采用…