今天在看F460手册的时候结合官方给的库学习中断注册的过程,案例中使用了en_result_t enIrqRegistration(const stc_irq_regi_conf_t *pstcIrqRegiConf)这个函数。
一开始还比较容易理解,进入函数体首先检查了一下入口参数的回调函数地址是不是空,但是没有对其他两个成员进行检查。再往下第一个if应该是判断中断向量编号是不是32-127之间。但是不能理解的是判断完了,如果中断向量编号在32-127之间竟然直接返回参数错误。而且在else中也仅仅对向量编号小于32的做了处理。
还一个百思不得其解的是if (0x1FFu == stcIntSel->INTSEL)这一句到底几个意思!
原函数我复制在下边,大家也可以看官方提供的库文件。求大神们帮忙分析一下!
en_result_t enIrqRegistration(const stc_irq_regi_conf_t *pstcIrqRegiConf)
{
// todo, assert ...
stc_intc_sel_field_t *stcIntSel;
en_result_t enRet = Ok;
//DDL_ASSERT(NULL != pstcIrqRegiConf->pfnCallback);检查回调函数地址不为空
DDL_ASSERT(IS_NULL_POINT(pstcIrqRegiConf->pfnCallback));
if (((((pstcIrqRegiConf->enIntSrc/32)*6 + 32) > pstcIrqRegiConf->enIRQn) || \
(((pstcIrqRegiConf->enIntSrc/32)*6 + 37) < pstcIrqRegiConf->enIRQn)) && \
(pstcIrqRegiConf->enIRQn >= 32))//第二种方式
{
enRet = ErrorInvalidParameter;
}
else//第一种方式
{ //计算中断向量入口地址=M4_INTC->SEL0+偏移地址(4*中断向量编号)
stcIntSel = (stc_intc_sel_field_t *)((uint32_t)(&M4_INTC->SEL0) + \
(4u * pstcIrqRegiConf->enIRQn));
if (0x1FFu == stcIntSel->INTSEL)//INTSEL[8:0]
{
stcIntSel->INTSEL = pstcIrqRegiConf->enIntSrc;//INTSEL寄存器中写入中断源序号
IrqHandler[pstcIrqRegiConf->enIRQn] = pstcIrqRegiConf->pfnCallback;//回调函数地址放入中断向量表
}
else
{
enRet = ErrorUninitialized;
}
}
return enRet;
}
|