OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8645|回复: 4

使用STM32CubeIDE运行TouchGFX不起来

[复制链接]

53

主题

566

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

一、将下载算法的文件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

打开调试设置参数,如下:
1.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. {
  16. 启动代码进入“FLASH”ROM型内存 */
  17. .isr_vector :
  18. {
  19. . = ALIGN(4);
  20. KEEP(*(.isr_vector)) /* 启动代码 */
  21. .= 对齐(4);
  22. } >FLASH

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

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

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

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

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

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

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

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

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

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

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

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

  96. } >RAM AT> FLASH

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

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

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

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

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

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

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

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

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

2.png

可以看到flash和SDRAM内存空间大小已经显示出来,编译不报错,但是SDRAM使用为0,这看起来不正常,可以正常下载进去,但是板子跑不起来,仿真进入hal.initialize()的Bitmap::setCache((uint16_t*)(Bank5_SDRAM_ADDR+ frameSize*3),BITMAP_CACHE_SIZE,1)这一步就进入ardFault_Handler(硬件错误中断))。


  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.     // Calling parent implementation of initialize().
  4.     //
  5.     // To overwrite the generated implementation, omit call to parent function
  6.     // and implemented needed functionality here.
  7.     // Please note, HAL::initialize() must be called to initialize the framework.

  8.     TouchGFXGeneratedHAL::initialize();
  9.     uint32_t frameSize = 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.         //setFingerSize(1);
  13.         //setTouchSampleRate(1);

  14.         //kc.init();
  15.         //setButtonController(&kc);

  16.         //图片缓存功能
  17.         #define BITMAP_CACHE_SIZE        0x1400000               
  18.         W25QXX_Init();
  19.         Bitmap::setCache((uint16_t*)(Bank5_SDRAM_ADDR+ frameSize*3),BITMAP_CACHE_SIZE,1);
  20.         Bitmap::cacheAll();

  21.         HAL_GPIO_WritePin(LCD_BL_GPIO_Port,LCD_BL_Pin,GPIO_PIN_SET);
  22. }
复制代码



因为Bank5_SDRAM_ADDR这个宏定义指向的是((u32)(0XC0000000)),但是IDE应该是不识别这个地址段,请问论坛的哪位大神告知一下,如何更改?是不是这个问题导致的?:handshake




回复

使用道具 举报

0

主题

459

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1735
金钱
1735
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-5-7 09:53:48 | 显示全部楼层
帮顶         
回复

使用道具 举报

53

主题

566

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2129
金钱
2129
注册时间
2017-2-11
在线时间
308 小时
 楼主| 发表于 2022-5-9 20:43:31 | 显示全部楼层
回复

使用道具 举报

53

主题

566

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2129
金钱
2129
注册时间
2017-2-11
在线时间
308 小时
 楼主| 发表于 2022-5-13 21:59:40 | 显示全部楼层
回复

使用道具 举报

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2014-11-18
在线时间
58 小时
发表于 2022-6-6 16:00:08 | 显示全部楼层
我也遇到这个问题了, 你解决了吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

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

GMT+8, 2026-10-1 09:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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