我试图找出如何在STM32L4x6RG Nucleo上禁用和启用中断?
经过一段谷歌搜索后,我找到了宏__disble_irq()和__enable_irq(),但我不相信这些是禁用中断。
经过更多调查后,这个宏映射到的cpsid指令似乎只有在超级用户上下文中运行时才有效。那么问题就变成了如何进入管理程序模式以禁用中断并再次返回?
答案 0 :(得分:3)
我找到了宏__disble_irq()和__enable_irq(),但我没有 确信这些都是禁用中断。
他们这样做,除非您(或您正在使用的操作系统)明确地将privileged mode与MSR control, Rn
指令或__set_CONTROL()
功能明确地保持一致。
所以问题就变成了如何移动到管理员模式来禁用 中断又回来了?
处理器在复位后处于特权模式,并保留在其中,除非您另有说明。它在执行异常处理程序时也会暂时进入特权模式。
您可以使用SVC
instruction从用户代码调用SVC异常处理程序,并以特权模式运行某些代码。但是存在一个问题,即__disable_irq()
也会阻止SVC处理程序调用,因此之后无法重新启用它们。您可以调整BASEPRI
register而不是__disable_irq()
来有选择地禁用较低优先级的中断,并将SVC优先级设置得更高,以便不会被阻止。
答案 1 :(得分:2)
处理器以特权模式启动,因此除非您在操作系统上运行应用程序或者自己切换到非特权模式,否则您应该已处于特权模式。如果您在操作系统上运行应用程序,则应使用其服务来处理中断,如果不存在此类服务,则应单独保留中断。
如果您自己切换到非特权模式,则可以使用svc
指令触发svc异常,并在特权模式下执行异常处理程序。