底层 5.28 作业

1、实现三个按键代码,代码截图现象截图  

(1)key.h

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

void hal_exit_init();
void hal_gicd_init();
void hal_gicc_init();



#endif

(2)key.c

#include "key.h"
void hal_exit_init()
{
	//RCC章节初始化
	//GPIOF 使能
	RCC->MP_AHB4ENSETR |=(0x1<<5);
	//GPIO章节初始化
	GPIOF->MODER &= (~(0x3<<18)); //key1 PF9
    GPIOF->MODER &= (~(0x3<<14)); //key2 PF7
    GPIOF->MODER &= (~(0x3<<16)); //key3 PF8
	//exti章节初始化
	//1.外部中断选择寄存器  EXTI_EXTICRx
    //key1 PF9 ==> EXTI9(EXTI_EXTICR3寄存器中)
    EXTI->EXTICR3 &= (~(0xff<<8));
    EXTI->EXTICR3 |= (0x05<<8);
 
    //key2 PF7 ==> EXTI7(EXTI_EXTICR2寄存器中)
    EXTI->EXTICR2 &= (~(0xff<<24));
    EXTI->EXTICR2 |= (0x05<<24);
 
    //key3 PF8 ==> EXTI8(EXTI_EXTICR3寄存器中)
    EXTI->EXTICR3 &= (~(0xff<<0));
    EXTI->EXTICR3 |= (0x05<<0);
 
    //2.外部中断下降沿触发选择寄存器
    //key1 PF9 ==> EXTI9 ----> 事件9
    EXTI->FTSR1 |= (0x1<<9);
    //key2 PF7 ==> EXTI7 ----> 事件7
    EXTI->FTSR1 |= (0x1<<7);
    //key3 PF8 ==> EXTI8 ----> 事件8
    EXTI->FTSR1 |= (0x1<<8);

	//3.外部中断屏蔽寄存器
    //key1 PF9 ==> EXTI9 ----> 事件9
    EXTI->C1IMR1 |= (0x1<<9);   //置1取消屏蔽
    //key2 PF7 ==> EXTI7 ----> 事件7
    EXTI->C1IMR1 |= (0x1<<7);
    //key3 PF8 ==> EXTI8 ----> 事件8
    EXTI->C1IMR1 |= (0x1<<8);

    //4.外部中断下降沿挂起寄存器==>可读可写
    //读0:无中断产生 1:有中断产生   写0:不清除中断挂起标志位 写1:清除中断挂起标志位
    //key1 PF9 ==> EXTI9 ----> 事件9
    EXTI->FPR1 |= (0x1<<9);   //置1清除中断挂起标志位
    //key2 PF7 ==> EXTI7 ----> 事件7
    EXTI->FPR1 |= (0x1<<7);
    //key3 PF8 ==> EXTI8 ----> 事件8
    EXTI->FPR1 |= (0x1<<8);
}

void hal_gicd_init()
{
	//1 GICD控制寄存器(GICD_CTLR)
    GICD->CTRL|= (0x1<<0); //使能组0

    //2. GICD_ISENABLERx
    //key1 PF9 ==> EXTI9 ----> 事件9 --->中断号 99
    GICD->ISENABLER[3] |= (0x1<<3);
    //key2 PF7 ==> EXTI7 ----> 事件7 --->中断号 97
    GICD->ISENABLER[3] |= (0x1<<1);
    //key3 PF8 ==> EXTI8 ----> 事件8 --->中断号 98
    GICD->ISENABLER[3] |= (0x1<<2);

    //2. GICD_IPRIORITYR
    //key1 PF9 ==> EXTI9 ----> 事件9 --->中断号 99
    GICD->IPRIORITYR[24] |= (0x1<<27);  //中断优先级设置相同

    //key2 PF7 ==> EXTI7 ----> 事件7 --->中断号 97
    GICD->IPRIORITYR[24] |= (0x1<<11);  //中断优先级设置相同

    //key3 PF8 ==> EXTI8 ----> 事件8 --->中断号 98
    GICD->IPRIORITYR[24] |= (0x1<<19);  //中断优先级设置相同

    //2. GICD_ITARGETSRx
    //key1 PF9 ==> EXTI9 ----> 事件9 --->中断号 99
    GICD->ITARGETSR[24] |= (0x3<<24); //分配给cpu0

    //key2 PF7 ==> EXTI7 ----> 事件7 --->中断号 97
    GICD->ITARGETSR[24] |= (0x3<<8); //分配给cpu0


    //key3 PF8 ==> EXTI8 ----> 事件8 --->中断号 98
    GICD->ITARGETSR[24] |= (0x3<<16); //分配给cpu0

    //3. GICD_ICPENDRx
    //key1 PF9 ==> EXTI9 ----> 事件9 --->中断号 99
    GICD->ICPENDR[3] |= (0x1<<3);
    //key2 PF7 ==> EXTI7 ----> 事件7 --->中断号 97
    GICD->ICPENDR[3] |= (0x1<<1);
    //key3 PF8 ==> EXTI8 ----> 事件8 --->中断号 98
    GICD->ICPENDR[3] |= (0x1<<2);
}
void hal_gicc_init()
{
	//GICC_CTLR寄存器
    GICC->CTRL |= (0x1<<0);

    //GICC_PMR寄存器
    GICC->PMR |= (0x2<<4);	
}

(3)main.c

#include "key.h"
extern void peintf(const char *fmt, ...);
char buff[10]={0};
void delay_ms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=0;j<1800;j++);
			
}

int main()
{
	hal_exit_init();
	hal_gicd_init();
	hal_gicc_init();
	while(1)
	{

	}
	

(4)do_irq.c(中断处理)

#include "key.h"
extern void printf(const char *fmt, ...);
//unsigned int i=0;
//中断处理函数
void do_irq(void)
{
	//获取中断号 IAR
	int interrupt_no=(GICC->IAR & 0x1ff);
	printf("interrupt_no=%d\n\r",interrupt_no);

	//判断获取的中断号,进行打印
	switch (interrupt_no)
    {
    case 99:
        printf("key1###############\r\n");
        //1. 清除中断挂起标志位
        EXTI->FPR1 |= (0x1<<9); 
        //2. 清除中断号
        GICC->EOIR &= (~(0x1ff<<0));
        GICC->EOIR |= (interrupt_no<<0);
        break;
    case 97:
        printf("key2###############\r\n");
		//1. 清除中断挂起标志位
        EXTI->FPR1 |= (0x1<<7);
        //2. 清除中断号
        GICC->EOIR &= (~(0x1ff<<0));
        GICC->EOIR |= (interrupt_no<<0);
        break;
    case 98:
        printf("key3###############\r\n");
        //1. 清除中断挂起标志位
        EXTI->FPR1 |= (0x1<<8);
        //2. 清除中断号
        GICC->EOIR &= (~(0x1ff<<0));
        GICC->EOIR |= (interrupt_no<<0);
        break;

    default:
        break;
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值