STM32CubeMX生成stm32MP135中断优先级配置错误修正方法

0 修改方法

使用STM32CubeMX生成stm32MP135代码的中断优先级配置错误,将导致所有中断优先级设置不对。
如果设置EXTI0中断优先级为10,在STM32CubeMX中配置如下:
在这里插入图片描述
生成的中断优先级配置代码为:
在这里插入图片描述
正确写法应该将中断优先级左移3位:
在这里插入图片描述

1 错误原因分析

1.1 IRQ初始化配置

stm32MP135启动后首先会调用IRQ_Initialize()函数初始化IRQ,相关代码过多。这里列出几个关键操作:
(1)设置中断优先级位数为5位

/** \brief Set the interrupt priority mask using CPU's PMR register.
* \param [in] priority Priority mask to be set.
*/
__STATIC_INLINE void GIC_SetInterfacePriorityMask(uint32_t priority)
{
  GICInterface->PMR = priority & 0xFFUL; //set priority mask
}
GIC_SetInterfacePriorityMask(0xFFU);

对应寄存器描述如下:
在这里插入图片描述
也就是使用5位作为中断优先级。
(2)设置抢占优先级位数为5位

GIC_SetBinaryPoint(0U);
/** \brief Configures the group priority and subpriority split point using CPU's BPR register.
* \param [in] binary_point Amount of bits used as subpriority.
*/
__STATIC_INLINE void GIC_SetBinaryPoint(uint32_t binary_point)
{
  GICInterface->BPR = binary_point & 7U; //set binary point
}

对应寄存器描述如下:在这里插入图片描述
在这里插入图片描述

也就是5位全部作为抢占优先级。

1.2 IRQ优先级配置

/** \brief Set the priority for the given interrupt in the GIC's IPRIORITYR register.
* \param [in] IRQn The interrupt to be configured.
* \param [in] priority The priority for the interrupt, lower values denote higher priorities.
*/
__STATIC_INLINE void GIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
  uint32_t mask = GICDistributor->IPRIORITYR[IRQn / 4U] & ~(0xFFUL << ((IRQn % 4U) * 8U));
  GICDistributor->IPRIORITYR[IRQn / 4U] = mask | ((priority & 0xFFUL) << ((IRQn % 4U) * 8U));
}

相关寄存器描述如下:
在这里插入图片描述
可以看到中断优先级寄存器只有高5bit有效,因此使用GIC_SetPriority函数设置中断优先级应该左移3位。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NW嵌入式开发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值