0

请希望寻求帮助。尝试使用 STM32F1 syst_tick 中断。我正在使用 Atollic truestudio 9.3.0。

我有 c++ 文件(tasks.cpp),我在这个文件中声明了中断处理程序,并希望它会覆盖默认处理程序,因为默认值在启动文件中具有属性 .weak。

但看起来很有趣,当我编译时,我收到错误:“`SysTick_Handler 的多个定义”这就是我声明它的方式。

extern "C"void SysTick_Handler(void)
{
  timeElapsed++;
}

TIM1、2、3、4 的其他中断处理程序在同一个文件中声明,它们工作正常,但 syst_tick 不是。问题,为什么?

4

2 回答 2

1

对于我之前发布的问题,后来对我有用的是编辑默认文件stm32103f10xx_it.c

sysTick处理程序上,我添加了:

void __attribute__((weak))SysTick_Handler( )
{
}

现在,在我的 C++ 项目中的任何地方,我都可以通过SysTick这种方式实现处理程序:

extern "C" { 
    void SysTick_Handler( )
    { 
    
    } 
};

现在这肯定会在编译时覆盖默认处理程序。

笔记:

  1. 此问题仅在默认中断处理程序中常见。
  2. 我只在 TrueStudio IDE 中测试过;我不确定 CUBE IDE 中的行为。
于 2022-02-02T16:17:07.557 回答
0

SysTick_Handler在 STM 文件中定义。如果您使用 HAL,请不要自己定义。如果您想获取计数器值,只需使用 HAL 函数HAL_GetTick();,如果您想在处理程序中调整一些代码,请定义回调函数。定义位于..._it.c项目的文件中。

于 2022-01-29T18:27:32.317 回答