你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G474 mian()函数中变量被异常改写的问题

[复制链接]
Rancho1122 提问时间:2024-9-2 15:20 / 未解决
问题描述:创建一个最基本的工程(STM32G474),只配置时钟和GPIO(作为debug pin),代码如下:


#include "main.h"
#include "gpio.h"

uint16_t u16Debug = 10;

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();

while (1)
{
if (u16Debug == 59390)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
}
}
}

程序将u16Debug初始化为10,但通过debug pin会发现,程序运行一会后(4ms--5ms),u16Debug被改写为59390,不知是何原因?

目前我的几个发现是
1.只有第一个变量会被改写,例如在u16Debug之后再定义一个变量u16Debug2,u16Debug2是不会被改写的;
2.代码下载到MCU flash后,如果MCU自动运行,必然复现该问题。但如果MCU不会自动运行,需要通过按开发板上的reset按钮重新复位并启动MCU或者通过keil的debug功能启动MCU,则不会出现该问题。

更新:因为我发现出现该问题的工程都是“MCU会自动运行”,因此考虑是魔法棒里ST-Link Debugger的设置问题。最终定位到ST-Link Debugger的Flash Download选项卡中要勾选Reset and Run,那么MCU就会自动运行了,且可以复现上述问题。同时,如果在Pack选项卡中取消勾选Enable,那么上述问题就没有了。所以应该是Pack的原因,暂时还没搞清楚其中原理

望解答。

收藏 评论4 发布时间:2024-9-2 15:20

举报

4个回答
xmshao 回答时间:2024-9-2 16:36:17
你真的只是定义了一个初始值为10的变量u16Debug ,然后就没完没了地while循环里检查它的值是否等于59390这个特定值?


是否有在别的地方u16Debug 做操作呢? 如果在中断里有对该变量做操作,在定义它时不妨加上volatile.
Rancho1122 回答时间:2024-9-2 17:18:52

xmshao 发表于 2024-9-2 16:36
你真的只是定义了一个初始值为10的变量u16Debug ,然后就没完没了地while循环里检查它的值是否等于59390这 ...

是的。其他地方没有对u16Debug做操作,定义它时加上volatile也同样会有该问题。

目前问题已经规避,方法已经在上面更新了,但还不知道其中原理

yr 回答时间:2024-9-3 17:14:11

如果没有其他地方更改这个变量,怎么会变化呢?可以尝试声明为static变量,规避其他地方改动,我确信这个值将不会改变,一直为10.

废鱼 回答时间:2024-9-4 18:42:40

检查是不是有野指针的操作,导致写入到这个地址。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版