cortex-A7核按键中断实验

cortex-A7核按键中断实验

fun.h

#ifndef __FUN_H__
#define __FUN_H__

#include "stm32mp1xx_uart.h" // 调用UART封装库
#include "stm32mp1xx_gpio.h" // 调用GPIO封装库
#include "stm32mp1xx_rcc.h"  // 调用RCC封装库
#include "stm32mp1xx_exti.h" //调用EXTI封装库
#include "stm32mp1xx_gic.h"  //调用GIC封装库

// GPIO
//===========================================================================================
//***********GPIO引脚************
#define GPIO_PIN_0 0
#define GPIO_PIN_1 1
#define GPIO_PIN_2 2
#define GPIO_PIN_3 3
#define GPIO_PIN_4 4
#define GPIO_PIN_5 5
#define GPIO_PIN_6 6
#define GPIO_PIN_7 7
#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10

//*******中断*******
void hal_exti_pf9_init();
void hal_gicd_pf9_init();
void hal_gicc_pf9_init();
//*******中断*******

#endif

text.c

#include "fun.h"

//*******中断*******
void hal_exti_pf9_init()
{

    // RCC章节初始化
    RCC->MP_AHB4ENSETR |= (0x1 << 5);

    // GPIO章节初始化
    GPIOF->MODER &= (~(0x3 << 18));
    GPIOF->MODER &= (~(0x3 << 14));
    GPIOF->MODER &= (~(0x3 << 16));

    // exti章节初始化
    // EXTI_EXTICR(3\2) 外部中断选择寄存器 GPIO选择和哪一个EXTI组控制器进行连接
    EXTI->EXTICR3 &= (~(0xFF << 8));
    EXTI->EXTICR3 |= (0x05 << 8);

    EXTI->EXTICR2 &= (~(0xFF << 24));
    EXTI->EXTICR2 |= (0x05 << 24);

    EXTI->EXTICR3 &= (~(0xFF << 0));
    EXTI->EXTICR3 |= (0x05 << 0);

    // EXTI_FTSR1 EXTI下降沿触发选择寄存器 设置EXTI编号为下降沿触发
    EXTI->FTSR1 |= (0x1 << 9);
    EXTI->FTSR1 |= (0x1 << 7);
    EXTI->FTSR1 |= (0x1 << 8);

    // EXTI_IMR1 EXTI中断屏蔽寄存器 设置EXTI信号是否转发到GIC层
    EXTI->C1IMR1 |= (0x1 << 9);
    EXTI->C1IMR1 |= (0x1 << 7);
    EXTI->C1IMR1 |= (0x1 << 8);
}

void hal_gicd_pf9_init()
{
    // GICD层控制寄存器 使能GICD层组0中断:GICD_CTLR[0] = 1
    GICD->CTRL |= (0x1 << 0);

    // 中断设置使能寄存器 GICD_ISENABLER3[3] = 1 [1] = 1 [2] = 1
    GICD->ISENABLER[3] |= (0x1 << 3);
    GICD->ISENABLER[3] |= (0x1 << 1);
    GICD->ISENABLER[3] |= (0x1 << 2);

    // GICD层中断优先级寄存器
    GICD->IPRIORITYR[24] &= (~(0x1F << 27));
    GICD->IPRIORITYR[24] |= (1 << 27);

    GICD->IPRIORITYR[24] &= (~(0x1F << 11));
    GICD->IPRIORITYR[24] |= (1 << 11);

    GICD->IPRIORITYR[24] &= (~(0x1F << 19));
    GICD->IPRIORITYR[24] |= (1 << 19);

    // GICD层中断目标分配寄存器 GICD_ITARGETSR24[25:24] [9:8] [17:16]
    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);
}

void hal_gicc_pf9_init()
{
    // GICC层控制寄存器  GICC_CTLR[0] = 1
    GICC->CTRL |= (0x1 << 0);

    // GICC层中断优先级屏蔽寄存器
    GICC->PMR &= (~(0x1F << 3));
    GICC->PMR |= (0x2 << 3);
}
//*******中断*******

do_irq.c

#include "fun.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
    // 获取中断号 IAR
    i = GICC->IAR & 0x3ff;
    // 判断获取的中断号, 进行打印
    switch (i)
    {
    case 99:
        printf("key1\n");

        // 清除对应EXTI层挂起的标志位
        // EXTI_FPR1 EXTI下降沿触挂起寄存器 清除EXTI层中断挂起标志
        EXTI->FPR1 &= (~(0x1 << 9));
        EXTI->FPR1 |= (0x1 << 9);

        // 清除对应GICD层挂起的标志位
        // 中断清除挂起寄存器  GICD_ICPENDR3[3]= 1
        GICD->ICPENDR[3] &= (~(0x1 << 3));
        GICD->ICPENDR[3] |= (0x1 << 3);

        break;
    case 98:
        printf("key3\n");

        // 清除对应EXTI层挂起的标志位
        // EXTI_FPR1 EXTI下降沿触挂起寄存器 清除EXTI层中断挂起标志
        EXTI->FPR1 &= (~(0x1 << 8));
        EXTI->FPR1 |= (0x1 << 8);

        // 清除对应GICD层挂起的标志位
        // 中断清除挂起寄存器  GICD_ICPENDR3[2]= 1
        GICD->ICPENDR[3] &= (~(0x1 << 2));
        GICD->ICPENDR[3] |= (0x1 << 2);

        break;

    case 97:
        printf("key2\n");

        // 清除对应EXTI层挂起的标志位
        // EXTI_FPR1 EXTI下降沿触挂起寄存器 清除EXTI层中断挂起标志
        EXTI->FPR1 &= (~(0x1 << 7));
        EXTI->FPR1 |= (0x1 << 7);

        // 清除对应GICD层挂起的标志位
        // 中断清除挂起寄存器  GICD_ICPENDR3[1]= 1
        GICD->ICPENDR[3] &= (~(0x1 << 1));
        GICD->ICPENDR[3] |= (0x1 << 1);

        break;
    }

    // 清除对应GICC层挂起的标志位
    GICC->EOIR |= i;
}

main.c

#include "fun.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_exti_pf9_init();
	hal_gicd_pf9_init();
	hal_gicc_pf9_init();

	while (1)
	{
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AST2600 SoC 包含两个主要的处理器心:一个 Cortex-A7和一个 Cortex-M3 内。这两个内之间可以通过 AMBA AXI4 接口进行通信。在 Cortex-M3 内中,可以通过 NVIC(Nested Vector Interrupt Controller)设置和管理中断。以下是在 AST2600 中设置 Cortex-M3 内间通信中断的基本步骤: 1. 配置 AMBA AXI4 接口:在 Cortex-A7中,需要配置 AMBA AXI4 接口,以便与 Cortex-M3 内进行通信。这包括设置 AXI4 接口的基址、大小和属性等参数。 2. 配置 Cortex-M3 中断:在 Cortex-M3 内中,需要使用 NVIC 设置和管理中断。可以使用 CMSIS(Cortex Microcontroller Software Interface Standard)库中提供的 NVIC API 来设置中断优先级、使能中断等。 3. 设置中断处理程序:在 Cortex-M3 内中,需要编写中断处理程序来处理接收到的中断。可以使用标准的 C 或汇编语言编写中断处理程序,并将其链接到正确的中断向量表中。 4. 触发中断:在 Cortex-A7中,可以通过向 AXI4 接口发送中断请求来触发中断。当 Cortex-M3 内接收到中断请求后,将跳转到相应的中断处理程序中执行。 需要注意的是,上述步骤仅提供了一般的框架,具体的实现方式可能会因系统架构和应用场景而异。在实际应用中,可能需要进一步优化中断处理程序的性能和可靠性,并考虑调试和故障排除等方面的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值