硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6579|回复: 12
收起左侧

[技术分享] TOOLS 烧录算法使用

  [复制链接]

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2019-11-23 09:52:59 | 显示全部楼层 |阅读模式
本帖最后由 zhaoqi 于 2019-12-18 00:32 编辑

前言
------------------
STM32H750 系列官方宣传为 128K, 而且后续的 "V" 版本将频率提高到 480M , FLASH 回到 128K, 所以后续将只能使用 QSPI, 程序烧写到 32M 的 W25Q256 中。


烧写算法的使用
------------------

J-FLASH


在 JLINK 软件的安装目录下, 找到 Devices/ST , 将附件中的 STM32H743_H7-TOOLS.FLM 放到此目录中。如下图所示:
ST-FLM.png

    <Device>
        <ChipInfo Vendor="ST" Name="STM32H743XI_H7-TOOLS" WorkRAMAddr="0x24000000" WorkRAMSize="0x80000"Core="JLINK_CORE_CORTEX_M7" />
        <FlashBankInfo Name="QSPI Flash" BaseAddr="0x90000000" MaxSize="0x01000000" Loader="Devices/ST/STM32H743_H7-TOOLS.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" />
    </Device>


将上面的 xml 片段加入到  JLinkDevices.xml  中,让 JLink 可以找到烧写算法。然后打开 J-Flash , 新建工程, 找到 STM32H743XI_H7-TOOLS

JFlash-FLM.png

至此, 烧写算法就成功的添加到了 JLink , 可以在 JFlashGDBServer 中成功识别。
类似的,JLink 的使用是跨平台的,经测试,此烧写算法可以在 MACOS (14.2)Linux(Ubuntu16.04、Deepin(15.11))、上使用。


KEIL

在 github 上的代码中,修改
  1. #define INTERNAL_FALSH ((uint32_t)0x08000000)
  2. #define QSPI_FLASH                ((uint32_t)0x90000000)

  3. /*
  4. *********************************************************************************************************
  5. *        函 数 名: main
  6. *        功能说明: c程序入口
  7. *        形    参:无
  8. *        返 回 值: 错误代码(无需处理)
  9. *********************************************************************************************************
  10. */
  11. int main(void)
  12. {        
  13.    if( (uint32_t )&main >= QSPI_FLASH) {
  14.        SCB->VTOR = QSPI_FLASH;
  15.    } else {
  16.        SCB->VTOR = INTERNAL_FALSH;
  17.    }
复制代码
  1. //        bsp_InitQSPI_W25Q256();        /* 初始化QSPI */
复制代码

需要注意的是,当前的方式不能操作 W25Q256 , 需要将其操作 W25Q256 的函数加载到 RAM 中,使其在 RAM 操作W25Q256,这一操作应该是可行的,将在后续支持。

修改 Flash->Configure Flash Tools ->Target ,将 IROM1 设置为:

Start: 0x90000000
Size:  0x200000


修改sct文件:
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************

  4. LR_IROM1 0x90000000 0x001E0000  {    ; load region size_region
  5.   ER_IROM1 0x90000000 0x001E0000  {  ; load address = execution address
  6.    *.o (RESET, +First)
  7.    *(InRoot$Sections)
  8.    .ANY (+RO)
  9.   }

  10.   RW_IRAM2 0x24000000 0x00080000  {  ; RW data
  11.    .ANY (+RW +ZI)
  12.   }
  13.   
  14.   RW_DMARxDscrTab 0x30040000 0x60 {
  15.   *(.RxDecripSection)
  16.   }
  17.   RW_DMATxDscrTab 0x30040060 0x140 {
  18.   *(.TxDecripSection)
  19.   }
  20.   RW_Rx_Buffb 0x30040200 0x1800 {
  21.   *(.RxArraySection)
  22.   }
  23.   
  24. ;  RW_IRAM1 0x20000000 0x00020000  {  ; RW data - 128KB DTCM
  25. ;   .ANY (+RW +ZI)
  26. ;  }
  27. ;  
  28. ;  RW_IRAM2 0x24000000 0x00080000  {  ; RW data - 512KB AXI SRAM
  29. ;   *(.RAM_D1)
  30. ;  }
  31. ;  
  32. ;  RW_IRAM3 0x30000000 0x00048000  {  ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)
  33. ;   *(.RAM_D2)
  34. ;  }
  35. ;  
  36. ;  RW_IRAM4 0x38000000 0x00010000  {  ; RW data - 64KB SRAM4(0x38000000)
  37. ;   *(.RAM_D3)
  38. ;  }
  39. }
复制代码

修改 JLink 设置

Keil_Jlink_Setting.png

烧录bootloader,附件中提供了一个bootloader,请将其烧录到 0x08000000。

至此,就可以在 Keil中,对QSPI中的程序在线调试了。下图为调试效果。

调试效果.png


SES

SES 请自行下载,首先导入一个完整的工程,然后进行如下设置:

ses_debugger.png
ses_linker.png

完成上述的设置后,进入debug。

ses_debug.png

eclipse


在 eclipse 上调试,需要安装 SEGGER 的插件,如下图所示:
eclipse_segger.png

这部分请自行搜索安装解决。也可以使用打包好的 eclipse 环境,下载地址在文章末尾给出。

具体设置如下图所示:



eclipse_segger_debug.png

eclipse_segger_startup.png

调试效果:
eclipse_debug.png

ld文件:

  1. /*
  2. *****************************************************************************
  3. **

  4. **  File        : LinkerScript.ld
  5. **
  6. **  Abstract    : Linker script for STM32H743XIHx Device with
  7. **                2048KByte FLASH, 128KByte RAM
  8. **
  9. **                Set heap size, stack size and stack location according
  10. **                to application requirements.
  11. **
  12. **                Set memory bank area and size if external memory is used.
  13. **
  14. **  Target      : STMicroelectronics STM32
  15. **
  16. **
  17. **  Distribution: The file is distributed as is, without any warranty
  18. **                of any kind.
  19. **
  20. **  (c)Copyright Ac6.
  21. **  You may use this file as-is or modify it according to the needs of your
  22. **  project. Distribution of this file (unmodified or modified) is not
  23. **  permitted. Ac6 permit registered System Workbench for MCU users the
  24. **  rights to distribute the assembled, compiled & linked contents of this
  25. **  file as part of an application binary file, provided that it is built
  26. **  using the System Workbench for MCU toolchain.
  27. **
  28. *****************************************************************************
  29. */

  30. /* Entry Point */
  31. ENTRY(Reset_Handler)

  32. /* Highest address of the user mode stack */
  33. _estack = 0x24080000;    /* end of RAM */
  34. /* Generate a link error if heap and stack don't fit into RAM */
  35. _Min_Heap_Size = 0x400;      /* required amount of heap  */
  36. _Min_Stack_Size = 0x800; /* required amount of stack */

  37. /* Specify the memory areas */
  38. MEMORY
  39. {
  40. DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
  41. RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
  42. RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K
  43. RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K
  44. ITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K
  45. FLASH (rx)      : ORIGIN = 0x90000000, LENGTH = 32M
  46. }

  47. /* Define output sections */
  48. SECTIONS
  49. {
  50.   /* The startup code goes first into FLASH */
  51.   .isr_vector :
  52.   {
  53.     . = ALIGN(4);
  54.     KEEP(*(.isr_vector)) /* Startup code */
  55.     . = ALIGN(4);
  56.   } >FLASH

  57.   /* The program code and other data goes into FLASH */
  58.   .text :
  59.   {
  60.     . = ALIGN(4);
  61.     *(.text)           /* .text sections (code) */
  62.     *(.text*)          /* .text* sections (code) */
  63.     *(.glue_7)         /* glue arm to thumb code */
  64.     *(.glue_7t)        /* glue thumb to arm code */
  65.     *(.eh_frame)

  66.     KEEP (*(.init))
  67.     KEEP (*(.fini))

  68.     . = ALIGN(4);
  69.     _etext = .;        /* define a global symbols at end of code */
  70.   } >FLASH

  71.   /* Constant data goes into FLASH */
  72.   .rodata :
  73.   {
  74.     . = ALIGN(4);
  75.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
  76.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
  77.     . = ALIGN(4);
  78.   } >FLASH

  79.   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
  80.   .ARM : {
  81.     __exidx_start = .;
  82.     *(.ARM.exidx*)
  83.     __exidx_end = .;
  84.   } >FLASH

  85.   .preinit_array     :
  86.   {
  87.     PROVIDE_HIDDEN (__preinit_array_start = .);
  88.     KEEP (*(.preinit_array*))
  89.     PROVIDE_HIDDEN (__preinit_array_end = .);
  90.   } >FLASH
  91.   
  92.   .init_array :
  93.   {
  94.     PROVIDE_HIDDEN (__init_array_start = .);
  95.     KEEP (*(SORT(.init_array.*)))
  96.     KEEP (*(.init_array*))
  97.     PROVIDE_HIDDEN (__init_array_end = .);
  98.   } >FLASH
  99.   
  100.   .fini_array :
  101.   {
  102.     PROVIDE_HIDDEN (__fini_array_start = .);
  103.     KEEP (*(SORT(.fini_array.*)))
  104.     KEEP (*(.fini_array*))
  105.     PROVIDE_HIDDEN (__fini_array_end = .);
  106.   } >FLASH

  107.   /* used by the startup to initialize data */
  108.   _sidata = LOADADDR(.data);

  109.   /* Initialized data sections goes into RAM, load LMA copy after code */
  110.   .data :
  111.   {
  112.     . = ALIGN(4);
  113.     _sdata = .;        /* create a global symbol at data start */
  114.     *(.data)           /* .data sections */
  115.     *(.data*)          /* .data* sections */

  116.     . = ALIGN(4);
  117.     _edata = .;        /* define a global symbol at data end */
  118.   } >RAM_D1 AT> FLASH

  119.   
  120.   /* Uninitialized data section */
  121.   . = ALIGN(4);
  122.   .bss :
  123.   {
  124.     /* This is used by the startup in order to initialize the .bss secion */
  125.     _sbss = .;         /* define a global symbol at bss start */
  126.     __bss_start__ = _sbss;
  127.     *(.bss)
  128.     *(.bss*)
  129.     *(COMMON)

  130.     . = ALIGN(4);
  131.     _ebss = .;         /* define a global symbol at bss end */
  132.     __bss_end__ = _ebss;
  133.   } >RAM_D1

  134.   /* User_heap_stack section, used to check that there is enough RAM left */
  135.   ._user_heap_stack :
  136.   {
  137.     . = ALIGN(8);
  138.     PROVIDE ( end = . );
  139.     PROVIDE ( _end = . );
  140.     . = . + _Min_Heap_Size;
  141.     . = . + _Min_Stack_Size;
  142.     . = ALIGN(8);
  143.   } >RAM_D1
  144.   
  145.   .lwip_sec (NOLOAD) : {
  146.     . = ABSOLUTE(0x30040000);
  147.     *(.RxDecripSection)
  148.    
  149.     . = ABSOLUTE(0x30040060);
  150.     *(.TxDecripSection)
  151.    
  152.     . = ABSOLUTE(0x30040200);
  153.     *(.RxArraySection)
  154.   } >RAM_D2 AT> FLASH

  155.   /* Remove information from the standard libraries */
  156.   /DISCARD/ :
  157.   {
  158.     libc.a ( * )
  159.     libm.a ( * )
  160.     libgcc.a ( * )
  161.   }

  162.   .ARM.attributes 0 : { *(.ARM.attributes) }
  163. }
复制代码


后续计划


  • 将官方的 STMH743XI 烧录算法加入到 TOOLS 的烧录算法中,使得可以使用一个烧录算法,不用切换
  • 调试时, 直接从 QSPI FLASH 启动, 不需要bootloader

eclipse一键环境(win7-win10)
eclipse一键环境(winxp)
同步站点
源码


H7-TOOLS从QSPI调试.7z

350.63 KB, 下载次数: 232

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2019-11-23 10:17:33 | 显示全部楼层
非常感谢楼主分享
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2019-11-23 10:26:25 | 显示全部楼层
eric2013 发表于 2019-11-23 10:17
非常感谢楼主分享

就是不知道 xml 怎么加到代码中,上面的 xml 乱码了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2019-11-23 10:28:37 | 显示全部楼层
zhaoqi 发表于 2019-11-23 10:26
就是不知道 xml 怎么加到代码中,上面的 xml 乱码了。

添加代码的那个插件,不支持颜色设置,不设置颜色就没有问题了。
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2019-11-23 10:38:25 | 显示全部楼层
eric2013 发表于 2019-11-23 10:28
添加代码的那个插件,不支持颜色设置,不设置颜色就没有问题了。

咋感觉还是不行呢, 我吧颜色相关的去掉了,然后就只有 device 了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2019-11-23 10:42:30 | 显示全部楼层
zhaoqi 发表于 2019-11-23 10:38
咋感觉还是不行呢, 我吧颜色相关的去掉了,然后就只有 device 了

不用代码控件,发出来,我来修改下。
回复

使用道具 举报

0

主题

84

回帖

84

积分

初级会员

积分
84
发表于 2019-12-12 15:18:07 | 显示全部楼层
学习。。。。。
回复

使用道具 举报

6

主题

32

回帖

50

积分

初级会员

积分
50
发表于 2019-12-12 19:15:10 | 显示全部楼层
什么时候 可以将H7 TOOL的 JLINK功能做好,,感觉这个才是现在最需要的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2019-12-13 09:36:25 | 显示全部楼层
lixin91985 发表于 2019-12-12 19:15
什么时候 可以将H7 TOOL的 JLINK功能做好,,感觉这个才是现在最需要的。

不是jlink,是daplink,群友已经做好了,还有顾上整理,后面会公布
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-12-15 21:13:01 | 显示全部楼层
调试时, 直接从 QSPI FLASH 启动, 不需要bootloader        我记得这个应该是很方便的,只需要写一个ini文件,将相关的配置寄存器操作搞上去就行了,网上有人做过lpc1788的sdram和并口norflash的仿真调试就是用这个方法
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2019-12-15 22:30:39 | 显示全部楼层
myxiaonia 发表于 2019-12-15 21:13
调试时, 直接从 QSPI FLASH 启动, 不需要bootloader        我记得这个应该是很方便的,只需要写一个ini文 ...

是这个样子的   等有时间弄
回复

使用道具 举报

1

主题

24

回帖

27

积分

新手上路

积分
27
发表于 2019-12-17 18:21:16 | 显示全部楼层
楼主,你的烧写算法工程能不能发上来参考一下
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-3-24 19:06:54 | 显示全部楼层
感谢老哥分享~
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 12:10 , Processed in 0.204072 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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