华清远见嵌入式学习——ARM——作业4

news2024/11/18 5:55:49

作业要求:

代码运行效果图:

代码:

do_irq.c:

#include "key_it.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;

//延时函数
void delay(int ms)
{
  int i,j;
  for(i=0;i<ms;i++)
  {
    for(j=0;j<2000;j++);
  }
}

void do_irq(void)
{
    //LED灯初始化
    all_led_init();

    int irqno = (GICC->IAR & 0x3ff);
    switch (irqno)
    {
    case 99: // key1
        printf("KEY1_INT\n");

        //点亮两个灯
        led1_on();
        led3_on();
        delay(1000);

        //熄灭两个灯
        led1_off();
        led_off();
        delay(1000);

        // 清除GICD的中断排队标志
        GICD->ICPENDR[3] |= (0x1<<3);
        // 清除exti的事件触发标志
        EXTI->FPR1 |= (0x1<<9);

        break;
    case 97: // KEY2
        printf("KEY2_INT\n");

        //点亮三个灯
        led1_on();
        led2_on();
        led3_on();
        delay(1000);

        //熄灭三个灯
        led1_off();
        led2_off();
        led3_off();
        delay(1000);

        // 清除GICD的中断排队标志
        GICD->ICPENDR[3] |= (0x1<<1);
        // 清除exti的事件触发标志
        EXTI->FPR1 |= (0x1<<7);

        break;
    case 98: // key3
        printf("KEY3_INT\n");

        //延时点亮三个灯,一个灯亮的同时下个灯灭
        led1_on();
        delay(1000);

        led1_off();
        led2_on();
        delay(1000);

        led2_off();
        led3_on();
        delay(1000);

        led3_off();

        // 清除GICD的中断排队标志
        GICD->ICPENDR[3] |= (0x1<<2);
        // 清除exti的事件触发标志
        EXTI->FPR1 |= (0x1<<8);

        break;
    }
    // 清除中断号
    GICC->EOIR = irqno;
}

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作为EXTI7事件的输入
    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));
}

main.c

#include "key_it.h"

int main()
{
  key1_it_config();
	key2_it_config();
	key3_it_config();
    while (1)
    {
        printf("do main...\n");
        delay(1000);
    }
}

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

模拟面试:

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

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

相关文章

VScode安装Remix.js开发环境

目录 1 Remix.js介绍 2 远程连接方法 3 安装remix环境 4 设置根路由 5 编译运行 6 自己的helloworld 7 总结 书接上回&#xff0c;我们已经完成了vue的基本开发环境配置&#xff0c;并成功跑了第一个vue程序。下面我们要尝试安装remix.js的开发环境。 1 Remix.js介绍 …

00-Git 应用

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具&#xff0c;也称之为代码版本控制工具&#xff0c;代码版本控制或管理的工具用的最多的&#xff1a; svn、 git。 SVN 是采用的 同步机制&#xff0c;即本地的代码版本和服务器的版本保持一致&#xff08;提…

Java中实现百度浏览器搜索功能

要在Java中实现百度浏览器搜索功能&#xff0c;你可以使用Selenium WebDriver。Selenium是一个用于自动化浏览器的工具&#xff0c;WebDriver是Selenium的一个子项目&#xff0c;它提供了一套API&#xff0c;可以直接与浏览器交互。 依赖: <dependencies><dependency…

【http】HTTP/1.0、HTTP/1.1和HTTP/2.0

✨ 专栏介绍 在当今互联网时代&#xff0c;计算机网络已经成为了人们生活和工作中不可或缺的一部分。而要实现计算机之间的通信和数据传输&#xff0c;就需要依靠各种网络协议来进行规范和约束。无论是浏览网页、发送电子邮件还是进行在线交流&#xff0c;都离不开各种各样的网…

【PTA】L1-016 验证身份(C++)

题目链接 &#xff1a; 题目要求&#xff1a; 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0…

手机无人直播:解放直播的新方式

现如今&#xff0c;随着科技的迅猛发展&#xff0c;手机已经成为我们生活中不可或缺的一部分。除了通讯、娱乐等功能外&#xff0c;手机还能够通过直播功能将我们的生活实时分享给他人。而针对传统的直播方式&#xff0c;使用手机进行无人直播成为了一种全新的选择。 手机无人…

H.264宏块(Macroblock)概念(运动估计、变换编码、环路滤波)

参考文章&#xff1a;音视频高手课系列5-h264编码基础(宏块原理) 参考文章&#xff1a;切片slice与宏块&#xff0c;运动矢量 文章目录 使用videoEye分析视频宏块示例H.264宏块概念1. 宏块的定义2. 运动估计3. 变换编码4. 环路滤波5. 注意&#xff1a;宏块的概念既适用于帧内编…

【halcon深度学习】dev_display_dl_data 移植到C# 上篇

效果展示 前言 在研究halcon深度学习的时候,会发现halcon的例程里面用到了大量的二次封装库函数。这些库函数内部也是由基础的算子组成。我们在halcon的开发环境里面用的很爽,但是一旦要在C#中使用,就会报错。 一开始,我想避开这个移植过程,直接使用halcon引擎(HDevEngi…

043、循环神经网络

之——RNN基础 杂谈 第一个对于序列模型的网络&#xff0c;RNN。 正文 1.潜变量自回归模型 潜变量总结过去的信息&#xff0c;再和当前信息一起结合出新的信息。 2.RNN 循环神经网络将观察作为x&#xff0c;与前层隐变量结合得到输出 其中Whh蕴含了整个模型的时序信息&#xf…

2024 年 11 款最佳 Android 数据恢复软件应用

Android 设备上的数据丢失可能是一种令人痛苦的经历&#xff0c;通常会导致不可替代的信息瞬间消失。 意外删除、系统崩溃或格式错误都可能发生&#xff0c;重要数据的丢失可能会扰乱日常工作并影响您的工作效率。 幸运的是&#xff0c;技术进步带来了多种恢复解决方案&…

代码编辑器,代码(JSON,js,Markdown,html,css,java,sql)格式化 fei-editor

效果展示 官方文档&#xff1a; https://ymf930.gitee.io/fei-editor/#/ npm 安装 npm i fei-editor -S # or yarn add fei-editor想要运行下面的示例&#xff0c;除此之外还要安装f-ui-one、brace 引入 在 main.js 中写入以下内容&#xff1a; import { createApp } fr…

Unity AssetBundle学习笔记

目录 基础介绍 动态资源加载 更新和添加内容 打包策略 资源分组 频繁更新的资源 资源压缩 Unload&#xff08;true&#xff09;和Unload&#xff08;false&#xff09; Unload(false) Unload(true) 确定何时卸载 引用计数 场景和状态管理 资源使用频率 内存预算…

信号与线性系统翻转课堂笔记12——时域取样定理

信号与线性系统翻转课堂笔记12 The Flipped Classroom12 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff09;了解信号取样的概念&#xff1…

[Linux] MySQL数据库的备份与恢复

一、数据库备份的分类和备份策略 1.1 数据库备份的分类 1&#xff09;物理备份 物理备份&#xff1a;对数据库操作系统的物理文件&#xff08;如数据文件、日志文件等&#xff09;的备份。 物理备份方法&#xff1a; 冷备份(脱机备份) &#xff1a;是在关闭数据库的时候进…

【教学类-42-04】20231225 X-Y 之间减法题判断题(确保错误题有绝对错误的答案)

作品展示&#xff1a; 背景需求&#xff1a; 做过X-Y 之间减法题判断题&#xff0c;同样的方法做一份减法题 代码展示——乱序 # 乱序版&#xff08;幼儿操作&#xff0c;题目打乱&#xff09;&#xff09; X-Y 之间的所有减法题的判断题3.0&#xff08;随机生成绝对错误答案…

SpringBoot3 Web开发

注&#xff1a;SpringBoot的Web开发能力&#xff0c;由SpringMVC提供。 0. WebMvcAutoConfiguration原理 1. 生效条件 AutoConfiguration(after { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class }) …

PAT 乙级 1030 完美数列

解题思路:这道题首先需要排序&#xff0c;然后双循环找出最大的那个&#xff0c;但一定要注意优化&#xff0c;比如我已经刚好找到临界&#xff0c;或者之后的不用遍历了没意义了&#xff0c;要赶紧跳出循环&#xff0c;否则会超时&#xff0c;另外其实这题还有个范围的坑过&am…

测试服务器带宽(ubuntu)

apt install python3 python3-pippip3 install speedtest-clispeestest-cli

【三维生成】稀疏重建、Image-to-3D方法(汇总)

系列文章目录 总结一下近5年的三维生成算法&#xff0c;持续更新 文章目录 系列文章目录一、LRM&#xff1a;单图像的大模型重建&#xff08;2023&#xff09;摘要1.前言2.Method3.实验 二、SSDNeRF&#xff1a;单阶段Diffusion NeRF的三维生成和重建&#xff08;ICCV 2023&am…

策略模式(组件协作)

策略模式&#xff08;组件协作&#xff09; 链接&#xff1a;策略模式实例代码 注解 目的 正常情况下&#xff0c;一个类/对象中会包含其所有可能会使用的内外方法&#xff0c;但是一般情况下&#xff0c;这些常使用的类都是由不同的父类继承、组合得来的&#xff0c;来实现…