我正在尝试在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系列中没有?有没有更好的方法呢?
答案 0 :(得分:4)
使用Cortex-M3内核定义的中断57-67是否安全,但STM32L系列中没有?
没有。您的NVIC实际上可能无法实现它们。
但PendSV正是为这项任务而做的:
Set wks = Workbooks("VBA - Final Project.xlsm").Worksheets("Order Data")
另见answer关于PendSV。