ARM-day9作业

news2025/4/19 10:56:23

main.c:

#include "uart.h"

#include "key_it.h"



int main()

{

	char c;

	char *s;

	uart4_init();    //串口初始化



	//中断初始化

	key_it_config();

	key3_it_config();



	//完成GPIO相关初始化

	all_led_init();



	//风扇初始化

    fs_init();



	//蜂鸣器初始化

    fmq_init();



	while(1)

	{

		//保证主程序不结束

	}

	

	return 0;



}



key_it.c:

#include"key_it.h"

void key3_it_config()
{
	RCC->MP_AHB4ENSETR |= (0x1<<5);
	GPIOF->MODER &= (~(0x3<<16));
	EXTI->EXTICR3 &= (~(0xFF)<<0);
	EXTI->EXTICR3 |= (0x5<<0);
	EXTI->FTSR1 |= (0x1<<8);	
	EXTI->C1IMR1 |= (0x1<<8);	
	GICD->ISENABLER[3] |= (0x1<<2);
	GICD->IPRIORITYR[24] &= (~(0x1F<<19));	
	GICD->ITARGETSR[24] &= (~(0x3<<16));
	GICD->ITARGETSR[24] |= (0x1<<16);
}

void key_it_config()
{
	//RCC使能GPIOF时钟
	RCC->MP_AHB4ENSETR |= (0x1<<5);

	//设置PF9、PF7、PF8 GPIO输入
	//PF9
	GPIOF->MODER &= (~(0x3<<18));
	//PF8
	GPIOF->MODER &= (~(0x3<<16));
	//PF7
	GPIOF->MODER &= (~(0x3<<14));	

	//设置PF9、PF7、PF8产生EXIT事件 EXTI_EXTICRx
	//PF7
	EXTI->EXTICR2 &= (~(0xFF)<<24);
	EXTI->EXTICR2 |= (0x5<<24);
	//PF8
	EXTI->EXTICR3 &= (~(0xFF)<<0);
	EXTI->EXTICR3 |= (0x5<<0);
	//PF7
	EXTI->EXTICR3 &= (~(0xFF)<<8);
	EXTI->EXTICR3 |= (0x5<<8);
	
	//设置事件触发方式为下降沿触发EXTI_FTSR1
	//PF7
	EXTI->FTSR1 |= (0x1<<7);	
	//PF8
	EXTI->FTSR1 |= (0x1<<8);	
	//PF9
	EXTI->FTSR1 |= (0x1<<9);

	//设置EXTI事件触发不屏蔽EXTI_IMR1
	//PF7
	EXTI->C1IMR1 |= (0x1<<7);	
	//PF8
	EXTI->C1IMR1 |= (0x1<<8);	
	//PF9
	EXTI->C1IMR1 |= (0x1<<9);
	
	//使能中断能转发到特定的CPU接口层GICD_ISENABLERx
	//PF7 97号中断
	GICD->ISENABLER[3] |= (0x1<<1);
	//PF8 98号中断
	GICD->ISENABLER[3] |= (0x1<<2);
	//PF9 99号中断
	GICD->ISENABLER[3] |= (0x1<<3);	

	//GICD_ISENABLERx设置中断优先级
	//PF7
	GICD->IPRIORITYR[24] &= (~(0x1F<<11));
	//PF8
	GICD->IPRIORITYR[24] &= (~(0x1F<<19));	
	//PF7
	GICD->IPRIORITYR[24] &= (~(0x1F<<27));

	//设置当前中断被转发到那一个cpu处理GICD_ITARGETSRx
	//PF7 97中断
	GICD->ITARGETSR[24] &= (~(0x3<<8));
	GICD->ITARGETSR[24] |= (0x1<<8);
	//PF8 98中断
	GICD->ITARGETSR[24] &= (~(0x3<<16));
	GICD->ITARGETSR[24] |= (0x1<<16);
	//PF9 99中断
	GICD->ITARGETSR[24] &= (~(0x3<<24));
	GICD->ITARGETSR[24] |= (0x1<<24);

	//使能组0转发中断GICD_CTLR
	GICD->CTRL |= 0x1;

	//设置中断优先级掩码GICC_CTLR
	GICC->PMR |= (0x1F<<3);

	//使能CPU可以处理组0转发的中断GICC_CTLR
	GICC->CTRL |= 0x1;
 }

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

//GPIO初始化
void all_led_init()
{
	//RCC使能
	RCC->MP_AHB4ENSETR |= (0x3<<4);

	//设置PE10、PF10、PE8为输出
	GPIOE->MODER &= (~(0x3<<20));
	GPIOE->MODER |= (0x1<<20);
	GPIOF->MODER &= (~(0x3<<20));
	GPIOF->MODER |= (0x1<<20);
	GPIOE->MODER &= (~(0x3<<16));
	GPIOE->MODER |= (0x1<<16);

	//设置推挽输出
	GPIOE->OTYPER &= (~(0x1<<10));
	GPIOF->OTYPER &= (~(0x1<<10));
	GPIOE->OTYPER &= (~(0x1<<8));

	//设置三个管脚低速输出
	GPIOE->OSPEEDR &= (~(0x3<<20));
	GPIOF->OSPEEDR &= (~(0x3<<20));
	GPIOE->OSPEEDR &= (~(0x3<<16));

	//设置三个管脚输出时无上拉电阻和下拉电阻
	GPIOE->PUPDR &=(~(0x3<<20));
	GPIOF->PUPDR &=(~(0x3<<20));
	GPIOE->PUPDR &=(~(0x3<<16));
}

//风扇初始化
void fs_init()
{
	//RCC使能
	RCC->MP_AHB4ENSETR |= (0x1<<4);

	//设置PE9为输出
	GPIOE->MODER &= (~(0x3<<18));
	GPIOE->MODER |= (0x1<<18);
	//设置推挽输出
	GPIOE->OTYPER &= (~(0x1<<9));
	//设置管脚低速输出
	GPIOE->OSPEEDR &= (~(0x3<<18));
	//设置管脚输出时无上拉电阻和下拉电阻
	GPIOE->PUPDR &=(~(0x3<<18));
}

//蜂鸣器初始化
void fmq_init()
{
	//RCC使能
	RCC->MP_AHB4ENSETR |= (0x1<<1);

	//设置PB6为输出
	GPIOB->MODER &= (~(0x3<<12));
	GPIOB->MODER |= (0x1<<12);
	//设置推挽输出
	GPIOB->OTYPER &= (~(0x1<<6));
	//设置管脚低速输出
	GPIOB->OSPEEDR &= (~(0x3<<12));
	//设置管脚输出时无上拉电阻和下拉电阻
	GPIOB->PUPDR &=(~(0x3<<12));
}

do_irq.c:

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

void do_irq(void) 
{
	int irqno;   //保存中断号
	irqno=GICC->IAR & 0x3FF;
	switch(irqno)
	{
	case 99://key1
		{
			//按键1中断处理
			printf("KEY1 INT\n");
			if((GPIOE->ODR==(GPIOE->ODR&(~(0x1<<10))))&&(GPIOF->ODR==(GPIOF->ODR&(~(0x1<<10))))&&(GPIOE->ODR==(GPIOE->ODR&(~(0x1<<8)))))
			{
				GPIOE->ODR |= (0x1<<10);
				GPIOF->ODR |= (0x1<<10);
				GPIOE->ODR |= (0x1<<8);
			}
			else if((GPIOE->ODR==(GPIOE->ODR|(0x1<<10)))&&(GPIOF->ODR==(GPIOF->ODR|(0x1<<10)))&&(GPIOE->ODR==(GPIOE->ODR|(0x1<<8))))
			{
				GPIOE->ODR &= (~(0x1<<10));				
				GPIOF->ODR &= (~(0x1<<10));				
				GPIOE->ODR &= (~(0x1<<8));				
			}
			//清除挂起中断标志位GICD_ICPENDRx
			GICD->ICPENDR[3] |= (0x1<<3);
			//清除中断触发标志位EXTI_FPR1
			EXTI->FPR1 |= (0x1<<9);
			break;
		}
	case 97://key2
		{
			//按键2中断处理
			printf("KEY2 INT\n");
			if(GPIOB->ODR==(GPIOB->ODR&(~(0x1<<6))))
			{
				GPIOB->ODR |= (0x1<<6);
			}
			else if(GPIOB->ODR==(GPIOB->ODR|(0x1<<6)))
			{
				GPIOB->ODR &= (~(0x1<<6));
			}

			//清除挂起中断标志位GICD_ICPENDRx
			GICD->ICPENDR[3] |= (0x1<<1);
			//清除中断触发标志位EXTI_FPR1
			EXTI->FPR1 |= (0x1<<7);
			break;
		}
	case 98://key3
		{
			//按键3中断处理
			printf("KEY3 INT\n");
			if(GPIOE->ODR==(GPIOE->ODR&(~(0x1<<9))))
			{
				GPIOE->ODR |= (0x1<<9);
			}
			else if(GPIOE->ODR==(GPIOE->ODR|(0x1<<9)))
			{
				GPIOE->ODR &= (~(0x1<<9));
			}

			//清除挂起中断标志位GICD_ICPENDRx
			GICD->ICPENDR[3] |= (0x1<<2);
			//清除中断触发标志位EXTI_FPR1
			EXTI->FPR1 |= (0x1<<8);
			break;
		}
	}

	//清除处理完的中断号GICC_EOIR
	GICC->EOIR=irqno;

}

key_it.h:

#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_exti.h"
#include"stm32mp1xx_gic.h"

void key_it_config();
void key3_it_config();
void deley(int ms);
void all_led_init();
void fs_init();
void fmq_init();

#endif

现象:

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

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

相关文章

只有线上出了bug,老板们才知道测试的价值?

有同学说&#xff0c;测试没价值&#xff0c;我们测试团队刚被拆散了。 也有同学说&#xff0c;公司不重视测试&#xff0c;我觉得我们就是测试得太好了。哪天线上出个bug&#xff0c;老板们就知道测试的价值了。 还有人给测试同学规划职业发展路径&#xff0c;就是不做测试&…

C语言 —— 操作符

1. 操作符的分类 算术操作符: - * / % 移位操作符: << >> 位操作符: & | ^ 赋值操作符: - 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术操作符 - * / % 注意 /操作符: 对于整型的除法运算结果依然是整数…

十六、代码校验(2)

本章概要 前置条件 断言&#xff08;Assertions&#xff09;Java 断言语法Guava 断言使用断言进行契约式设计检查指令前置条件后置条件不变性放松 DbC 检查或非常严格的 DbCDbC 单元测试 前置条件 前置条件的概念来自于契约式设计(Design By Contract, DbC), 利用断言机制…

JavaWeb---Servlet

1.Srvlet概述 Servlet是运行在java服务器端的程序&#xff0c;用于接收和响应来着客户端基于HTTP协议的请求 如果想实现Servlet的功能&#xff0c;可以通过实现javax。servlet。Servlet接口或者继承它的实现类 核心方法&#xff1a;service&#xff08;&#xff09;&#xf…

vue七牛云视频直传

完成后样式&#xff1a; 下面的代码是我自己项目里面用到的&#xff0c;一些判断看自己情况去掉&#xff0c;用的是element-ui组件 安装 uuid 库。你可以使用 npm 或 yarn 来完成安装。在终端中执行以下命令&#xff1a; npm install uuidhtml部分 <el-upload class&quo…

海外接单被没收百万收入并处以罚款,承德的这位程序员到底做了什么?

相信在接单圈混的程序员最近都听说了吧&#xff0c;承德的一位程序员因为翻墙接单被没收了105.8万的收入&#xff0c;还被处了10万的罚款&#xff0c;事件一出瞬间登上了热搜并在接单圈广为传播&#xff0c;如果你还没有听说过&#xff0c;也不用担心&#xff0c;现在我就先来给…

webmin远程命令执行漏洞

文章目录 漏洞编号&#xff1a;漏洞描述&#xff1a;影响版本&#xff1a;利用方法&#xff08;利用案例&#xff09;&#xff1a;安装环境漏洞复现 附带文件&#xff1a;加固建议&#xff1a;参考信息&#xff1a;漏洞分类&#xff1a; Webmin 远程命令执行漏洞&#xff08;CV…

python:使用卷积神经网络(CNN)进行回归预测

作者:CSDN @ _养乐多_ 本文详细记录了从Excel或者csv中读取用于训练卷积神经网络(CNN)模型的数据,包括多个自变量和1个因变量数据,以供卷积神经网络模型的训练。随后,我们将测试数据集应用于该CNN模型,进行回归预测和分析。 该代码进一步修改可用于遥感影像回归模型. …

CentOS7 NTP客户端的时间同步详解

需求&#xff1a;在CentOS7下配置NTP客户端时间同步服务 简介&#xff1a; NTP服务是为了时钟同步使用&#xff0c;特别在一些实时性数据库场景中非常重要。 Centos7下默认使用chronyd服务代替过渡ntpd服务&#xff0c;因此经常遇到大部分人还是记住ntpd服务而不去配置chronyd服…

spring6使用启用Log4j2日志框架

文章目录 Log4j2日志概述1. 引入Log4j2依赖2. 加入日志配置文件3. 测试 Log4j2日志概述 在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息&#xff…

小型企业必备的重要项目管理软件工具推荐!

大多数项目管理软件都包含有助于规划、协作和进度管理的工具。下面列出了在小型团队的项目管理软件中寻找的基本功能。 1、应用内交流 优秀的项目管理软件允许应用程序内通信、向团队成员发送通知以及使用内置聊天功能促进安全协作。 2、仪表盘 仪表板提供个人、团队和部门…

二十、自定义类型:枚举和联合

1 枚举类型 1.1 枚举类型的声明 例&#xff1a; enum Day//星期 {Mon,Tues,Wed,Thur,Fri,Sat,Sun }; enum Sex//性别 {MALE,FEMALE,SECRET }&#xff1b; enum Color//颜⾊ {RED,GREEN,BLUE };以上定义的enum Day&#xff0c;enum Sex&#xff0c;enum Color都是枚举类型。{…

超赞的AI文案生成器!真的什么都能写~

姐妹们&#xff0c;这个AI文案生成器真的太强了&#xff01; 种草笔记、爆款标题、短视频脚本、工作总结、自定义小说生成......只要输入关键词&#xff0c;就能生成一篇专业又优秀的文章&#xff0c;真的太绝了~ 小橙需&#xff1a;写作火火 安卓ios都可用 使用简单&#…

快上车,LLM专列:想要的资源统统给你准备好了

如有转载&#xff0c;请注明出处。欢迎关注微信公众号&#xff1a;低调奋进。​ (嘿嘿&#xff0c;有点标题党了​。最近整理了LLM相关survey、开源数据、开源代码等等资源&#xff0c;后续会不断丰富内容&#xff0c;省略大家找资料浪费时间。闲言少叙&#xff0c;正式发车&a…

【苍穹外卖 | 项目日记】第二天

前言&#xff1a; 坦率的讲今天有点水&#xff0c;课也多&#xff0c;上了一天课&#xff0c;中午下课后和晚上十一点多跑完步回来写了两个接口 目录 前言&#xff1a; 今日完结任务&#xff1a; 今日收获&#xff1a; 1.实现了公共字段填充功能 2.实现了文件上传接口 杂项…

35道Rust面试题

这套Rust面试题包括了填空题、判断题、连线题和编码题等题型。 选择题 1 &#xff0c;下面哪个是打印变量language的正确方法&#xff1f; A&#xff0c;println("{}", language); B&#xff0c;println(language); C&#xff0c;println!("{}", langu…

【已修复】vcruntime140.dll有什么用,vcruntime140.dll缺失如何修复

我是网友&#xff0c;今天非常荣幸能够在这里和大家分享关于电脑找不到vcruntime140.dll无法继续执行代码的解决方法。我相信&#xff0c;在座的许多朋友都曾遇到过这个问题&#xff0c;而今天我将为大家介绍五种有效的解决方法。 首先&#xff0c;让我们来了解一下vcruntime1…

stm32mp157中断简单应用

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 main.c #include "gpio.h" #include &…

99 # mongo 的基本安装和配置

关系型数据库和非关系型数据库 MySQL Oracle SqlServer 用一种关系模型来组织数据的数据库&#xff08;查询方便&#xff0c;不方便拓展&#xff09;nosql mongo redis memcached &#xff08;不同于传统的关系数据库&#xff09; mongo 特点 分布式&#xff1a;文档类型&am…

地下城堡3魂之诗阵容搭配攻略

在地下城堡3魂之诗游戏中&#xff0c;拥有一个合理搭配的阵容非常关键&#xff0c;可以让角色能力发挥最大化。以下是建议的阵容搭配及攻略&#xff1a; 关注【娱乐天梯】&#xff0c;获取内部福利号 1.核心成员(2名) 在阵容中选择两个输出型角色作为核心成员&#xff0c;他们的…