Cortex-A7的GIC(通用中断控制器)使用方法(5):基于stm32MP135的GIC配置API配置GIC

0 参考资料

STM32MP13xx参考手册.pdf(RM0475)
ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification.pdf

1 基于Cortex-A7的GIC配置API配置GIC

前面我们已经了解了GIC几个关键的寄存器,通过这几个关键寄存器,我们就可以按照NVIC的用法,使用GIC对中断进行管理。操作步骤概括如下:
(1)设置中断优先级掩码寄存器GICC_PMR,确定中断优先级位数
(2)设置中断抢占优先级和响应优先级配置寄存器GICC_BPR,确定中断抢占优先级和响应优先级的位数
(3)设置中断优先级配置寄存器GICD_IPRIORITYRn,指定中断优先级
(4)设置中断使能寄存器GICD_ISENABLERn/中断失能寄存器GICD_ICENABLERn来使能/失能中断
相关代码如下:

/**
 * @brief GIC初始化
 *
 * @param prio_bits 中断优先级位数0-5
 * @param main_prio_bits 中断抢占优先级(主优先级)位数(不得为0)
 * @return int 
 */
int gic_init(u32 prio_bits, u32 main_prio_bits)
{
    u32 i;
    u32 pmr_mask = 0;

    if (prio_bits > STM32MP13XX_PRIO_MAX_BITS)
    {
        return -1;
    }

    if ((main_prio_bits > prio_bits) || (main_prio_bits == 0))
    {
        return -1;
    }

    /* 构造GIMC_PMR寄存器值 */
    for (i = 0; i < prio_bits; i++)
    {
        pmr_mask |= (1 << i);
    }
    pmr_mask = pmr_mask << 3;

    /* 将pmr_mask值写入GIMC_PMR寄存器,设置中断优先级位数 */
    GIC_SetInterfacePriorityMask(pmr_mask);
    imx_printf("pmr_mask : 0x%x\r\n", pmr_mask);

    /* 将抢占优先级设置值写入GICC_BPR寄存器 */
    GIC_SetBinaryPoint(7 - main_prio_bits);
    imx_printf("7 - main_prio_bits : 0x%x\r\n", 7 - main_prio_bits);

    gic_cfg.prio_bits = prio_bits;
    gic_cfg.main_prio_bits = main_prio_bits;

    return 0;
}

/**
 * @brief GIC中断优先级配置
 * 
 * @param IRQn 中断ID
 * @param main_prio 主优先级
 * @param sub_prio 子优先级
 * @return int 0:成功 -1:失败
 */
int gic_prio_config(IRQn_Type IRQn, u32 main_prio, u32 sub_prio)
{
    u32 priority = 0;

    /* 如果主优先级大于主优先级位数表示的最大值 */
    if (main_prio > ((1 << (gic_cfg.main_prio_bits)) - 2))
    {
        return -1;
    }

    /* 只有当主优先级位数小于优先级位数时才检查子优先级是否合理 */
    if (gic_cfg.main_prio_bits != gic_cfg.prio_bits)
    {
        if (sub_prio > ((1 << (gic_cfg.prio_bits - gic_cfg.main_prio_bits)) - 1))
        {
            return -1;
        }
    }


    if (gic_cfg.main_prio_bits == gic_cfg.prio_bits)
    {
        /* 仅包含主优先级 */
        priority = main_prio << 3;
    }
    else
    {
        /* 包含主优先级和子优先级 */
        priority = ((main_prio << (gic_cfg.prio_bits - gic_cfg.main_prio_bits)) | (sub_prio)) << 3;
    }
    imx_printf("priority : 0x%x\r\n", priority);
    GIC_SetPriority(IRQn, priority);

    return 0;
}

使用实例:
以配置GIC优先级位数为5,主优先级位数为3,ETH1_IRQn主优先级为5,子优先级为0为例,相关代码如下:

void config_eth1_gic_example(void)
{
    gic_init(5, 3);
    gic_prio_config(ETH1_IRQn, 5, 0);
}
本研究基于扩展卡尔曼滤波(EKF)方法,构建了一套用于航天器姿态与轨道协同控制的仿真系统。该系统采用参数化编程设计,具备清晰的逻辑结构和详细的代码注释,便于用户根据具体需求调整参数。所提供的案例数据可直接在MATLAB环境中运行,无需额外预处理步骤,适用于计算机科学、电子信息工程及数学等相关专业学生的课程设计、综合实践或毕业课题。 在航天工程实践中,精确的姿态与轨道控制是保障深空探测、卫星组网及空间设施建设等任务成功实施的基础。扩展卡尔曼滤波作为一种适用于非线性动态系统的状态估计算法,能够有效处理系统模型中的不确定性与测量噪声,因此在航天器耦合控制领域具有重要应用价值。本研究实现的系统通过模块化设计,支持用户针对不同航天器平台或任务场景进行灵活配置,例如卫星轨道维持、飞行器交会对接或地外天体定点着陆等控制问题。 为提升系统的易用性与教学适用性,代码中关键算法步骤均附有说明性注释,有助于用户理解滤波器的初始化、状态预测、观测更新等核心流程。同时,系统兼容多个MATLAB版本(包括2014a、2019b及2024b),可适应不同的软件环境。通过实际操作该仿真系统,学生不仅能够深化对航天动力学与控制理论的认识,还可培养工程编程能力与实际问题分析技能,为后续从事相关技术研究或工程开发奠定基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NW嵌入式开发

感谢您的支持,让我们一起进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值