ARM day9

news2025/6/24 2:57:13

src/key_it.c

#include "key_it.h"
#include "led.h"
void key_it_config()
{
	//RCC使能GPIOF时钟
	RCC->MP_AHB4ENSETR |= (0x1<<5);
	//设置PF9 PF7 PF8GPIO输入
	//PF9
	GPIOF->MODER &= (~(0x3<<18));
	//PF8
	GPIOF->MODER &= (~(0x3<<16));
	//PF7
	GPIOF->MODER &= (~(0x3<<14));
	//设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
	//PF7
	EXTI->EXTICR2 &= (~(0xFF<<24));
	EXTI->EXTICR2 |= (0x5<<24);
	//PF8
	EXTI->EXTICR3 &= (~(0xFF<<0));
	EXTI->EXTICR3 |= (0x5<<0);
	//PF9
	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);
	//使能组0转发中断GICD_CTLR
	GICC->CTRL |= 0x1;
	//使能中断能转发到待定的CPU接口层GICD_ISENABLERx
	//PF7 97中断
	GICD->ISENABLER[3] |= (0x1<<1);
	//PF7 98中断
	GICD->ISENABLER[3] |= (0x1<<2);
	//PF7 99中断
	GICD->ISENABLER[3] |= (0x1<<3);
	//GICD_ISENABLERx设置中断优先级
	//PF7
	GICD->IPRIORITYR[24] &= (~(0x1F<<11));
	//PF8
	GICD->IPRIORITYR[24] &= (~(0x1F<<19));
	//PF9
	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);
	//使能CPU可以处理组0转发的中断GICC_CTLR
	GICD->CTRL |= 0x1;
	//设置中断优先级掩码GICC_CTLR
	GICC->PMR |= (0x1F<<3);
}
//延时函数
/*void delay(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
	//PE10
	GPIOE->MODER &=(~(0x3f<<16));
	GPIOE->MODER |=(0x15<<16);
	//PB6
	GPIOB->MODER &=(~(0x3<<12));
	GPIOB->MODER |=(0x1<<12);
	//设置推挽输出
	//PE10
	GPIOE->OTYPER &=(~(0x1<<10));
	//PB6
	GPIOB->OTYPER &=(~(0x1<<6));
	//设置2个管脚低速输出
	//PE10
	GPIOE->OSPEEDR &=(~(0x3<<20));
	//PB6
	GPIOB->OSPEEDR &=(~(0x3<<12));
	//PE10
	GPIOE->PUPDR &=(~(0x3<<20));
	//PB6
	GPIOB->PUPDR &=(~(0x3<<12));
}

src/do_irq.c

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

int num1=0,num2=0,num3=0;
void do_irq(void) 
{
	int irqno;//保存中断号
	irqno = GICC->IAR&0X3FF;
	switch(irqno)
	{
		case 99://key1
			//按键1中断处理
			printf("KEY INT1\n");
			//风扇转
			if(num3==0)
			{
				GPIOE->ODR |=(0x1<<9);
				num3++;
			}
			//风扇停
			else if(num3>0)
			{
				GPIOE->ODR &=(~(0x1<<9));
				num3=0;
			}
			//清除挂起中断标志位GICD_ICPENDRx
			GICD->ICPENDR[3] |= (0x1<<3);
			//清除中断触发标志位EXTI_FRR1
			EXTI->FPR1 |= (0x1<<9);
			break;
		case 97://key2
			//按键2中断处理
			printf("KEY INT2\n");
			//蜂鸣器响
			if(num2==0)
			{
				GPIOB->ODR |=(0x1<<6);
				num2++;
			}
			//蜂鸣器停
			else if(num2>0)
			{
				GPIOB->ODR &=(~(0x1<<6));
				num2=0;
			}
			//清除挂起中断标志位GICD_ICPENDRx
			GICD->ICPENDR[3] |= (0x1<<1);
			//清除中断触发标志位EXTI_FRR1
			EXTI->FPR1 |= (0x1<<7);
			break;
		case 98://key3
			//按键3中断处理
			printf("KEY INT3\n");
			//LED1亮
			if(num1==0)
			{
				GPIOE->ODR |=(0x1<<10);
				num1++;
			}
			else if(num1>0)
			{
				GPIOE->ODR &=(~(0x1<<10));
				num1=0;
			}
			//清除挂起中断标志位GICD_ICPENDRx
			GICD->ICPENDR[3] |= (0x1<<2);
			//清除中断触发标志位EXTI_FRR1
			EXTI->FPR1 |= (0x1<<8);
			break;
	}
	//清除处理完的中断号GICC_EOIR
	GICC->EOIR=irqno;
}

include/led.h

#ifndef __LED_H__
#define __LED_H__
//创建寄存器组织结构体
/*
typedef struct
{
	unsigned int moder;
	unsigned int otyper;
	unsigned int ospeedr;
	unsigned int pupdr;
	unsigned int idr;
	unsigned int odr;
}gpio_t;
#define GPIOE (*(gpio_t)0x50006000)
#define GPIOE (*(gpio_t)0x50007000)
#define RCC (*(unsigned int *)0x50000A28)
*/
void deley(int ms);
void all_led_init();
#endif

include/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();
#endif

main.c

#include "myuart.h"
#include "key_it.h"
#include "led.h"
int main()
{
	//char c;
	//char *s;
	uart4_init();//串口初始化
	//中断初始化
	key_it_config();
	//初始化
	all_led_init();
	while(1)
	{
		//保证主程序不结束
		//串口数据收发
		//接受一个字符
		//c=getchar();
		//发送字符
		//putchar(c+1);
		//接受一个字符串
		//s=my_gets();
		//发送一个字符串
		//my_puts(s);
	}
	return 0;
}

结果:

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

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

相关文章

Unity - Normal mapping - Reoriented normal mapping - 重定向法线、混合法线

文章目录 目的核心代码PBR - Filament - Normal mappingShader效果BlendNormal_Hill12BlendNormal_UDNBlendNormals_Unity_Native - 效果目前最好 ProjectReferences 目的 备份、拾遗 核心代码 half3 blended_normal normalize(half3(n1.xy n2.xy, n1.z*n2.z));PBR - Filam…

不是钉钉管理员如何批量复制公司全部人员名单到execl表格里

环境&#xff1a; Win10 专业版 钉钉V7.10.0 问题描述&#xff1a; 不是钉钉管理员,如何批量复制公司全员群里面全面人员名单 公司人员有388多个 解决方案&#xff1a; 1.打开公司全员群&#xff0c;右上角点开设置&#xff0c;点查看全部群成员 2.右侧成员一次复制几个&…

Vue-2.7自定义指令

自定义指令 自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外功能 例如需求&#xff1a;当页面加载时&#xff0c;让元素将获得焦点&#xff08;autofucus在safari浏览器有兼容性&#xff09; 操作dom&#xff1a;dom元素.focus() 太麻烦&#xff01;…

datax同步数据简介

概述 业务中经常会用到数据全量同步和增量同步&#xff0c;用sqlDump只能全量同步&#xff0c;而且数据量大的时候很慢。 阿里的datax目前是一款不错的同步工具 环境要求&#xff1a; jdk:1.8 python:2.7 maven:3.0 3.0的python跑不起来 ps:开源版的datax的mysql驱动还是用…

“零代码”能源管理平台:智能管理能源数据

随着能源的快速增长&#xff0c;有效管理和监控能源数据变得越来越重要。为了帮助企业更好的管理能源以及降低能源成本&#xff0c;越来越多的能源管理平台出现在市面上。 “零代码”形式的能源管理平台&#xff0c;采用IT与OT深度融合为理念&#xff0c;可进行可视化、拖拽、…

【C语言】每日一题(半月斩)——day4

目录 选择题 1、设变量已正确定义&#xff0c;以下不能统计出一行中输入字符个数&#xff08;不包含回车符&#xff09;的程序段是&#xff08; &#xff09; 2、运行以下程序后&#xff0c;如果从键盘上输入 65 14<回车> &#xff0c;则输出结果为&#xff08; &…

RabbitMQ消息中间件概述

1.什么是RabbitMQ RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queue &#xff09;的开源实现。AMQP 的出现其实也是应了广大人民群众的需求&#xff0c;虽然在同步消息通讯的世界里有很多公开标准&#xff08;如 COBAR的 IIOP &#xff0c;或者是 SOAP 等&…

皕杰报表中填报控件显示模式控制问题

填报报表是指能够向数据库上传数据的报表&#xff0c;皕杰报表填报单元格支持多种控件类型&#xff0c;包括文本框、文本域、下拉框、下拉树、单选框、复选框、时间、日期、日期时间… 这些控件类型在web页面上的显示模式在皕杰报表里设置了三种模式&#xff0c;只读、显式显示…

游戏反虚拟机检测方案

近年来&#xff0c;游戏市场高速发展&#xff0c;随之而来的还有图谋利益的游戏黑产。在利益吸引下&#xff0c;游戏黑产扩张迅猛&#xff0c;攻击趋势呈现出角度多样化的特点。 在这一趋势下&#xff0c;游戏安全防护的检测覆盖率显得尤为重要。如果游戏在某一环节出现被绕过…

小白网络安全学习手册

作为一个合格的网络安全工程师&#xff0c;应该做到攻守兼备&#xff0c;毕竟知己知彼&#xff0c;才能百战百胜。 谈起黑客&#xff0c;可能各位都会想到&#xff1a;盗号&#xff0c;其实不尽然&#xff1b;黑客是一群喜爱研究技术的群体&#xff0c;在黑客圈中&#xff0c;一…

毫末AI DAY的智驾弹药:上有「世界模型」,下有3000元方案

作者 | 张祥威 编辑 | 德新 「我们的感知能力可以说能做到识别万物了。」毫末智行在第九届毫末AI DAY上抛出这一豪言。 识别万物的底气&#xff0c;源于毫末的DriveGPT自动驾驶大模型引入了通用语义大模型&#xff0c;可以对交通参与者者、道路环境等做到全面感知。 今年是智…

python pip安装超时使用国内镜像

网络环境差的时候需要我们独立的进行相对应的包下载离线安装&#xff0c;或者给pip 加上 国内的镜像源比如加上清华的镜像源&#xff1a; 参考网址&#xff1a;pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror https://mirrors.tuna.tsinghua…

简单写个JS插件替换网页上的文本

背景&#xff1a; 使用Grafana监控面板&#xff0c;随着项目迭代&#xff0c;页面上几百个图表了&#xff0c;相当一部分和错误码有关&#xff0c;逐个图表单替换维护过于繁琐&#xff0c;于是尝试一键替换grafana面板上的错误码(也就替换网页上特定的文本元素)&#xff0c;原…

禅道如何编辑项目模块

禅道是一个用于项目管理和软件开发的开源工具&#xff0c;它的主要作用包括&#xff1a; 1. 项目管理&#xff1a;禅道可以帮助项目团队进行任务分配、进度跟踪、沟通协作、测试管理等方面的工作&#xff0c;以确保项目能够按时完成。 2. 缺陷追踪&#xff1a;禅道可以记录和…

钉钉数字校园小程序开发:开启智慧教育新时代

随着信息技术的快速发展和校园管理的日益复杂化&#xff0c;数字校园已成为现代教育的重要趋势。钉钉数字校园小程序作为一种创新应用&#xff0c;以其专业性、思考深度和逻辑性&#xff0c;为学校提供了全新的管理、教学和沟方式。本文从需求分析、技术实现和应用思考三个方面…

JAVA学习第一天,java的运行方式

对未来很迷茫&#xff0c;不知道以后能出去干什么&#xff0c;好像掌握的东西很少&#xff0c;从今天开始学习学习java吧&#xff0c;让自己充实起来&#xff0c;记录一下。 jav…

QT快速下载

官网下载安装包后&#xff0c;打开命令行CMD&#xff0c;将qt安装包拖入cmd中 添加–mirror https://mirrors.tuna.tsinghua.edu.cn/qt 回车 按安装步骤安装即可

大模型评测指标与方法

中文大模型评测和英文评测方法是不一致的&#xff0c;原因&#xff1a; 第一、数据集的差异性。中文和英文的文本数据集在种类、规模、质量等方面存在很大的差异&#xff0c;需要针对中文特点开发相应的数据集&#xff0c;以确保评测结果的准确性和公正性。 第二、语言结构和…

计算机毕业设计选什么题目好?springboot 航司互售系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

M-LVDS收发器MS2111可pin对pin兼容SN65MLVD206

MS2111 是多点低压差分(M-LVDS)线路驱动器和接收器&#xff0c;经过优化可在高达 200 Mbps 的信令速率下运行。可pin对pin兼容SN65MLVD206。所有部件均符合 M-LVDS 标准 TIA / EIA-899。该驱动器输出已设计为支持负载低至 30Ω 的多点总线。 MS2111 的接收器属于 Type-2, 它们可…