OpenEdv-开源电子网

 找回密码
 立即注册
查看: 2275|回复: 1

使用STM32CubeIDE下载touchgfx程序跑不起来

[复制链接]

53

主题

566

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2077
金钱
2077
注册时间
2017-2-11
在线时间
305 小时
发表于 2022-5-5 23:08:20 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 jiangyy 于 2022-5-6 21:02 编辑

一、将下载算法的文件STM32F767_W25Q256.stldr放入到C:\Drivers\STMicroelectronics\STM32CubeIDE_1.9.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.0.200.202202231230\tools\bin\ExternalLoader

打开调试设置参数,如下:

download.png

二、增加外部flash(W25Q)和外部SDRAM
编写链接文件 STM32F767IGTX_FLASH.ld,代码如下:

  1. /* 用户模式堆栈的最高地址 */
  2. _estack = 源(RAM) + 长度(RAM);/* 结束的 “RAM” RAM 类型内存 */

  3. _Min_Heap_Size = 0x1000 ;/* 所需堆量 */
  4. _Min_Stack_Size = 0x800 ;/* 所需堆栈量 *//

  5. * 内存定义 */
  6. 内存
  7. {
  8. RAM (xrw) : 原点 = 0x20000000,长度 = 512K
  9. 闪存 (rx) : 原点 = 0x8000000,长度 = 1024K
  10. SRAM (rx) : 原点 = 0xC0000000,长度 = 32M
  11. QSPIFlash (rx) : 原点 = 0x90000000,长度 = 32M
  12. }

  13. /* 节 */

  14. {
  15. 启动代码进入“FLASH”ROM型内存 */
  16. .isr_vector :
  17. {
  18. . = ALIGN(4);
  19. KEEP(*(.isr_vector)) /* 启动代码 */
  20. .= 对齐(4);
  21. } >FLASH

  22. /* 将程序代码和其他数据放入“FLASH”Rom 类型内存 */
  23. .text :
  24. {
  25. . = ALIGN(4);
  26. *(.text) /* .text sections (code) */
  27. *(.text*) /* .text* sections (code) */
  28. *(.glue_7) /* glue arm to thumb code */
  29. *(.glue_7t) /* glue thumb to arm code */
  30. *(.eh_frame)

  31. KEEP (*(.init))
  32. KEEP (*(.fini))

  33. 。= 对齐(4);
  34. _etext = .;/* 在代码末尾定义一个全局符号 */
  35. } >FLASH

  36. /* 常量数据到“FLASH” Rom 类型内存中 */
  37. .rodata :
  38. {
  39. . = ALIGN(4);
  40. *(.rodata) /* .rodata sections (constants, strings, etc.) */
  41. *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
  42. . = ALIGN(4);
  43. } >FLASH

  44. .ARM.extab : {
  45. . = ALIGN(4);
  46. *(.ARM.extab* .gnu.linkonce.armextab.*)
  47. .= 对齐(4);
  48. } >闪光灯

  49. .ARM : {
  50. . = ALIGN(4);
  51. __exidx_start = .;
  52. *(.ARM.exidx*)
  53. __exidx_end = .;
  54. 。= 对齐(4);
  55. } >FLASH

  56. .preinit_array :
  57. {
  58. . = ALIGN(4);
  59. PROVIDE_HIDDEN (__preinit_array_start = .);
  60. 保持 (*(.preinit_array*))
  61. PROVIDE_HIDDEN (__preinit_array_end = .);
  62. 。= 对齐(4);
  63. } >FLASH

  64. .init_array :
  65. {
  66. . = ALIGN(4);
  67. PROVIDE_HIDDEN (__init_array_start = .);
  68. KEEP (*(SORT(.init_array.*)))
  69. KEEP (*(.init_array*))
  70. PROVIDE_HIDDEN (__init_array_end = .);
  71. 。= 对齐(4);
  72. } >FLASH

  73. .fini_array :
  74. {
  75. . = ALIGN(4);
  76. PROVIDE_HIDDEN (__fini_array_start = .);
  77. KEEP (*(SORT(.fini_array.*)))
  78. KEEP (*(.fini_array*))
  79. PROVIDE_HIDDEN (__fini_array_end = .);
  80. 。= 对齐(4);
  81. } >FLASH

  82. /* 由初创公司用于初始化数据 */
  83. _sidata = LOADADDR(.data);

  84. /* 将数据部分初始化为“RAM”Ram 类型内存 */
  85. .data :
  86. {
  87. . = ALIGN(4);
  88. _sdata = .; /* 在数据开始时创建一个全局符号 */
  89. *(.data) /* .data 部分 */
  90. *(.data*) /* .data* 部分 */
  91. *(.RamFunc) /* .RamFunc 部分 */
  92. *(.RamFunc*) /* .RamFunc* 部分 */

  93. .= 对齐(4);
  94. _edata = .;/* 在数据端定义一个全局符号 */

  95. } >RAM AT> FLASH

  96. /* 未初始化的数据部分到“RAM”Ram 类型内存中 */
  97. 。= 对齐(4);
  98. .bss :
  99. {
  100. /* 这是启动器用来初始化 .bss 部分 */
  101. _sbss = .; /* 在 bss 开始处定义一个全局符号 */
  102. __bss_start__ = _sbss;
  103. *(.bss)
  104. *(.bss*)
  105. *(COMMON)

  106. . = ALIGN(4);
  107. _ebss = .; /* 在 bss 结尾定义一个全局符号 */
  108. __bss_end__ = _ebss;
  109. } >RAM

  110. /* User_heap_stack部分,用于检查是否有足够的“RAM”Ram类型内存剩余 */
  111. ._user_heap_stack :
  112. {
  113. . = ALIGN(8);
  114. 提供 ( 结束 = . );
  115. PROVIDE ( _end = . );
  116. 。= .+ _Min_Heap_Size;
  117. 。= .+ _Min_Stack_Size;
  118. 。= 对齐(8);
  119. } >RAM

  120. .sram(NOLOAD) :
  121. {
  122. . = ALIGN(4);
  123. _SRAM_SYMBOLS = .; /* 在数据开始时创建一个全局符号 */
  124. *(.sram) /* .data sections */
  125. *(.sram*) /* .data* sections */

  126. . = ALIGN(4);
  127. _ESRAM_SYMBOLS = .; /* 在数据端定义全局符号 */

  128. } >SRAM /*AT> FLASH*/

  129. /* 从编译器库中删除信息 */
  130. /DISCARD/ :
  131. {
  132. libc.a ( * )
  133. libm.a ( * )
  134. libgcc.a ( * )
  135. }

  136. ExtFlashSection :
  137. {
  138. *(ExtFlashSection ExtFlashSection.*)
  139. *(FontFlashSection FontFlashSection.*)
  140. *(TextlashSection TextlashSection.*)
  141. . = ALIGN(0x4);
  142. } >QSPIFLASH

  143. 。ARM.attributes 0 : { *(.ARM.attributes) }</font>
  144. }
复制代码
编译结果如下:
111.png

可以看到flash和SDRAM内存空间大小已经显示出来,编译不报错,但是SDRAM使用为0,这看起来不正常,可以正常下载进去,但是板子跑不起来,仿真进入hal.initialize()就进入ardFault_Handler(void)。


  1. void touchgfx_init()
  2. {
  3. Bitmap::registerBitmapDatabase(BitmapDatabase::getInstance(), BitmapDatabase::getInstanceSize());
  4. TypedText::registerTexts(&texts);
  5. 文本::设置语言(0);

  6. FontManager::setFontProvider(&fontProvider);

  7. FrontendHeap& heap = FrontendHeap::getInstance();
  8. /*
  9. * 我们需要获取上面的引用来初始化前端堆。
  10. */
  11. (空)堆;

  12. /*
  13. * Initialize TouchGFX
  14. */
  15. hal.initialize();</font>
  16. }
复制代码
我怀疑是touchgfx初始化申请内存没成功导致,代码如下(正点原子的tougfx例程代码):
  1. void TouchGFXHAL::initialize()
  2. {
  3. // 调用 initialize() 的父实现。
  4. //
  5. // 要覆盖生成的实现,请省略对父函数
  6. 的调用 // 并在此处实现所需的功能。
  7. // 请注意,必须调用 HAL::initialize() 来初始化框架。

  8. TouchGFXGeneratedHAL::initialize();
  9. uint32_t帧大小 = DISPLAY_HEIGHT * DISPLAY_WIDTH * 2;
  10. setFrameBufferStartAddresses((void *)Bank5_SDRAM_ADDR,(void *)(Bank5_SDRAM_ADDR + frameSize),(void *)(Bank5_SDRAM_ADDR + frameSize * 2));
  11. setFrameRateCompensation(true);

  12. //图片缓存功能
  13. #define BITMAP_CACHE_SIZE 0x1400000
  14. W25QXX_Init();
  15. 位图::setCache((uint16_t*)(Bank5_SDRAM_ADDR+ frameSize*3),BITMAP_CACHE_SIZE,1);
  16. 位图::cacheAll();

  17. HAL_GPIO_WritePin(LCD_BL_GPIO_Port,LCD_BL_Pin,GPIO_PIN_SET);</font>
  18. }
复制代码
因为Bank5_SDRAM_ADDR这个宏定义指向的是((u32)(0XC0000000)),但是IDE应该是不识别这个地址段,请问论坛的哪位大神告知一下,如何更改?是不是这个问题导致的?:handshake


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

53

主题

566

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2077
金钱
2077
注册时间
2017-2-11
在线时间
305 小时
 楼主| 发表于 2022-5-13 22:00:05 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-19 07:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表