KEIL编译USB功能异常IAR编译正常
本帖最后由 shipeng 于 2024-12-24 21:37 编辑<div>如附件工程,其中包含了MDK和IAR工程文件,此两个工程共用一套源码文件。芯片采用STM32F103C8T6,实现功能为USB连接电脑可识别为一个U盘,往其中放入FIRMWARE.bin文件可实现更新固件功能,且必须指定为FIRMWARE.bin文件才可更新固件,当写入其它文件不会改写固件数据,为了解决 “写入其它文件会改写固件数据的问题” 花了我一整天的摸鱼时间才调试完成,现在无偿分享给大家使用。实现方式是连接电脑或手机后初始文件存储了一个FIRMWARE.bin文件,此文件占用全部有效的固件FLASH区,写入数据必须替换FIRMWARE.bin的同名文件写入才有效,否则数据会写入无效空间。另外现在遇到的问题是使用KEIL MDK编译生成的目标文件USB功能异常,连接USB电脑不能识别设备,但IAR编译生成的目标文件USB功能是正常的连接电脑USB可以正常识别且操作正常,还希望大家能帮我找一下原因,在此感激不尽。<br />
</div>
之前也遇到过STM32F105作为主机读U盘升级的工程也是KEIL编译生成的目标文件USB功能不正常但其他功能没有问题可以正常跳转APP,IAR一切正常,也不知道是什么原因 <p>你这个问题我还头一次听说,我乱猜的啊,你可以试试KEIL MDK编译的选项更改一下<strong>,就是优化选项Optimization的-O0、-O1、-O2、-O3<em>等级。</em></strong></p>
<p>就像楼上说的,只能修改修改Keil编译的配置参数看看能不能解决问题。</p>
<p>我的猜测是:你的应用启动后,由于下面的代码挑战到应用了,建议先去掉如下代码,调试USB是否正常,在设置目标固件的地址。</p>
<pre>
<code class="language-cpp">/* Keep the user application running */
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
</code></pre>
<p>目标程序中断程序是否设置正确。</p>
<p> </p>
bigbat 发表于 2024-12-25 11:00
我的猜测是:你的应用启动后,由于下面的代码挑战到应用了,建议先去掉如下代码,调试USB是否正常,在设置 ...
<p>不对吧,如果是代码问题那IAR编译生成的目标文件也应该有问题才对,现在是用IAR编译功能是正常的。</p>
<div class='shownolgin' data-isdigest='no'>bigbat 发表于 2024-12-25 11:00
我的猜测是:你的应用启动后,由于下面的代码挑战到应用了,建议先去掉如下代码,调试USB是否正常,在设置 ...
<p>bigbat说的对,和这个设定也有关系,,楼主可以试验一下。。</p>
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <div class='shownolgin' data-isdigest='no'>shipeng 发表于 2024-12-25 11:20
不对吧,如果是代码问题那IAR编译生成的目标文件也应该有问题才对,现在是用IAR编译功能是正常的。
<p>可能原始项目是由IAR编写,所以在项目中的编译或链接参数是被修改了,keil就不一定了</p>
<p> </p>
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'><div>其实自从发现KEIL有问题后就一直用的IAR做编译,期间源代码也修改了很多次增加了一些功能如显示屏驱动。由于时隔很久刚刚又试了一下KEIL编译居然也好了,现在USB功能一切正常,keil工程配置基本没动,就添加了显示屏包含路径。<br />
</div>
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'><p>编译器有bug,换着来,实在不行就减小优化级别</p>
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'><div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&goto=findpost&pid=3383582&ptid=1302743" target="_blank"><font color="#999999">freebsder 发表于 2024-12-25 14:32</font></a></font> 编译器有bug,换着来,实在不行就减小优化级别</blockquote>
</div>
<p>减小优化级别我好像也试过也不行,但是现在它自己好了我都不知道是怎么好的,现在优化级别还是最高的</p>
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'><p>MDK和IAR的配置还是有一些差异的 </p>
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>shipeng 发表于 2024-12-25 16:53
减小优化级别我好像也试过也不行,但是现在它自己好了我都不知道是怎么好的,现在优化级别还是最高的
<p>一般不开优化,编译器很多时候优化的太扯,我记得有一次做IAP跳转的功能,IAR的编译器开的低档优化,直接把功能都给直接优化掉了。</p>
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>freebsder 发表于 2024-12-26 15:01
一般不开优化,编译器很多时候优化的太扯,我记得有一次做IAP跳转的功能,IAR的编译器开的低档优化,直接 ...
<p>这么离谱的优化我倒是没有遇到过,我只遇到过变量优化加个volatile修饰即解决,我现在还是习惯把优化开到最大一般都没啥问题</p>
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>shipeng 发表于 2024-12-26 21:32
这么离谱的优化我倒是没有遇到过,我只遇到过变量优化加个volatile修饰即解决,我现在还是习惯把优化开到 ...
<p>2020年左右的版本,两个编译器,keil的iar的,跳转那块,keil的优化掉了,iar的优化了直接报异常。</p>
</div><script>showreplylogin();</script>
页:
[1]