arm实验

news2025/6/21 14:38:54

设置按键中断,按键1按下,LED亮,再次按下,灭

按键2按下,蜂鸣器叫,再次按下,停

按键3按下,风扇转,再次按下,停

头文件

#ifndef __CTRL_KEY_H__
#define __CTRL_KEY_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
void all_led_init();   //初始化灯
void fan_init(); 		//初始化风扇
void voice_init();    //初始化蜂鸣器
void key_config();    //初始化中断
#endif

异常处理文件

#include "ctrl_key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
	int irq_num; //保存中断号
	irq_num = GICC->IAR &0x3ff;
	switch(irq_num)
	{
		//key1
	case 99:
		//按键1中断处理
		printf("KEY1 INT\n");
		//灯亮
		if(GPIOE->ODR &=(0x1<<10))
		{
			GPIOE->ODR &= (~(0x1<<10));
		}
		else
		{
			GPIOE->ODR |=(0x1<<10);
		}
		//清除挂起中断标志位
		GICD->ICPENDR[3] |= (0x1<<3);
		//清除中断触发标志位
		EXTI->FPR1 |=(0x1<<9);
		break;
	case 97:  //key2
		//按键1中断处理
		printf("KEY2 INT\n");
		//蜂鸣器叫
		if(GPIOB->ODR &=(0x1<<6))
		{
			GPIOB->ODR &= (~(0x1<<6));
		}
		else
		{
			GPIOB->ODR |=(0x1<<6);
		}

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

初始化文件

#include "ctrl_key.h"

void key_config()
{
	//RCC使能GPIOF时钟   第5位置1
	RCC->MP_AHB4ENSETR |=(0x1<<5);
	//设置PF9、PF7、PF8的GPIOF输入模式 将[14:19]位置0
	GPIOF->MODER &= (~(0x3f<<14));
	//设置PF9、PF7、PF8产生EXTI事件
	//key2
	EXTI->EXTICR2 &=(~(0xff<<24));
	EXTI->EXTICR2 |=(0x5<<24);
	//key3
	EXTI->EXTICR3 &=(~(0xff));
	EXTI->EXTICR3 |=(0x05);
	//key1
	EXTI->EXTICR3 &=(~(0xff<<8));
	EXTI->EXTICR3 |=(0x05<<8);
	

	//设置事件触发方式为下降沿触发
	EXTI->FTSR1 |= (0x7<<7);
	//设置EXTI事件触发不屏蔽
	EXTI->C1IMR1 |=(0x7<<7);


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

	//使能中断能转发到指定的cpu接口层GICD_ISENABLERx
	//key1
	GICD->ISENABLER[3] |=(0x1<<3);
	//key2
	GICD->ISENABLER[3] |=(0x1<<1);
	//key3
	GICD->ISENABLER[3] |=(0x1<<2);
	//GICD_IPRIORITYRx寄存器 设置中断优先级
	//key1优先级
	GICD->IPRIORITYR[24] &= (~(0x1f<<27));
	//Key2优先级
	GICD->IPRIORITYR[24] &= (~(0x1f<<11));
	//key3优先级
	GICD->IPRIORITYR[24] &= (~(0x1f<<19));
	//设置当前中断被转发到哪一个cpu处理GICD_ITARGETSRx
	GICD->ITARGETSR[24] &= (~(0x3<<24));
	GICD->ITARGETSR[24] |= (0x1<<24);
	GICD->ITARGETSR[24] &= (~(0x3<<8));
	GICD->ITARGETSR[24] |= (0x1<<8);
	GICD->ITARGETSR[24] &= (~(0x3<<16));
	GICD->ITARGETSR[24] |= (0x1<<16);
	//使能cpu可以处理组0转发的中断GICC_CTLR
	GICC->CTRL |=(0x1);
	//设置中断优先级掩码GICC_PMR
	GICC->PMR |=(0x1f<<3);  //设置最低优先级
}

//初始化灯、
void all_led_init()
{
	//RCC使能
	RCC->MP_AHB4ENSETR |= (0x3<<4);
	//设置为输出模式
	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 fan_init()    //PE9
{
	//RCC使能GPIOE
	RCC->MP_AHB4ENSETR |= (0x1<<4);
	//设置为输出模式
	GPIOE->MODER &= (~(0x3<<18));
	GPIOE->MODER |= (0x1<<18);
	//设置推挽输出
	GPIOE->OTYPER &= (~(0x1<<9));	
}

//初始化蜂鸣器
void voice_init()   //PB6
{

	//RCC使能GPIOB
	RCC->MP_AHB4ENSETR |=(0x1<<1);
	//设置输出模式
	GPIOB->MODER &= (~(0x3<<12));
	GPIOB->MODER |= (0x1<<12);
	//设置推挽输出
	GPIOB->OTYPER &=(~(0x1<<6));
	
}

调试主文件

#include "ctrl_key.h"

int main()
{
	//初始化灯
	all_led_init();
	//初始化风扇
	fan_init();

	//初始化蜂鸣器
	voice_init();
	//中断初始化
	key_config();
	while(1)
	{
		//保证程序不结束
	}
	return 0;
}

实验效果:

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

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

相关文章

python 操作FT232H——(1)准备工作与IO输出方波信号

1.准备工作&#xff1a; python环境&#xff1a; 安装python 环境&#xff0c;我目前使用的是pycharm2023.2.1 community Edition 版本 需要注意设置python解释器的版本及关联本地库&#xff0c;这样就不需要在新的工程中安装库文件了&#xff0c;&#xff08;当然也有缺点&…

Activity页面不显示toolbar

页面显示如下&#xff0c;显示toolbar, 想实现不显示toolbar&#xff0c; 1、在manifest里设置 android:theme"style/AppThemeNoTitle"&#xff0c;可以隐藏&#xff0c;但是整个页面显示为透明的了&#xff0c;activity整体类型发生改变 2、或者设置这个&#xf…

如何逐步掌握STM32开发技巧?

第一步&#xff1a;建立开发环境 选择Keil MDK等开发环境&#xff0c;根据芯片型号安装相应库。 第二步&#xff1a;备齐开发板和资料 选择最小系统板&#xff0c;可自行搭建外围电路&#xff0c;更深入了解硬件。 第三步&#xff1a;了解STM32 观看视频教程&#xff0c;快速…

03 独立看门狗 hal库 stm32cubemx

1.设置配置参数 > 2.初始化 IWDG_HandleTypeDef hiwdg;/* IWDG init function */ void MX_IWDG_Init(void) //Tout((42^prer) rlr) /40 // IWDG_PRESCALER_8 (42^prer) 8/40 *5*2000 64/40 *4095 ---6s {/* USER CODE BEGIN IWDG_Init 0 *//* USER CODE END IWDG_…

python-arima模型statsmodels库实现-有数据集(续)-statsmodels-0.9.0版本

python-arima模型statsmodels库实现-有数据集&#xff08;续&#xff09; 这篇博客是上一篇python-arima模型statsmodels库实现的续集&#xff0c;上一篇采用的statsmodels版本应该要高一点&#xff0c;如果使用低版本的statsmodels代码会有bug&#xff0c;这一篇则是针对stat…

docker制作自定义版本的jdk镜像

1、下载jdk版本&#xff0c;这里以jdk1.8.0_381为例 Java Downloads | Oracle 2、创建Dockerfile文件 此操作在安装有docker环境的centos系统下操作&#xff0c;如果没有安装请参考此文章&#xff1a;http://t.csdnimg.cn/NCCRB vim Dockerfile From debian MAINTAINER "…

Arya小科普 | 硬件软件基础知识 Java语言的前世今生 James Gosling老爷子的小故事 Java下载 和 IDEA工具

前言 1.从硬件到软件的计算机基础知识&#xff1b; 2.Java之父的小故事&#xff1b; 3.Java语言的前世今生&#xff0c;及其特点&#xff1b; 4.Java下载 和 IDEA工具&#xff1b; 硬件和软件 键盘就是硬件&#xff0c; 操作系统就是软件。 硬件&#xff1a;设备和计算机打交…

核货宝:服装店收银系统必备的五大功能

收银系统对于服装店的经营至关重要&#xff0c;它不仅能简化收银流程&#xff0c;还能提供实时数据和综合报告&#xff0c;帮助店主更好地管理店铺。在选择服装店收银系统时&#xff0c;有五个必备功能需要考虑。本文将介绍这五大功能&#xff0c;并解释其在服装店中的重要性。…

我发现了计算机专业,能拉开很大差距的方式,计算机大一新生必看!

这个社会实在是太卷了&#xff0c;而程序员又是一个不断学习的行业。因此&#xff0c;如果你特别想和别人有一定差距&#xff0c;千万不能让自己信息闭塞。只要你多了解一些学习资源&#xff0c;学习更努力一些&#xff0c;就能离成功更近一步✨&#xff01; 下面&#xff0c;就…

Java开发-参数校验@NotEmpty、@NotBlank、@NotNull

大家好&#xff0c;我是小资。今天给大家说下参数校验。 标题中说的这三个注解所在的包路径为import javax.validation.constraints.*; 千万不要导错包哦&#xff0c;因为他们在好多包里都存在。开发只需引入Spring-web依赖就可以使用了。轻轻松松干掉多余的if-else。 下面我…

NiFi中缓存组件的运行机制及增删改缓存数据

要理解本文内容,需对NIFI有一定的了解,如果您是新手,想学习NIFI,或者想在数仓架构中引入NIFI,欢迎加我微信bigdata_work,我这有一整套使用NIFI的实时数仓落地方案。 在建设实时数仓的过程中,利用缓存机制来提升实时指标的实时性,是一种常用的方法。NIFI提供了专门的缓存…

Git相关知识(2)

目录 1.远程操作 1.基本认识 2.克隆远程仓库 3.向远端仓库推送 4.从远程仓库中拉取 5.忽略特殊文件 6.配置命令别名 2.标签管理 1.本地的标签 2.远端的标签 3.多人协作 1.远端同一个分支 2.远端不同的分支 4.企业级开发模型 1.交付软件流程 2.系统开发环境 1.…

振弦采集仪应用水坝安全监测的方案

振弦采集仪应用水坝安全监测的方案 随着工业化和城市化的快速发展&#xff0c;水资源的开发和利用越来越广泛。由于水坝在水利工程中起着至关重要的作用&#xff0c;因此对水坝进行安全监测变得越来越必要。为了实现对水坝的安全监测&#xff0c;振弦采集仪可以作为一种有效的…

Python+高光谱数据预处理-机器学习-深度学习-图像分类-参数回归

涵盖高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。结合Python编程工具&#xff0c;专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&#xf…

SRC-记一处目录遍历

目录 安徽阳光心理测量平台目录遍历 FOFA指纹 漏洞复现 修复方案 hack渗透视频教程&#xff0c;扫码免费领 安徽阳光心理测量平台目录遍历 FOFA指纹 title"心理测量平台" 漏洞复现 路由后拼接/admin/UserFiles/ GET /admin/UserFiles/ HTTP/1.1 Host: {{Hostn…

关于pytorch不区分行向量与列向量的理解

听李沐老师讲深度学习时候解释pytorch不区分行向量和列向量&#xff0c;只相当于是一维数组&#xff0c;一维张量一定是行向量&#xff0c;相当于数组&#xff0c;而行列向量可以放到矩阵中看。 测试如下&#xff1a; rtorch.tensor([1,2,3],dtypetorch.float32) print(r,r.T…

Spring Boot中发送邮件时,如何让发件人显示别名

之前&#xff0c;我们通过一系列文章&#xff0c;介绍了如何在Spring Boot中发送邮件&#xff1a; 发送邮件添加附件引用静态资源邮件模版 已经包含了大部分的应用场景。但最近DD在做YouTube中文配音的时候&#xff0c;碰到一个问题&#xff1a; 如上图所示&#xff0c;收件人…

Android开发APT技术,与使用案例

annotationProcessor 是 javac 的一个工具&#xff0c;全称为 APT&#xff08;apt 工具&#xff0c;Annotation Processor Tool&#xff09;&#xff0c;它用来在编译时扫描和处理注解&#xff0c;获取注解和被注解对象的相关信息&#xff0c;然后根据注解自动生成 java 代码。…

【arm实验2】按键中断事件控制实验

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再次按下&#xff0c;灭 按键2按下&#xff0c;蜂鸣器叫&#xff0c;再次按下&#xff0c;停 按键3按下&#xff0c;风扇转&#xff0c;再次按下&#xff0c;停 主函数&#xff1a; linuxlinux:~/study/08-c$…

江苏建筑模板厂家-建筑模板批发供应商

江苏建筑模板厂家在建筑行业中扮演着重要的角色。建筑模板是建筑施工中不可或缺的一部分&#xff0c;用于支撑混凝土浇筑过程中的形状和结构。在江苏地区的气候地形、经济发展和建筑风格等方面的考虑下&#xff0c;我们将对几种常见的建筑模板材料进行比较&#xff0c;包括钢模…