即使在启用 TICKINT 后也无法触发 Systick 中断处理程序.为什么?


#include "stm32f10x.h"
#define PIN_PC13     0x2000
#define ON_BOARD_LED  PIN_PC13
void LED_Init(void);
int main()
{

STM32F103C8T6板载LED初始化功能

LED_Init();  
while(1)
{

}
return 0;
}
void LED_Init()
{

APB 总线-2 时钟使能 ---> 启用以使用外设

RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; 
GPIOC->CRH |=GPIO_CRH_MODE13;   
GPIOC->CRH &= ~(GPIO_CRH_CNF13);
SysTick_Config(800000-1);   
//SysTick->CTRL |=0x07;
//SysTick->LOAD =8000000/10 -1;
}

中断处理程序未运行,为什么?

void SysTick_Handler(void)
{
GPIOC->ODR ^=ON_BOARD_LED;  // Toggling the on board LED
}

乍一看,您的 SysTick 配置似乎是正确的。虽然找不到问题,但我可以给出调试建议。

使用调试器,检查 SysTick->CTRL 寄存器的值,并确保前 2 位为 1。

使用调试器,暂停并继续并检查 SysTick->VAL 的值以确保 SysTick 正在运行。每次暂停时都应观察不同的值。

在SysTick_Handler中放置一个断点,以查看是否调用了它。也许调用了处理程序,但 GPIO 配置甚至硬件中都有错误。

这有点不太可能,但如果您使用的是 C++ 编译器而不是 C,请参阅以下问题:为什么我的中断被调用,但不会进入处理程序?

如果您使用的是 CXX,则编译器将更改中断处理程序的名称,因为名称重整。我花了很多时间来弄清楚这一点。

在 RAM 0x20000000 中运行代码时,我在蓝色药丸 Keil 5.17、jlink v8 调试器上遇到了同样的问题。

添加以下语句可解决问题:

SCB->VTOR = 0x20000000;

最新更新