KEIL运行的问题,STM32在Keil调试时能成功运行但下载就运行不了的问题

KEIL运行的问题,STM32在Keil调试时能成功运行但下载就运行不了的问题

关于STM32 Keil下载程序后不能自动运行的解决方案

本方案采用stm32f1系列芯片,boot0和boot1均对地下拉10K电阻。务必按照图片上红框内设置最后一步是重点,不然前面的设置就白费了,由于能运行,具体原因也没去研究。为了给自己涨个记性,所以写个帖子放这里,时刻提醒自己,要细心。

本方案采用stm32f1系列芯片,boot0和boot1均对地下拉10K电阻。

新打的板子,刚焊好,下载程序后发现居然不能运行,就连纯粹的点灯都点不亮,瞬间心里一万只草泥马奔跑。一时间脑子崩溃,查了电源、PCB、程序都他娘的没问题,Keil也是设置下载后自动运行的。难道某宝高价购买的芯片翻车了?那就尴尬了,对keil研究了一番,果然是(bu)设(xi)置(xin)的问题。

废话不多说,直接上图,按照图片设置,下载后立马灯亮。

务必按照图片上红框内设置

最后一步是重点,不然前面的设置就白费了,由于能运行,具体原因也没去研究。

为了给自己涨个记性,所以写个帖子放这里,时刻提醒自己,要细心。

记得之前在STM32上做串口终端的时候图方便,想用C库里的 printf() ,于是重载了 putc()?,也在 keil 的项目配置中勾选了 Use MicroLIB 选项。但是程序下载到STM32上之后,串口却一点反应也没有,我先是检查了时钟、GPIO配置和串口使能,发现都没问题。而且调试的时候程序正常运行,串口也正常输出。后来发现程序在调试的时候总是会在停在 BKPT 0xAB 指令处,但它又不属于用户代码,因此意识到是标准库的问题(准确来说是我自己的问题)。最后发现要使用 printf() 重载的是 fputc() 而不是 putc() 。

近来我又遇到类似问题,同样是下载后没反应,同样是调试的时候可以顺利运行,但是这回我在程序中没有使用 printf() 函数,因此起初调试的时候没有想到是标准库的问题。而后我在数次调试中看到了熟悉的身影,依旧是指令?BKPT 0xAB 。

可这次我没有使用 printf() ,怎么还会有软件断点呢?而且这次的 BKPT 是在程序刚刚开始运行的时候就出现的,比 startup 运行得还要早,这就更不可能是 printf() 的问题了。不过幸运的是,我们可以在调试洁界面的调用栈中看到当前所处的函数:_sys_command_string()

?根据 keil 网站提供的帮助文档中我们可知,_sys_command_string() 是C库中用于向 main 函数提供命令行调用参数的函数。它在堆初始化前就被执行,肯定是早于 SystemInit() 和 main() 的。

问题到这里就解决了,我虽然没有使用 printf() ,但是包含了C库 stdio.h 并且没有勾选 Use MicroLIB ,导致标准C库被调用,程序卡死在半主机模式(也就是 BKPT 软件断点等待主机调试端响应)下。解决方法也很简单,在项目配置中勾选 Use MicroLIB 然后重新编译(Rebuild)即可。

---------------------------------------------------------分割线---------------------------------------------------------

关于为何要重新编译而不是直接点编译,则又是一部血泪史了。

曾经解决 BKPT 问题的时候,还让我发现了一个新问题。这问题也算是一个 keil 的小bug吧……在项目没有勾选 Use MicroLIB 的时候点击编译,毫无疑问,只要你代码本身没问题,编译器也不会报错。可是当你回过头来选择 Use MicroLIB 的时候再次点击编译(Build)的时候,却惊讶的发现了编译器的报错:

.\Objects\xxx.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_stm32f40_41xxx.o).

.\Objects\xxxaxf: Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).

?(奇妙不奇妙?!)

这是因为 keil 在你点击编译的时候只会编译内容有变动的部分(指预处理后的部分)。当你选择使用 MicroLIB 的时候,编译器会自动添加宏定义 __MICROLIB ,相对应的,头文件中的内容就会有所改变,导致包含了头文件的 .c 文件内容改变。

可以看到,清一色都是 .c 文件。而 startup 中处存在的条件汇编语句却没有得到预处理和汇编:

?

被抛弃的部分是堆栈的初始化处理程序,可以看出定义了??__MICROLIB 宏和没有定义时堆栈的初始化是交由不同的函数处理的。但是编译的时候没改变这里的条件汇编,结果没有初始化的程序了,因此报错“符号未定义”。解决方式同样很简单,点击重新编译即可。(想当初为了解决把startup.s 给改了,真是醉了)

(文章为个人经验,仅作自身警醒之用,如有错漏请见谅)

1.出现的问题

为什么我keil调试或仿真的时候总是弹出对话框警告我 evaluation mode(评价模式) Running with Code Size Limit: 2K(运行代码大小限制:2K)

什么含义呢:也就是当我们的运行代码大小超过2K,也就是超过2048个字节时,我们的代码将不能进入调试模式。

第一个问题来了:怎么知道我们的运行代码大小呢?

就是我们编译时产生的编译信息那里:单位字节(byte)

第二问题来了:有人会问,我进入调试模式了啊,和正常的调试模式界面一样,也就是如下图所示的界面:

但是你会发现一个问题:调试的时候进入不了main函数:你逐步运行调试,它却一直在汇编里反复运行,一直出不来,

你如果在细心看一下调试命令区的信息(左下角),如下图所示: error 120:code size limit exceeded 错误120:超过代码大小限制 如果你之前在函数放置了断点,还会发现本来红色的断点变成了灰色的感叹号!

2.为什么会这样呢?

我们可以去keil界面,文件->许可与管理 如下,发现有一串红红的东西,说明那个码过期了,像我这个,这个码支持的期限也就到2020年10月就过期了。 有人会这样做,去获取这个这个码的软件那里,在生成一个新的码不就行了吗? 但你会发现,原来的获取这个码的软件产生的码,无论你怎么生成,这个码的期限最多到2020年12月就凉了。怎么办呢?

3.解决办法,怎么做呢!简单!!

换个注册软件就行了,记得关闭杀毒软件哦,否则你的电脑解压文件后,注册软件就没了

注册软件链接: https://pan.baidu.com/s/1KGPMWV4pM0onClp9RSakwA. 提取码:5yzo 如果注册后还是提示的话,要清理一下这个工程了,因为限制的信息残留在工程里,要清理一下,在编译,如下图所示

补充:经很多萌新私信给我反应,点击添加(Add LIC)时出现了下面这个问题,我补充一下: 这个提示的信息是:没有注册使用权,需要管理员权限 出现这个问题是没有用管理员身份运行,被拒绝了 要用管理员身份运行软件注册哦!如下图所示:

最后,感谢阅读本文章,本文对于各位大佬,萌新有帮助的,给予小小的我一个赞和收藏哦

相关推荐

西安人必看!长安通7大功能!一张卡竟有这么多用途!
紫光电子智能手表排行榜
365体育投注备用网站

紫光电子智能手表排行榜

📅 08-03 👁️ 7844
佳能800d续航时间?
365体育投注备用网站

佳能800d续航时间?

📅 09-14 👁️ 725
wiiu怎么更新游戏
365体育投注备用网站

wiiu怎么更新游戏

📅 07-30 👁️ 1704
请问贷款一期是多少天?
GBT36507-2018

请问贷款一期是多少天?

📅 08-08 👁️ 1803
不止张雨绮,原来圈里这么多明星有狐臭
365体育投注备用网站

不止张雨绮,原来圈里这么多明星有狐臭

📅 09-05 👁️ 6756