0 前言
一般来说,MCU/SOC的BOOT在跳转到APP前都需要进行环境清理的操作,其中必须进行的一项操作便是关闭所有中断、清除所有中断挂起标志。本文介绍基于STM32MP135裸机编程下关闭所有中断、清除所有中断挂起标志的操作方法。
1 操作方法
STM32MP135裸机编程下关闭所有中断、清除所有中断挂起标志的操作语句如下:
for (irqn = 0; irqn < (IRQn_ID_t)MAX_IRQ_n; irqn++)
{
GIC_DisableIRQ((IRQn_Type)irqn);
GIC_ClearPendingIRQ((IRQn_Type)irqn);
}
MAX_IRQ_n表示IRQ的数量。
2 寄存器描述
(1)中断去使能寄存器
中断对应位写1表示关闭中断。
(2)中断挂起清除寄存器
中断对应位写1表示清除中断挂起标志。
注:这里分为外设产生的中断和软件中断。
3 HAL库实现
/** \brief Disables the given interrupt using GIC's ICENABLER register.
* \param [in] IRQn The interrupt to be disabled.
*/
__STATIC_INLINE void GIC_DisableIRQ(IRQn_Type IRQn)
{
GICDistributor->ICENABLER[IRQn / 32U] = 1U << (IRQn % 32U);
}
/** \brief Clears the given interrupt from being pending using GIC's ICPENDR register.
* \param [in] IRQn The interrupt to be enabled.
*/
__STATIC_INLINE void GIC_ClearPendingIRQ(IRQn_Type IRQn)
{
if (IRQn >= 16U) {
GICDistributor->ICPENDR[IRQn / 32U] = 1U << (IRQn % 32U);
} else {
// INTID 0-15 Software Generated Interrupt
GICDistributor->CPENDSGIR[IRQn / 4U] = 1U << ((IRQn % 4U) * 8U);
}
}