
问题描述:创建一个最基本的工程(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的原因,暂时还没搞清楚其中原理 望解答。 |
boost电路程序控制
stm32h725
STM32G474RBT3 HRTIME 与 TIM 相位差。
STM32G474 BOOST电路双环PID的用法
STM32G474RET6移相问题
stm32G474 HRTimA和hrtimB给相同的比较值,但是TA正常,TB出现了丢波的情况
怎么用HRTIM输出可变占空比的PWM?
STM32G474使用HRTIME完成两路180度移相问题
STSPIN32G4的AN5432文档资料去哪里找?
LIS2MDL X轴数据读取问题
是否有在别的地方u16Debug 做操作呢? 如果在中断里有对该变量做操作,在定义它时不妨加上volatile.
是的。其他地方没有对u16Debug做操作,定义它时加上volatile也同样会有该问题。
目前问题已经规避,方法已经在上面更新了,但还不知道其中原理
如果没有其他地方更改这个变量,怎么会变化呢?可以尝试声明为static变量,规避其他地方改动,我确信这个值将不会改变,一直为10.
检查是不是有野指针的操作,导致写入到这个地址。