更改运行中断处理程序的优先级?

时间:2016-11-22 16:54:38

标签: arm embedded stm32 cortex-m3

我正在尝试在cortex-m3控制器上实现以下伪代码(特别是STM32L151)

void SysTick_Handler() {
    do_high_priority_periodic_tasks(); // not to be interrupted
    lower_interrupt_priority();
    do_low_priority_periodic_tasks();  // these may be interrupted
}

换句话说,运行优先级为0的第一部分,然后以某种方式将当前中断优先级降低到15,以便其余部分可以被其他硬件中断抢占。

一个想法是将do_low_priority_periodic_tasks();移动到单独的中断处理程序中,并通过NVIC_SetPendingIRQ()调用此处理程序,该NVIC->ISPR[]设置SysTick寄存器中的挂起位。这样,另一个中断将紧跟#define LOWPRIO_IRQn 55 void IRQ55_Handler() { do_low_priority_periodic_tasks(); // these may be interrupted } void SysTick_Handler() { do_high_priority_periodic_tasks(); // not to be interrupted NVIC_SetPendingIRQ(LOWPRIO_IRQ); } void main() { HAL_Init(); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); HAL_NVIC_SetPriority(LOWPRIO_IRQn, 15, 0); HAL_NVIC_EnableIRQ(LOWPRIO_IRQn); while(1) { /* main loop */ } } ,除非有任何优先级在0和14之间的待处理。

{{1}}

我已经选择了IRQ 55,因为它没有占用我的控制器,它将是STM32L162上的AES中断处理程序,但我有点担心。我应该选择不同的IRQ,也许是未使用的DMA通道中断?使用Cortex-M3内核定义的中断57-67是否安全,而STM32L系列中没有?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:4)

  

使用Cortex-M3内核定义的中断57-67是否安全,但STM32L系列中没有?

没有。您的NVIC实际上可能无法实现它们。

但PendSV正是为这项任务而做的:

Set wks = Workbooks("VBA - Final Project.xlsm").Worksheets("Order Data")

另见answer关于PendSV。