查看: 376|回复: 1

[评测分享] 【STM32H735-DK 测评】+TouchGFX工程修改使用MDK开发编译

[复制链接]
  • TA的每日心情
    慵懒
    昨天 00:01
  • 签到天数: 1775 天

    连续签到: 35 天

    [LV.Master]伴坛终老

    发表于 2024-3-24 13:04:36 | 显示全部楼层 |阅读模式
    分享到:
    在使用TouchGFX开发生成的工程时,会生成keilIAR,和STM32CubeIDE的开发工程模板。但是在使用KEIL打开工程时,使用AC6编译会发现有很多错误,编译不成功。如下图所示。这里我就记录一下如何解决这些编译错误。方便在keil中开发编程。

    图片1.png

    下面就来分享一下如何解决这些错误。先从第一个错误开始。找不到FreeRTOS头文件PortMacro.h.

    图片2.png

    首先我们找一下在工程中是否存在这个文件。其次就是keil设置头文件路径是否正确。
    如下图发现文件是存在的,咱们再看看keil头文件路径是否包含

    图片3.png

    打开设置可以看到Keil中头文件路径不对。我们修改一下路径。

    图片4.png

    如下修改路径。修改之后编译一下,发现错误减少了很多,刚刚的错误消失了。

    图片5.png

    下面解决其他错误,也是找不到头文件。我们还是继续找到这个文件的路径,然后添加keil上。

    图片6.png

    文件路径如下:

    图片7.png

    将该路径添加至keil设置中。

    图片8.png
    以上所有针对头文件找不到的错误都可以根据这样的方法去解决。都是没有包含路径的原因。

    下面是文件找不到错误,其实也是文件路径不对。我们重新添加该文件,

    图片9.png

    最终还剩这一个错误和几个警告。这个错误的意思是vTaskSwitchContext函数被优化没了,所以我们要解决这个函数必须编译不被优化。

    图片10.png

    vTaskSwitchContext函数添加__attribute__((used))属性就可以保证编译有效了。

    图片11.png


    最后我们要添加TouchGFXlib库文件。要选择合适的lib库文件。

    图片12.png


    添加库之后编译还有一些错误。如图:剩下这些错误应该是TouchGFX设计新生成的文件没有自动添加到keil工程中,所以我们还要将新生成的设计文件添加进来。

    图片13.png

    下面添加TouchGFX的设计生成的Cpp文件添加进Keil中。

    图片14.png


    通过添加文件之后,最终编译成功。

    图片15.png

    最后总结一下,keil工程编译错误主要原因是:
    1keil工程头文件路径设置未包含。
    2:就是工程文件添加不完整,工程内缺少lib文件和Cpp文件。
    3:就是Freertos部分文件错误。

    下面就是试试下载调试看看正否正常。
    下载之后会发现直接进HardFault_Handler了。看了一下是在进main之前加载数据段的时候就死机了。
    1.png
    这个查找了一下原因怀疑与编译还剩的警告可能有关,那个是下载链接存储段相关的。后来通过搜索进行如下解决方案。
    2.png
    下面就解决这个警告问题。网上搜索这个警告是如下解决的:
    3.png
    4.png

    下面是我的修改,先链接文件增加
    5.png

    然后那3个警告位置如下修改:
    将LOCATION_ATTRIBUTE_NOLOAD改为LOCATION_ATTRIBUTE。
    后面段改为增加.bss.前缀。
    6.png

    7.png
    做出修改之后,编译警告也没有了。

    下面再次下载试试。调试发现会卡在如下位置BKPT  0xAB。这个问题搜索了一下是因为Semihosting 被使能了。
    8.png
    根据网上的解决办法关闭Semihosting 模式。下面是我添加的关闭代码
    1. /*----------------------------------------------------------------------------*
    2. * Disable Semihosting                                                        *
    3. *----------------------------------------------------------------------------*/
    4. #if     1   //defined(__IS_COMPILER_ARM_COMPILER_6__)
    5. __asm(".global __use_no_semihosting\n\t");
    6. __asm(".global __use_no_semihosting_swi\n\t");
    7. #   ifndef __MICROLIB
    8. __asm(".global __ARM_use_no_argv\n\t");
    9. #   endif

    10. void _ttywrch(int ch)
    11. {
    12.     UNUSED(ch);
    13. }

    14. #if !defined(RETARGET_SYS)
    15. #include <rt_sys.h>
    16. FILEHANDLE $Sub$_sys_open(const char *name, int openmode)
    17. {
    18.     UNUSED(name);
    19.     UNUSED(openmode);
    20.     return 0;
    21. }
    22. #endif

    23. __NO_RETURN
    24. void _sys_exit(int ret)
    25. {
    26.     UNUSED(ret);
    27.     while(1) {}
    28. }
    29. #endif
    复制代码

    然后再次编译下载,这次就全部正常了。



    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:27
  • 签到天数: 99 天

    连续签到: 3 天

    [LV.6]常住居民II

    发表于 2024-3-26 16:55:42 | 显示全部楼层
    大佬确实花了不少时间来解决这个方法,如果再使用cubemax生成一下工程,会不会需要再去设置,我偿试了几次后,还是用他的cubeIDE比较省心。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-28 05:39 , Processed in 0.123278 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.