开发环境描述
MCU:STM32G474RBT3
晶振频率:8M
STM32CubeMX :6.14.0
固件库:STM32Cube FW_G4 V1.6.1
Keil : V5.38.0
问题描述
最近使用STM32CubeMX开发STM32G474RB,配置了一个LED的程序测试,配置好cubemx后生成的MDK,编译烧录到stm32后无法成功点亮LED,进入debug后,发现程序直接就处于运行状态了,并卡在汇编的这一行:0x44820C00 0000 MOVS r0,r0
无法进行任何调试,0x44820C00地址也是一个异常的地址。
一开始以为是没勾选MicroLIB,勾选后发现能调试了,但是卡在
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{
return SysTick_Config(TicksNumb);
}
systick初始化之后出了问题,随后发现,SystemCoreClock系统时钟等数值都不对
网上找了很多教程都无法解决,最后通过设置MDK解决,在此记录下来,与大家分享解决方法。
解决方法
STM32CubeMX中仅配置了2个LED,RCC,SWD,此处仅放图,没什么特别的操作。
随后生成项目并打开keil,点击魔术棒,在Linker选项卡中,选中Use Memory Layout from Target Dialog,这一步很重要!之前种种异常都是因为这个默认没选中导致的,下面的那个sct文件是cubemx生成的,但是有问题,所以要选这个,使用Target选项卡中设置的Flash和RAM地址。
随后在Debug选项卡,选好调试器后,点开Settings,我用的STlink
如图设置
确定退出后,在while(1)中插入点灯代码
HAL_Delay(500);
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
烧录后即可看到LED闪烁了。
调试也没有问题了。
总结
解决问题的关键是
1、在Linker选项卡中,选中Use Memory Layout from Target Dialog
2、在Debug ——》Setting 中,Pack选项卡,取消选中Enable
原因嘛,应该是Cubemx生成的“stm32g474xx_flash.sct”文件有问题,有兴趣的可以自行对比Use Memory Layout from Target Dialog选中后生成的sct文件,Cubemx的bugs,习惯了就好了。。。
如图,经过对比可发现,Cubemx生成的.sct文件,少了方框中的两行,加上了也好了,也可以改这个文件,不然每次在Cubemx改动后重新生成项目,Cubemx都会把Use Memory Layout from Target Dialog去掉,还要再操作一遍挺麻烦的,改这个文件加两行代码也行。
*.o (RESET, +First)
*(InRoot$$Sections)