ARM中断练习(打印)

头文件:

#ifndef __GPIO_H__
#define __GPIO_H__

//#include "../common/include/ctype.h"
#include "../common/include/stm32mp1xx_adc.h"
#include "../common/include/stm32mp1xx_gic.h"
#include "../common/include/stm32mp1xx_i2c.h"
#include "../common/include/stm32mp1xx_spi.h"
#include "../common/include/stm32mp1xx_uart.h"
#include "../common/include/stdarg.h"
#include "../common/include/stm32mp1xx_exti.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_tim.h"
#include "../common/include/uart.h"

#include "../include/key.h"

//初始化GPIO章节
void hal_gpio_init();
//初始化RCC章节
void hal_rcc_init();

#endif

功能文件1(key.c):

#include "key.h"            
                             
//初始化RCC章节
void hal_rcc_init()
{
    (RCC->MP_AHB4ENSETR)|=(0x1<<5);
}
//初始化GPIO章节
void hal_gpio_init()
{
    (GPIOF->MODER)&=(~(0x3<<18));
}

//初始化EXTI章节             
void hal_exti_init()         
{                            
	//1.设置外部中断选择寄存器
	(EXTI->EXTICR3)&=(~(0xff<<8));         
	(EXTI->EXTICR3)|=(0x05<<8);
	//2.设置下降沿事件选择寄存器
	(EXTI->FTSR1)|=(0x1<<9);
	//3.设置中断屏蔽寄存器
	(EXTI->C1IMR1)|=(0x1<<9);
	
}                            
//初始化GICD章节             
void hal_gicd_init()         
{                            
    //1.使能GICD层
	(GICD->CTRL)|=(0x1<<0);
	//2.中断设置使能寄存器
	(GICD->ISENABLER[3])|=(0x1<<3);
	//3.设置中断优先级
	(GICD->IPRIORITYR[24])&=(~(0x1f<<27));
	//(GICD->IPRIORITYR[24])|=(0x5<<27);
	//4.设置中断目标分配寄存器
	(GICD->ITARGETSR[24])&=(~(0x3<<24));
	(GICD->ITARGETSR[24])|=(0x1<<24);
	
}                            
//初始化GICC章节             
void hal_gicc_init()         
{                            
	//1.使能GICC层中断
	(GICC->CTRL)|=(0x1<<0);
	//2.设置GICC层中断优先级屏蔽寄存器
	(GICC->PMR)&=(~(0x1f<<3));
	(GICC->PMR)|=(0x1f<<3);
}   

功能文件2(do_irq.c):

#include "key.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
void do_irq(void) 
{
	unsigned int num=0;
	//获取中断号,定义一个num变量接收中断号
	num=(GICC->IAR & 0x3ff);	
	switch(num)
	{
		case 97:
			break;
		case 98:
			break;
		case 99:
			//打印一句话
			printf("hello world");
			delay_ms(500);
			//清除EXTI中挂起标志位
			(EXTI->FPR1)|=(0x1<<9);
			//清除GICD层中断挂起标志位
			(GICD->ICPENDR[3])|=(0x1<<3);
			break;
	}
	//清除中断号
	(GICC->EOIR)=num;	
}

测试文件:

#include "key.h"

extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}

int main()
{

	hal_rcc_init();
	hal_gpio_init();
	hal_exti_init();
	hal_gicd_init();
	hal_gicc_init();

	while(1)
	{
		
	};
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值