[技术问答] 求大神指导F460中断注册函数

[复制链接]
 楼主| xuxinhd 发表于 2022-7-6 16:55 | 显示全部楼层 |阅读模式
    今天在看F460手册的时候结合官方给的库学习中断注册的过程,案例中使用了en_result_t enIrqRegistration(const stc_irq_regi_conf_t *pstcIrqRegiConf)这个函数。
一开始还比较容易理解,进入函数体首先检查了一下入口参数的回调函数地址是不是空,但是没有对其他两个成员进行检查。再往下第一个if应该是判断中断向量编号是不是32-127之间。但是不能理解的是判断完了,如果中断向量编号在32-127之间竟然直接返回参数错误。而且在else中也仅仅对向量编号小于32的做了处理。
还一个百思不得其解的是if (0x1FFu == stcIntSel->INTSEL)这一句到底几个意思!
原函数我复制在下边,大家也可以看官方提供的库文件。求大神们帮忙分析一下!


  1. en_result_t enIrqRegistration(const stc_irq_regi_conf_t *pstcIrqRegiConf)
  2. {
  3.     // todo, assert ...
  4.     stc_intc_sel_field_t *stcIntSel;
  5.     en_result_t enRet = Ok;

  6.     //DDL_ASSERT(NULL != pstcIrqRegiConf->pfnCallback);检查回调函数地址不为空
  7.     DDL_ASSERT(IS_NULL_POINT(pstcIrqRegiConf->pfnCallback));

  8.     if (((((pstcIrqRegiConf->enIntSrc/32)*6 + 32) > pstcIrqRegiConf->enIRQn) || \
  9.         (((pstcIrqRegiConf->enIntSrc/32)*6 + 37) < pstcIrqRegiConf->enIRQn)) && \
  10.         (pstcIrqRegiConf->enIRQn >= 32))//第二种方式
  11.     {
  12.         enRet = ErrorInvalidParameter;
  13.     }
  14.     else//第一种方式
  15.     {                //计算中断向量入口地址=M4_INTC->SEL0+偏移地址(4*中断向量编号)
  16.         stcIntSel = (stc_intc_sel_field_t *)((uint32_t)(&M4_INTC->SEL0)         +   \
  17.                                              (4u * pstcIrqRegiConf->enIRQn));
  18.         if (0x1FFu == stcIntSel->INTSEL)//INTSEL[8:0]
  19.         {
  20.             stcIntSel->INTSEL = pstcIrqRegiConf->enIntSrc;//INTSEL寄存器中写入中断源序号
  21.             IrqHandler[pstcIrqRegiConf->enIRQn] = pstcIrqRegiConf->pfnCallback;//回调函数地址放入中断向量表
  22.         }
  23.         else
  24.         {
  25.             enRet = ErrorUninitialized;
  26.         }
  27.     }
  28.     return enRet;
  29. }


wubangmi 发表于 2022-7-6 17:22 | 显示全部楼层
if语句是判断中断向量为32~127的中断源是否匹配,如果你选的中断源和中断向量不匹配,那就是错误的。你可以看中断向量是6个一组。有对应的中断源,不是随便匹配的。
else语句是中断源和中断向量匹配的情况下设置中断。至于0x1FF,应该是这个中断号没有被中断源用过,也就是避免你中断号被重复设置,也就是一个中断号对应了多个中断源。
以上是我个人的理解。
by the way:现在已经用到3.0.0的库了,2.2.0的库,我觉得应该可以放弃了,3.0.0的库请到小华半导体http://xhsc.com.cn下载
 楼主| xuxinhd 发表于 2022-7-8 14:25 | 显示全部楼层
wubangmi 发表于 2022-7-6 17:22
if语句是判断中断向量为32~127的中断源是否匹配,如果你选的中断源和中断向量不匹配,那就是错误的。你可以 ...

谢谢!已经换到新库了!我还以为那就是最新的
skyred 发表于 2022-7-10 19:08 | 显示全部楼层
中断注册,,,,这个词有点潮
tpgf 发表于 2022-8-1 18:45 | 显示全部楼层
请问什么叫做注册函数呢
qcliu 发表于 2022-8-1 19:06 | 显示全部楼层
中断入口向量那块屏蔽了吧
drer 发表于 2022-8-1 19:13 | 显示全部楼层
是库的版本出问题了吗
coshi 发表于 2022-8-1 19:28 | 显示全部楼层
中断源和中断向量不匹配
kxsi 发表于 2022-8-1 19:34 | 显示全部楼层
二者不可随便匹配
wiba 发表于 2022-8-1 19:46 | 显示全部楼层
难道需要更新库吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

54

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

10

主题

54

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部