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

news/2024/10/17 6:27:32/

作业要求:

代码运行效果图:

代码:

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: // key1printf("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: // KEY2printf("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: // key3printf("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中断被转发到GICCGICD->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中断被转发到GICCGICD->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中断被转发到GICCGICD->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));//LED2GPIOF_MODER &=(~(0X3<<20));//设置Pf10输出GPIOF_MODER |= (0X1<<20);//设置Pf10为推挽输出GPIOF_OTYPER &=(~(0x1<<10));//Pf10为低速输出GPIOF_OSPEEDR &= (~(0x3<<20));//设置无上拉下拉GPIOF_PUPDR &= (~(0x3<<20));//LED3GPIOE_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.ppmy.cn/news/1283296.html

相关文章

5+共病+WGCNA+实验。共病+实验搭配是经典的得分套路

今天给同学们分享一篇生信文章“Adipocyte dysfunction promotes lung inflammation and aberrant repair: a potential target of COPD”&#xff0c;这篇文章发表在Front Endocrinol (Lausanne)期刊上&#xff0c;影响因子为5.2。 结果解读&#xff1a; 肥胖对慢性阻塞性肺疾…

技术阅读周刊第十一期

技术阅读周刊&#xff0c;每周更新。 历史更新 20231124&#xff1a;第七期20231201&#xff1a;第八期20231215&#xff1a;第十‍期 A Comprehensive guide to Spring Boot 3.2 with Java 21, Virtual Threads, Spring Security, PostgreSQL, Flyway, Caching, Micrometer, O…

mybatis的一级缓存使用以及禁用

目录 验证代码如下 mappper 代码 xml 中代码 实际执行代码 执行结果 DefaultSqlSession CachingExecutor BaseExecutor PerpetualCache 总结 禁用一级缓存 mapper 对应的 xml 的 select 查询设置 flushCache 属性为 true MappedStatement 的内部类 Builder 向外部变…

SpringMVC:整合 SSM 上篇

文章目录 SpringMVC - 03整合 SSM 上篇一、准备工作二、MyBatis 层1. dao 层2. service 层 三、Spring 层四、SpringMVC 层五、执行六、说明 SpringMVC - 03 整合 SSM 上篇 用到的环境&#xff1a; IDEA 2019&#xff08;JDK 1.8&#xff09;MySQL 8.0.31Tomcat 8.5.85Maven…

list集合

List集合 List集合的概述 有序集合&#xff08;也称之为序列&#xff09;&#xff0c;用户可以精确的控制列表中的每个元素的插入位置。用户可以通过整数索引访问元素&#xff0c;并搜索列表中的元素 与 Set 集合不同&#xff0c;列表通常允许重复的元素 List 集合的特点 有…

7.7、kali linux环境下搭建DVWA

目录 一、资料下载准备工作 1.1、DVWA源代码下载 二、开启Apache、mysql服务 2.1、下载Apache2文件 2.2、开启Apache2服务 方法一&#xff1a;开启Apache2服务&#xff08;手动&#xff09; 方法二&#xff1a;开启Apache2服务&#xff08;系统自启动&#xff09; 2.3、…

【AI】人工智能本地环境集成安装

目录 1、基础安装 1.1 GPU安装 1.1.1 GPU版本支持 1.1.2 下载CUDA 1.1.3安装CUDA 1.1.4配置环境变量 1.1.5检测CUDA是否安装成功 1.2 CUDNN安装 1.2.1 下载CUDNN 1.2.2 添加配置 1.2.3验证结果 2、pytorch安装

centos 安装oracle 11.2.04 并配置数据库自启动操作记录,一次完成

环境&#xff1a; centos版本7.3&#xff0c;安装的有图形化界面 Oracle11.2.04&#xff0c;之所以选择这个版本是因为网上有人说11其他版本的在安装的过程中会出现这样或那样的问题&#xff0c;下载地址放到文章下面 步骤&#xff0c;按顺序&#xff1a; 1、创建安装Oracle…