STM32/STM8技术william hill官网
直播中

李丽

7年用户 1419经验值
私信 关注
[问答]

在NVIC中设置SysTick中断并将其用作例外有什么区别?

我在使用STM32F303 MCU时注意到Systick可以设置为导致异常,这个情况好像在各种用户指南中经常提到。这样,它的优先级将高于常规中断。
另一方面,似乎也可以将Systick设置为NVIC中的中断。它有自己的中断请求号,可以设置为挂起状态。由于NVIC中断具有可编程的优先级,我们也可以通过这种方式进行设置。
我不太清楚使用SysTick这两种方法之间的区别。

回帖(10)

王树林

2018-9-27 13:53:26
你的程序在C ++中是否有机会?如果是这样,请记住你需要在'extern“C”'中包装你的SysTick_Handler或它的声明。
举报

贾虎世

2018-9-27 13:53:53
你可以扩展你的第二段,也许用例子。我想知道这里是否存在一些混淆。NVIC处理所有异常,包括IRQ。
举报

李丽

2018-9-27 13:54:32
经过几年的Matlab,我实际上只是回到ARM编程。我从我公司的一位高级开发人员那里得到了一个项目,它系统地尝试使用SysTick,好像它是一个常规中断,导致我的第二段,微妙的混乱和众多的总线和硬故障。
举报

张杰

2018-9-27 13:55:50
首先是两个定义:
在Cortex-M编程手册中,Exception是破坏正常程序流的任何东西,并从向量表调用处理程序,而Interrupts是Exceptions的子集,来自ARM核心之外的外设。因为SysTick是在Cortex-M内核中实现的,所以它被认为是异常,但不是中断。
异常具有异常编号,从0开始。中断具有IRQ编号,从0开始。因为所有中断都是异常,所以它们都获得异常编号,比IRQ编号高16。非中断的异常(包括SysTick)在0-15范围内具有异常编号,小于中断的异常编号。有点令人困惑的是,非中断的异常也有IRQ号,这可以延伸到-16到-1的范围内。SysTick的例外编号为15,IRQ编号为-1。
除Reset,NMI和Hardfault之外的所有异常都具有可配置的优先级。它只是为中断和其他异常配置不同。请参阅CMSIS实施作为一个明显的例子:
  1. __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  2. {
  3.   if ((int32_t)(IRQn) < 0)
  4.   {
  5.     SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  6.   }
  7.   else
  8.   {
  9.     NVIC->IP[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  10.   }
  11. }

您可以直接调用NVIC_SetPriority或操作SCB->SHP以使SysTick的优先级低于任何其他中断。

SysTick确实具有高于任何中断的默认优先级,但这仅仅是因为在复位时,所有优先级都设置为0,并且在平局的情况下,较低的IRQ编号获胜,在这种情况下,SysTick为-1。
举报

张杰

2018-9-27 13:56:27
只有中断可以通过NVIC寄存器进行配置,SysTick不是中断。NVIC寄存器无法在位掩码或其他位置使用负IRQ编号。
SysTick确实可以设置为挂起状态,但这是通过SCB->ICSRNVIC完成的。
请注意,NVIC_SetPriority()并NVIC_GetPriority()在CMSIS具有消极IRQ号妥善处理的唯一NVIC_功能。其他函数喜欢NVIC_SetPendingIRQ()或NVIC_EnableIRQ()只是接受负IRQ数字,对它们进行一些改组,导致与NVIC寄存器的巨大偏移,并乱写一些遥远的内存地址,可能导致严重故障或其他奇怪的行为。当您USE_FULL_ASSERT在标头中启用时,HAL_NVIC_函数会执行一些边界检查,否则它们只会将无效参数传递给CMSIS NVIC函数。
有一个巧妙的技巧来找到使用负参数调用函数的所有位置。把它放到一个公共标题中:
#define NVIC_EnableIRQ(x) ((void)sizeof(char[x]))
每当使用负数调用此构造时,这是一个编译时错误。对除除 NVIC_SetPriority()和之外的每个NVIC函数重复此操作NVIC_GetPriority()。
举报

王燕

2018-9-27 13:57:29
systick和外设中断之间的根本区别在于,当核心中可用时,systick由ARM指定为IRQ 6(0x003C)。
它也是ARM Cortex的一部分,由同一时钟提供时钟,因此是同步的。
其例外(中断)由制造商决定,以决定他们拥有的基本优先级(偏移量)和来源。
从ST编程手册(PM0056):
SysTick异常是系统计时器到达零时生成的异常。软件还可以生成SysTick异常。在OS环境中,处理器可以将此异常用作系统标记。
中断或IRQ是外设发出的异常,或由软件请求生成的异常。所有中断都与指令执行异步。
举报

刘勇

2018-9-27 13:57:51
除了Reset,NMI和Hardfault之外,Cortex-M系列可以配置异常优先级。请参阅SCB->SHPR{1,2,3}编程手册中的说明。
举报

王燕

2018-9-27 13:58:13
没错,但是它们将每个中断都称为异常,因为它是正常程序流的一个例外。
举报

王艳

2018-9-27 13:58:47
如果ARM提供的逻辑将时钟信号提供给systick计数器以及核心的其他部分(我很确定它会这样做),芯片制造商如何使systick不同步?
举报

王燕

2018-9-27 13:59:21
它仍然是IRQ 6.但您可以更改NVIC中的优先级组。但是在每个Cortex中你仍然会得到6分。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分