硬汉嵌入式论坛

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

[技术讨论] H7-TOOL SWD编程接口速度测试,讨论优化方案

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2019-8-23 00:21:03 | 显示全部楼层 |阅读模式
H7-TOOL 移植DAPLink代码实现SWD接口协议。
下面的测试代码,读写STM32F030的内存数据(2K字节)。
总耗时 5.2ms。 共传输4K字节。等效速度 = 787KB/s。  实测SWCLK时钟速度约 8.33MHz。
底层时序还有优化的余地。

SWD速度.png

上传下硬件接口电路:
H7-SWD硬件.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-8-23 00:51:54 | 显示全部楼层
还有优化的空间,有个1-2MB/S就可以
这个是SEGGER提供的参数,可供参考

QQ截图20190823005102.jpg
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2019-8-23 01:03:51 | 显示全部楼层
目前SWD协议实现都是软件GPIO模拟时序。STM32H750的GPIO最大翻转速度16.7M是个硬伤。不过软件GPIO翻转之间还有很多数据处理要做,H7的高主频会体现优势。

H7-TOOL SWD接口采用的GPIO带有硬件SPI功能。如果底层驱动改用硬件SPI提高时钟速度,则有可能提高效率。但是SPI的输入输出和主从切换有点耗时,配置繁琐。
时钟提高了后,烧写校验出错几率肯定会大一些。
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2019-8-23 10:36:17 | 显示全部楼层
STM32H7 的SPI硬件功能非常强大。有空研究研究,用于优化SWD协议实现速度。

SPI.png

对SWD数据传输速度影响最大函数如下:(单纯GPIO模拟实现)

回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-8-23 10:40:48 | 显示全部楼层
armfly 发表于 2019-8-23 10:36
STM32H7 的SPI硬件功能非常强大。有空研究研究,用于优化SWD协议实现速度。

ST官方这个H7中文手册翻译的有些不认真,这里的标识还是STM32F7XX SPI 特性。
QQ截图20190823104100.jpg
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2019-8-23 11:09:12 | 显示全部楼层
SWD代码.png
回复

使用道具 举报

1

主题

73

回帖

76

积分

初级会员

积分
76
发表于 2019-8-23 13:45:19 | 显示全部楼层

参考USBDM代码中SWD部分即可
回复

使用道具 举报

2

主题

76

回帖

82

积分

初级会员

积分
82
发表于 2019-8-23 16:05:36 | 显示全部楼层
neomissing 发表于 2019-8-23 13:45
参考USBDM代码中SWD部分即可

资料上传一下,这个USBDM的SWD有什么特色???
回复

使用道具 举报

9

主题

112

回帖

144

积分

初级会员

积分
144
发表于 2019-8-23 16:41:00 | 显示全部楼层
a20084666 发表于 2019-8-23 16:05
资料上传一下,这个USBDM的SWD有什么特色???

https://sourceforge.net/projects/usbdm/
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-8-23 17:18:04 | 显示全部楼层
yanchao7788 发表于 2019-8-23 16:41
https://sourceforge.net/projects/usbdm/

非常感谢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-8-23 17:26:47 | 显示全部楼层
USBDM下载器的SWD还真是SPI硬件实现的,给力

最有价值的两个软件包:
USBDM_API_Example.zip (722.19 KB, 下载次数: 149)
USBDM_Kinetis_Firmware.zip (314.11 KB, 下载次数: 14)

部分代码截图:
  1. /*! \file
  2.     \brief ARM-SWD routines

  3.    \verbatim

  4.    USBDM

  5.    Copyright (C) 2007  Peter O'Donoghue

  6.    This program is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2 of the License, or
  9.    (at your option) any later version.

  10.    This program is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.    GNU General Public License for more details.

  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software
  16.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.    \endverbatim

  18.    Change History
  19.    +==================================================================================================
  20.    | 10 Feb 2014 | Dramatically extended retry times to allow for slow clocks               V4.10.6.20
  21.    | 30 Aug 2012 | ARM-JTAG & ARM-SWD Changes                                               V4.9.5
  22.    +==================================================================================================
  23.    \endverbatim
  24. */

  25. #include "Common.h"
  26. #include "Configure.h"
  27. #include "Commands.h"
  28. #include "SWD.h"
  29. #include "Commands.h"
  30. #include "BDM.h"
  31. #include "CmdProcessing.h"
  32. #include "BDMCommon.h"
  33. #include "SPI.h"
  34. #include "TargetDefines.h"
  35. #include "SWD.h"

  36. //#define SLOWER_METHOD

  37. #if TARGET_CAPABILITY & CAP_ARM_SWD

  38. //! SPI CTAR value
  39. //#define SPI_CTAR_MASK  (SPI_CTAR_CPOL_MASK|SPI_CTAR_CPHA_MASK|SPI_CTAR_LSBFE_MASK|SPI_CTAR_PASC(1)|SPI_CTAR_ASC(0))
  40. #define SPI_CTAR_MASK  (SPI_CTAR_LSBFE_MASK|SPI_CTAR_PASC(1)|SPI_CTAR_ASC(0))

  41. // SPI_PUSHR_PCS for Tx operations
  42. #define SWD_PUSHR_TX  SPI_PUSHR_PCS((1<<0)|(1<<1)) // PCS0=SWDIO_O_En, PCS1=SWDCLK_En

  43. // SPI_PUSHR_PCS for Rx operations
  44. #define SWD_PUSHR_RX  SPI_PUSHR_PCS((1<<1))        // PCS1=SWDCLK_En

  45. #define SWD_READ_IDCODE 0xA5 // (Park,Stop,Parity,A[32],R/W,AP/DP,Start) = 10100101

  46. // Masks for SWD_WR_DP_ABORT clear sticky
  47. #define SWD_DP_ABORT_CLEAR_STICKY_ERRORS_B3 0x1E

  48. // Masks for SWD_WR_DP_ABORT abort AP
  49. #define SWD_DP_ABORT_ABORT_AP_B3 0x01

  50. // Masks for SWD_RD_DP_STATUS
  51. #define SWD_RD_DP_STATUS_ANYERROR_B3 0xB2

  52. //! Calculate parity
  53. //!
  54. //! @param data data to calculate parity for
  55. //!
  56. //! @return 0/1 indicating even/odd parity
  57. //!
  58. __forceinline
  59. static inline uint8_t calcParity(const uint8_t dataptr[]) {
  60.    uint32_t data = dataptr[0]^dataptr[1]^dataptr[2]^dataptr[3];
  61.    data = (data>>4)^data;
  62.    data = (data>>2)^data;
  63.    data = (data>>1)^data;
  64.    return data&1;
  65. }

  66. //! Sets the SWD interface to an idle state
  67. //! RESET=3-state, SWCLK=High, SWDIO=3-state
  68. //!
  69. void swd_interfaceIdle(void) {
  70. #ifdef RESET_3STATE
  71.    RESET_3STATE();
  72. #endif
  73. }

  74. //! Initialise the SWD interface and sets it to an idle state
  75. //! RESET=3-state, SWCLK=High, SWDIO=3-state, SPI initialised
  76. //!
  77. //! @note This includes once-off initialisation such as PUPs etc
  78. //!
  79. void swd_init(void) {
  80.    swd_interfaceIdle();
  81.    // 4 pins SWD_OUT, SWD_OUT_EN, SWCLK_OUT, SWCLK_OUT_EN
  82.    SWCLK_OUT_INIT();
  83.    SWD_OUT_INIT();
  84.    SWD_IN_INIT();
  85.    RESET_OUT_INIT();
  86. #ifdef RESET_IN_INIT
  87.    RESET_IN_INIT();
  88. #endif
  89. #ifdef SWCLK_ENABLE
  90.    SWCLK_ENABLE();
  91. #endif
  92. #ifdef SWD_3STATE
  93.    SWD_3STATE();
  94. #endif
  95.    spi_init(SPI_CTAR_MASK|SPI_CTAR_FMSZ(8-1),      // 8-bit transfer
  96.             SPI_CTAR_MASK|SPI_CTAR_FMSZ(4-1));     // 4-bit transfer
  97. }

  98. //!  Turns off the SWD interface
  99. //!
  100. //!  Depending upon settings, may leave target power on.
  101. //!
  102. void swd_off( void ) {
  103. #if ((HW_CAPABILITY & CAP_FLASH) != 0)
  104.    (void)bdmSetVpp(BDM_TARGET_VPP_OFF);
  105. #endif
  106.    if (!bdm_option.leaveTargetPowered) {
  107.       VDD_OFF();
  108.    }
  109.    swd_interfaceIdle();
  110. #ifdef SWCLK_3STATE
  111.    SWCLK_3STATE();
  112. #endif
  113. #ifdef SWD_3STATE
  114.    SWD_3STATE();
  115. #endif
  116.    SWCLK_OUT_FINI();
  117.    SWD_OUT_FINI();
  118.    SWD_IN_FINI();
  119.    RESET_OUT_FINI();
  120. #ifdef RESET_IN_FINI
  121.    RESET_IN_FINI();
  122. #endif
  123. }

  124. static const int ctas_8bit  = 0;
  125. static const int ctas_Xbit  = 1;

  126. //! Transmit a 8-bit word to the target
  127. //!
  128. //! @param send    - data to send
  129. //!
  130. //! @return BDM_RC_OK => success
  131. //!
  132. __forceinline
  133. static inline void spi_tx8(uint8_t data) {
  134.    SWD_ENABLE();
  135.    SPI0->PUSHR = SPI_PUSHR_CTAS(ctas_8bit)|SPI_PUSHR_EOQ_MASK|SWD_PUSHR_TX|SPI_PUSHR_TXDATA(data);
  136.    while ((SPI0->SR & SPI_SR_EOQF_MASK) == 0) {
  137.    }
  138.    (void)SPI0->POPR;              // Discard read data
  139.    SPI0->SR = SPI_SR_RFDF_MASK|SPI_SR_EOQF_MASK;
  140.    SWD_3STATE();
  141. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-8-23 17:29:52 | 显示全部楼层
再备份一个Github的地址:

https://github.com/podonoghue/usbdm-firmware
QQ截图20190823173107.jpg
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 14:39 , Processed in 0.206503 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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