ARM-day9作业

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

现象:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值