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.
您好!
我正在使用两个中断源在 CM 内核上开发一个应用: SysTick 计时器和 UART。
SysTick IRQ 用于生成系统节拍、 UART IRQ 用于处理 EOT 事件。
我需要立即处理 UART IRQ、 最终嵌套 SysTick 处理程序执行。
执行此操作的最佳模式是什么? 我有一个简单的示例吗?
在 C28内核上、我会在 tick 处理程序例程内部重新启用中断、但在 ARM 内核上、我想有更好的方法来使用 NVIC"优先级组"属性来实现这一点。
谢谢!
Carlo。
您好、Carlo。
您对 CM 上更简单的方法是正确的。
您只需要使用 Interrupt_setPriority ()函数设置优先级。
如果中断具有更高的优先级(Interrupt_setPriority 参数中的数字较小)、则此中断将优先于 NVIC 处理其余中断、并且此中断将优先于每个具有较低优先级的中断。
此致、
Andy
谢谢 Andy。
我已经将优先级0分配给 UART IRQ、将优先级1分配给 SysTick IRQ。
这只是 关于 优先级分组规则的另一个问题。
Interrupt_getPriorityGrouping()返回0。 可以吗? 如果不是、我应该设置哪个值? 我不熟悉 ARM 内核、这个概念对我来说并不清楚。
谢谢你。
我从未使用过 PriorityGrouping 函数、因为我从未有过需要。 读取 Interrupt_getPriorityGroup()时返回的值0似乎正常,该值意味着所有8个优先级(0...7)都在优先级组中,而不是在子组中。
请查看 TRM 中的表格:
在 CM 中实施 NVIC 可确保在 ARM 的全部256个可用优先级(8位)中、仅使用8个(3位)。 重要的是、这些是3个 MSB 位。 查看 NVIC_IPRx 寄存器-每个中断优先级寄存器部分中的低5位没有使用。
这就意味着、在 PRIGROUP 域中、当你将值设置为0到4时、效果是一样的-仍然有8个优先级在同一个优先级组中。
设置了较高的值时、情况将会有所不同、例如、 0b101。 在这种情况下、2位在组优先级中、1位在子优先级中。
在本示例中、当您有三个中断时:
INT1 -优先级0 (组/优先级0、子组优先级0)
INT2 -优先级1 (组/优先级0、子组优先级1)
INT3 -优先级2 (组/优先级1、子组优先级0)
那么 INT1和 INT2都在一个抢占组0中。 这意味着 INT1和 INT2都可以优先于 INT3。 但是 INT1和 INT2不能互相抢占(因为它们 具有 相同的占位组)。 当 INT2和 INT1都处于挂起状态时、INT1将首先执行、然后在完成 INT1后执行 INT2。
希望我提供的所有信息都是正确的。
此致、
Andy
感谢 Andy 的快速而清晰的回应。