如何解决为什么在启用 SysTick 中断时 ST-LINK 连接丢失?
我正在尝试在 STM32F767ZI 上使用 SysTick。
尝试时:
#include "./headers/stm32f767xx.h"
void init_sysTick(void)
{
SysTick->LOAD = 18749UL; // set the reload value,speed is 18.75MHz
SysTick->VAL = 0UL; // set the starting value
SysTick->CTRL = 0b111; // enable SysTick,SysTick interrupt and set clock source to the processor clock
}
GDB 服务器返回此错误:
Error! Failed to read target status
Debugger connection lost.
Shutting down...
以及返回此内容的 GDB 客户端:
warning: Remote failure reply: E31
Remote communication error. Target disconnected.: No error.
我四处询问,得出的结论是,ST-LINK 连接丢失的最可能原因是使 ST-LINK 进入低功耗模式的时钟。
然而,通过阅读 STM32F76xxx documentation,特别是在低功耗模式下,情况似乎并非如此。文档指出:
MCU 通过执行 WFI(等待中断)进入低功耗模式,或 WFE(等待事件)指令,或当 Cortex®-M7 中的 SLEEPONEXIT 位 系统控制寄存器在 ISR 返回时设置。
...据我所知,我没有执行任何 WFI 或 WFE 指令。
通过多玩一些这段代码,我发现了一些非常令人惊讶的事情:
#include "./headers/stm32f767xx.h"
void init_sysTick(void)
{
SysTick->LOAD = 18749UL; // set the reload value,speed is 18.75MHz
SysTick->VAL = 0UL; // set the starting value
SysTick->CTRL = 0b101; // enable SysTick and set clock source to the processor clock
}
设置 CTRL 寄存器(也称为 ARM documentation 中的 SYST_CSR 或 SysTick 控制和状态寄存器),但 没有启用中断,不会像以前那样导致 ST-LINK 失去连接。
我正在使用 ST 提供的向量表,并为 SysTick 中断创建了一个 ISR:void SysTick_Handler(void);
。向量表也被设置为闪存的开始,这是应该的。我过去曾设法让 GPIO 中断工作。
我也尝试过使用 Cortex-M7 CMSIS 驱动程序以及 STM32CubeIDE 提供的代码,但它与我在上面编写和显示的内容基本相同,因此产生了相同的结果。
任何支持或建议将不胜感激,我想知道我是否认为这是由于低功耗模式导致的错误方向?
SysTick_Hander 函数:
全局.h
volatile uint32_t sysTicks;
void SysTick_Handler(void);
global.c
#include "./global.h"
void SysTick_Handler(void)
{
sysTicks++;
}
解决方法
ST-LINK 连接丢失是由于时钟保持 ST-LINK 进入低功耗模式
ST-Link 有自己的微控制器。您无法使用您的程序将其“置于”低功耗模式。
测试程序:
- 检查您是否在启动文件中声明了向量表。如果不是,那就是问题所在。
- 在向量表定义中检查系统杆处理程序使用的符号。如果不同,则最终会出现在 HF 中。
- 生成 Cube 项目(根据您的代码判断您有自己的启动导致问题)并查看向量表是如何定义的并将其与您自己的进行比较。
如果以上都不起作用 - 压缩项目,将其发送到某个存储(如谷歌驱动器并发布链接)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。