This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHXL2-570LC43:如何使用 SWI (软件中断)?

Guru**** 2030840 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1110053/launchxl2-570lc43-how-to-use-swi-software-interrupt

器件型号:LAUNCHXL2-570LC43

大家好、

以下是客户提出的问题、可能需要您的帮助:

很清楚软中断是如何触发的、但客户不知道如何注册软中断异常处理函数。

您可以帮助检查此案例吗? 谢谢。

此致、

樱桃

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cherry、

    请看 一下 SPNA218的第5.1节。请告诉我这是否有帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    感谢你的帮助。

    客户已检查您提供的文件、并且他们当前希望主动触发软件中断。

    他们尝试通过将75h 写入 SSIR1寄存器(在 spnu563a 的第188页定义)中的 SSKEY1来触发软件中断、但程序跳转到 DataEntry 而不是_Svc。  

    如果用户想要在某个时刻主动触发软件中断、可以通过向 SSIR1寄存器写入正确的密钥来实现吗? 为什么触发 dataEnrty?  

    谢谢、此致、

    樱桃

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我是否可以知道有任何更新?

    谢谢、此致、

    樱桃

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cherry、

    赫丘利斯器件的系统模块支持使用 SSIR1、SSIR2、SSIR3、SSIR4寄存器生成四个软件中断(IRQ 或 FIQ)。 此外、ARM 内核 有一个内置软件中断、此中断将生成一个 CPU 中止(SWI/SVC)。  

    所有四个 SSI 中断被组合成一个到 VIM 的单一请求线路。  您可以同时激活全部4个 SSI。 SSIVEC 寄存器将显示最高挂起 SSI 中断。 与其他外设中的向量寄存器类似、当在 SSI ISR 中读取向量寄存器时、相应的标志将被清除。

    SSI 将生成 IRQ 或 FIQ 中断、而不是 SVC。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请参阅下面的示例。 在对 SSIR 进行编程(写入0x75密钥)后、系统硬件会向 CPU 产生 IRQ 中断。 CPU 停止执行 main()中的代码并跳转到由您在 VIMRAM 中输入的名称(在我的示例中为 ssiInterrupt())标识的中断服务例程。 在中断例程结束时、CPU 返回到其关闭的位置、并继续执行原始代码。

    不会生成数据中止。

     

    #pragma CODE_STATE (siInterrupt、32)

    #pragma INTERRUPT (siInterrupt、IRQ)

    void sisInterrupt (void)(空)

       uint32 vec = systemREG1->SSIVEC;

       if ((VEC & 0xFF)=0x1){

           asm ("  nop");

           printf ("SSI 中断1 \n\r");

       }

    /*用户代码结束*/

     int main (空)

        _enable_IRQ ();

       systemREG1->SSIR1 = 0x7500 |(0xff & 0x2);