按键中断实验 3月29日

本文提供了一段C代码,用于初始化STM32MP1xx芯片的EXTI控制器、GICD(分布式中断控制器)和GICC(CPU接口)控制器。代码中包含了EXTI的配置,以及GIC中断系统的启用和优先级设置。在中断处理函数`do_irq`中,对不同中断源进行了响应处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#ifndef __KEY_H__

#define __KEY_H__

#include "/home/ubuntu/amr/03key/common/include/stm32mp1xx_exti.h"

#include "/home/ubuntu/amr/03key/common/include/stm32mp1xx_gic.h"

//初始化EXTI控制器

void hal_exti_init();

//初始化GICD控制器

void hal_gicd_init();

//初始化GICC控制器

void hal_gicc_init();

#endif

#ifndef __KEY_H__

#define __KEY_H__

#include "/home/ubuntu/amr/03key/common/include/stm32mp1xx_exti.h"

#include "/home/ubuntu/amr/03key/common/include/stm32mp1xx_gic.h"

//初始化EXTI控制器

void hal_exti_init();

//初始化GICD控制器

void hal_gicd_init();

//初始化GICC控制器

void hal_gicc_init();

#endif

#include"./include/key.h"

 int main()

{

       hal_exti_init();

       hal_gicd_init();

       hal_gicc_init();

       while(1)

       {

       }

       return 0;

}

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

void hal_exti_init()
{
    //RCC初始化
    RCC_AHB4|=(0X1<<5);
    
    //GPIO初始化
    GPIOF_MODER&=(~(0x3<<18));
    GPIOF_MODER&=(~(0x3<<14));
    //EXTI初始化

    EXTI->EXTICR3&=(~(0xff<<8));
    EXTI->EXTICR3|=(0x5<<8);
    EXTI->EXTICR2&=(~(0xff<<24));
    EXTI->EXTICR2|=(0x5<<24);
    EXTI->FTSR1|=(0x1<<9);
    EXTI->FTSR1|=(0x1<<7);
    EXTI->C1IMR1|=(0x1<<9);
    EXTI->C1IMR1|=(0x1<<7);

}

//初始化GICD控制器
void hal_gicd_init()
{
    GICD->CTRL|=(0x1<<0);
    GICD->ISENABLER[3]|=(0x1<<3);
    GICD->ISENABLER[3]|=(0x1<<1);
    GICD->IPRIORITYR[24]&=(~(0x1f<<27));
    GICD->IPRIORITYR[24]|=(0x1<<27);
    GICD->IPRIORITYR[24]&=(~(0xff<<11));
    GICD->IPRIORITYR[24]|=(0x1<<11);
    GICD->ITARGETSR[24]&=(~(0x1<<25));
    GICD->ITARGETSR[24]|=(0x1<<24);
    GICD->ITARGETSR[24]&=(~(0X1<<9));
    GICD->ITARGETSR[24]|=(0x1<<8);

}

//初始化GICC控制器
void hal_gicc_init()
{
    GICC->CTRL|=(0x1<<0);
    GICC->PMR|=(0x1<<3);
    GICC->PMR|=(0X1<<4);
    GICC->PMR|=(0X1<<5);

}
 

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

extern void printf(const char *fmt, ...);

unsigned int i = 0;

void do_irq(void)

{

int GICC_num=GICC_IAR;

switch(GICC_num)

{

case 99:

       printf("i am okay\n");

       EXTI->FPR1|=(0X1<<9);

       EXTI->FPR1|=(0X1<<7);

       GICD->ICPENDR[3]|=(0X1<<3);

       GICD->ICPENDR[1]|=(0X1<<1);

       GICC->EOIR=GICC_num;

       break;

case 97:

       printf("i am key2\n");

       EXTI->FPR1|=(0X1<<9);

       EXTI->FPR1|=(0X1<<7);

       GICD->ICPENDR[3]|=(0X1<<3);

       GICD->ICPENDR[1]|=(0X1<<1);

       GICC->EOIR=GICC_num;

       break;

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值