sanjue 发表于 2018-9-16 05:04:24

贴一个基于STM32的乞丐原始版SWD离线下载器MDK工程

本帖最后由 sanjue 于 2018-9-16 16:41 编辑

        一只想做一个基于STM32的SWD离线下载器,奈何网上没有一个基于STM32的开源的(主要原因是自己菜)。
        坛子里面有许多人做出来的,我曾经发私信问过好几个坛友,希望能够咨询一下,不过没有一个人回复我...尴尬........
       看过基于STM32F103的daplink(就是那个支持拖拽下载的)的源代码,也看过cmsis daplink,程序太复杂了,初学者很难剥离出需要的代码来修改为离线下载器。
       自己之前也大致研究过这个,也只能是做到读取DP,AP,读取寄存器的程序,今天逛github,发现了一个驱动代码,于是我结合以前我写的代码,也移植了
一些别人的代码,勉强调通了SWD程序下载。
        程序是基于STM32c8t6小板做的,还没有做外界FLASH或EEPROM来存程序,只是将一个简单的程序转换为数组,存入单片机的中的。
        这个其实算不上离线下载器,但是改动一下,作为一个乞丐版的离线下载器还是可以的。
        只对STM32F103RCT6进行了测试,目标程序运行正常。

       
        最后贴上MDK工程
        同时希望有兴趣的坛友可以继续完善一下,如果您改进了这个程序,恰巧您高兴,可以贴出源代码到这个帖子,或许能够做成第一个开源的离线下载器。
如果没人后续改进,我自己也会慢慢抽时间改进。。这个过程可能很长。。
       
      (修改:添加了图片,改动文字)

        更新一些自己收集的SWD资料,我贴一个网盘地址吧,我网络好像有问题,上传不了大的文件
      链接:https://pan.baidu.com/s/1yZ3mPvbIUZMwV83TYl05kw 密码:3cqx
      
        (修改:增加了一些文档资料)

advarx21ic 发表于 2018-9-16 06:27:49

好帖,谢谢。

NM2012 发表于 2018-9-16 06:32:56

支持         

v_8787 发表于 2018-9-16 06:52:57

多谢了,记号下{:handshake:}

ztrx 发表于 2018-9-16 09:19:18

好贴   

ztg328 发表于 2018-9-16 09:24:19

楼主好强大

et009tw 发表于 2018-9-16 09:31:59

好資料,謝謝分享

KongQuan 发表于 2018-9-16 09:39:06

加一块小彩屏,加上u盘模拟,就是完整的脱机下载器了。

miaoguoqiang 发表于 2018-9-16 10:26:26

binary 替换成一块flash区域不就好了?再配合上位机,将文件的大小信息写入flash某个位置。然后读取就可以了。
没研究过msd怎样写入的。

maguorong 发表于 2018-9-16 11:07:04

多谢了,记号下

596142041 发表于 2018-9-16 12:31:51

多谢分享,我最开始的想法也是通过cmsis daplink里面的SWD接口部分拿出来自己来做离线下载器,一直没有做,楼主可以将现有的代码分享在GitHub上面吧

sanjue 发表于 2018-9-16 13:25:35

KongQuan 发表于 2018-9-16 09:39
加一块小彩屏,加上u盘模拟,就是完整的脱机下载器了。

屏幕和U盘模拟比较简单,许多开发版额的例程就有,移植过来就可以

sanjue 发表于 2018-9-16 13:28:19

miaoguoqiang 发表于 2018-9-16 10:26
binary 替换成一块flash区域不就好了?再配合上位机,将文件的大小信息写入flash某个位置。然后读取就可以 ...

其实这种下载方法比较慢的
最好是将文件信息写入再接的EEPROM,一般的成品是这么干的

sanjue 发表于 2018-9-16 13:29:27

596142041 发表于 2018-9-16 12:31
多谢分享,我最开始的想法也是通过cmsis daplink里面的SWD接口部分拿出来自己来做离线下载器,一直没有做,楼 ...

没github账号,也不怎么会用github,我注册一下试验一下

huangguimina4 发表于 2018-9-16 15:47:39

谢谢楼主,下载来研究一下

talkingbeast 发表于 2018-9-16 17:04:32

谢谢分享!

z350126876 发表于 2018-9-16 17:32:11

支持一下

shangdawei 发表于 2018-9-16 18:17:42

这里也有一个类似的

分享离线SWD编程器代码
https://www.amobbs.com/thread-5698975-1-1.html
(出处: amoBBS 阿莫电子论坛)

liuzq1981 发表于 2018-9-16 19:46:11

好贴,支持一下。

shower.xu 发表于 2018-9-16 20:01:48

记号谢谢分享

bigk2000 发表于 2018-9-16 21:43:01

SWD离线下载器

jzb8736 发表于 2018-9-16 21:49:46

线缆套磁环,骚年,你可以的

a105 发表于 2018-9-16 22:03:29

谢谢分享

sanjue 发表于 2018-9-16 22:04:34

jzb8736 发表于 2018-9-16 21:49
线缆套磁环,骚年,你可以的

JLINK使用的场合高频干扰及其大,所以套了一个,后面就没取下来

jzb8736 发表于 2018-9-16 22:05:48

sanjue 发表于 2018-9-16 22:04
JLINK使用的场合高频干扰及其大,所以套了一个,后面就没取下来

抑制共模干扰的神器

mypc16888 发表于 2018-9-16 22:09:38

感谢分享

mengtiantang 发表于 2018-9-16 22:18:22


谢谢分享

sanjue 发表于 2018-9-17 02:38:21

给RCT6下载程序,没有出过错,给C8T6下载程序,偶尔没法连接到AP,看了一下信号线毛刺太多,可能是飞线等的原因,空了画一张板子试一下了

sanjue 发表于 2018-9-17 02:43:41

本帖最后由 sanjue 于 2018-9-17 02:46 编辑

飞线用C8T6的小板搭了个实验板子,外接了一片32Mb的eeprom以及一块CH376demo板

1874 发表于 2018-9-17 10:23:45


好帖,一直也想做一个玩下,无奈自己太菜~

sanjue 发表于 2018-9-17 10:33:29

1874 发表于 2018-9-17 10:23
好帖,一直也想做一个玩下,无奈自己太菜~

我也菜,别的代码都太过于复杂,不适合新手移植玩玩,这个代码算是比较简单的了

ttyyuuio 发表于 2018-9-17 16:29:08

之前也研究过swd协议,时间有限也就搁浅了,总之感谢分享

sanjue 发表于 2018-9-17 16:54:10

ttyyuuio 发表于 2018-9-17 16:29
之前也研究过swd协议,时间有限也就搁浅了,总之感谢分享

我也是忙里抽闲,暂时我也是搁置了,后面有时间我还会继续做的

sanjue 发表于 2018-9-18 20:01:25

本帖最后由 sanjue 于 2018-9-19 12:24 编辑

拜读了坛友另外一篇帖子的程序https://www.amobbs.com/forum.php?mod=viewthread&tid=5698975&page=1&extra=#pid10400714
这个驱动代码来自于注明的开源项目,稳定度有保证,所以后续会在这个工程之上完善功能。
贴上我修改之后的github地址
https://github.com/jiaosanjue/swd_offlie_downloader
仅仅对DAP驱动的IO控制部分进行了重新移植,方便自由定义端口
删除了部分JTAG等相关的驱动代码,让程序看起来不那么臃肿,方便我这种新手阅读修改。
(修改:修改错别字)

rogerllg 发表于 2018-9-19 09:49:40

不错,给楼主点赞~

justdomyself 发表于 2018-9-19 12:21:36

好东西。。。。。

ywq 发表于 2018-9-21 09:17:51

小白问一下:离线的意思是程序拷到单片机,然后单片机去用swd去下载吗?不需要电脑

sanjue 发表于 2018-9-21 12:17:33

ywq 发表于 2018-9-21 09:17
小白问一下:离线的意思是程序拷到单片机,然后单片机去用swd去下载吗?不需要电脑 ...

对的,是这个意思,通过单片机实现SWD通信过程,然后用这个单片机给目标单片机刷程序
其实SWD还有其他好玩的功能,比如通过SWD控制单片机的AD,DA,IO等基本所有外设。

linjunxiong 发表于 2018-9-21 20:47:08

好东西,

bad_fpga 发表于 2018-9-22 00:35:20

sanjue 发表于 2018-9-21 12:17
对的,是这个意思,通过单片机实现SWD通信过程,然后用这个单片机给目标单片机刷程序
其实SWD还有其他好 ...

是不是这样,先用PC把要烧录的文件烧到离线下载器的外部FLASH里,然后通过离线下载器的SWD通信协议与目标板的SWD接口进行烧录

sanjue 发表于 2018-9-22 01:27:47

bad_fpga 发表于 2018-9-22 00:35
是不是这样,先用PC把要烧录的文件烧到离线下载器的外部FLASH里,然后通过离线下载器的SWD通信协议与目标 ...

是这么回事

fengyunyu 发表于 2018-9-22 15:54:22

高手,有前途!

sky_walker 发表于 2018-9-22 16:09:31

支持一下,如果是从学习的角度,能学不少东西

sanjue 发表于 2018-9-22 22:40:40

sky_walker 发表于 2018-9-22 16:09
支持一下,如果是从学习的角度,能学不少东西

这个做产品也没啥赚的,淘宝太多卖的了
我当初也只是想自己给生产做了一个生产工具,才萌发了自己做一个玩玩的想法
都是抽空做的,等哪天我做出来了,我会完全开源的
就是上位机我不会,只能重新慢慢学,可能会学习用python写一个吧

zxzx8059 发表于 2018-9-22 22:56:52

樓主您好,git上抓的代碼,F103C8T6燒F103VE 、 F072 成功{:handshake:}

不過F103C8T6燒NXP的KE04失敗,
設定 改addr=0x0 、flash page size=512,無法讀寫FLASH,
感覺應該有不少地方還沒改到{:sweat:}

sanjue 发表于 2018-9-23 01:09:07

zxzx8059 发表于 2018-9-22 22:56
樓主您好,git上抓的代碼,F103C8T6燒F103VE 、 F072 成功

不過F103C8T6燒NXP的KE04失敗,


你好,目前代码无法烧录NXP的
不同芯片的Flash控制寄存器的地址不一样,FLASH下载算法不一样,这个代码里只是简单的用STM32F1系列作为例子实现了简单的过程。
相信熟悉了整个过程,可以识别下载NXP系列的,也是比较容易的

linjunxiong 发表于 2018-9-23 08:58:32

早上试了下,只要找到对应的.FLM,支持SDW接口的,应该都可以烧录的,测试了下STM32F030C8 和 ?CF130C8 可以烧录

sanjue 发表于 2018-9-23 10:40:35

linjunxiong 发表于 2018-9-23 08:58
早上试了下,只要找到对应的.FLM,支持SDW接口的,应该都可以烧录的,测试了下STM32F030C8 和 ?CF130C8 可 ...

嗯是的,和MDK设置debug里面的芯片类型一个道理

linjunxiong 发表于 2018-9-23 16:01:13

sanjue 发表于 2018-9-23 10:40
嗯是的,和MDK设置debug里面的芯片类型一个道理

试了手上有4款M0,STM32F030 HC32L130 HR8P506,都可以烧录,但是NXP 的Lpc824 在target_flash_init就失败了。

sanjue 发表于 2018-9-23 16:10:15

linjunxiong 发表于 2018-9-23 16:01
试了手上有4款M0,STM32F030 HC32L130 HR8P506,都可以烧录,但是NXP 的Lpc824 在target_flash_init就失败 ...

我手上只有STM32的片子,NXP的没法验证测试。。。。。

linjunxiong 发表于 2018-9-23 16:37:06

sanjue 发表于 2018-9-23 16:10
我手上只有STM32的片子,NXP的没法验证测试。。。。。

git 上的 DAPLink项目里 \DAPLink-master\DAPLink-master\source\target有对应的flash_blob.c。感觉LPC824 用XIVN1987 的flash_algo.exe生成有差异。不能用的可以试试DAPLink 里面的flash_blob.c

happyliu 发表于 2018-9-28 09:48:58

脱机下载又有新进展 抽空研究下 做个下载器玩下

openm4 发表于 2018-9-28 14:48:07

感谢楼主分享,正在找这方面的资料。

xjtyOnly51 发表于 2018-9-29 08:01:37

thanks for share{:lol:}

agency 发表于 2018-9-29 08:59:37

感谢楼主分享, 可以搞一个脱机下载器玩玩

sanjue 发表于 2018-9-29 10:36:25

linjunxiong 发表于 2018-9-23 16:37
git 上的 DAPLink项目里 \DAPLink-master\DAPLink-master\source\target有对应的flash_blob.c。感觉L ...

你可以调试看一下能不能连接到AP,读取AP的ID
也有可能你说的NXP型号用的老版的SWD协议,老版的SWD协议
要发送0X6D,0XB7才可以切换到swd,而新版发送0X79,0XE7就
可以切换到SWD。

unnormal 发表于 2018-9-29 11:31:44

不错的资料   谢谢分享{:handshake:}

boyboromi 发表于 2018-10-3 15:41:15

不错的资料   谢谢分享。一直研究SWD头都大了。现在简单了

sandeant 发表于 2018-10-7 15:30:10

不错的资料   谢谢分享

qjp1988113 发表于 2018-10-9 14:32:10

楼主厉害,谢谢楼主分享~

toptrying 发表于 2018-10-9 14:44:28

楼主厉害

yujintian 发表于 2018-10-9 14:52:01

楼主厉害,有空自己跟着做一个{:lol:}{:lol:}

linbo411 发表于 2018-10-9 15:45:58

有人做成商业化了,很少有开源的,谢谢

ordinary 发表于 2018-10-12 22:57:03

感谢分享

shangxf 发表于 2018-10-13 13:48:39

楼主好强大

yufeistudio 发表于 2018-11-16 12:25:41

高机密还有马赛克666

wowangru 发表于 2018-11-16 13:39:37

记下了!!!!

hyper320 发表于 2018-11-19 15:39:20

好资料谢谢分享

chxzh123 发表于 2018-11-19 19:08:15

mark,离线swd下载

wowangru 发表于 2018-11-20 09:44:01

可以实现批发下载了!!!!!

sanjue 发表于 2018-11-21 13:55:36

wowangru 发表于 2018-11-20 09:44
可以实现批发下载了!!!!!

你很活跃啊,批发下载是啥意思?

sanjue 发表于 2018-11-21 13:56:26

yufeistudio 发表于 2018-11-16 12:25
高机密还有马赛克666

没啥机密的,板子丑,打马赛克掩饰一下

罗小蘑菇 发表于 2018-11-21 14:14:18

mark,离线swd下载

wy2000 发表于 2018-11-21 15:49:20

好东西,支持一下。   最近在搞nordic的51822 一定要swd烧录。 准备买一个离线烧录器

wolflsh 发表于 2018-12-14 00:02:39

可以啊,学习了,最近刚好有需要。

1328616904 发表于 2019-5-20 14:27:57

感谢楼主分享,git了一份代码,用板子试了一下发现这一条返回的是有问题的   if(swd_read_dp(0, (uint32_t *)tmp_out) != 0x01)
      {
            return 0;
      },请问大佬这样的问题可能是啥原因造成的

tarchen 发表于 2019-5-20 16:55:09

好帖,谢谢。

sanjue 发表于 2019-5-22 12:17:41

1328616904 发表于 2019-5-20 14:27
感谢楼主分享,git了一份代码,用板子试了一下发现这一条返回的是有问题的   if(swd_read_dp(0, (uint32_t...

没有读到DP,这个是SWD通信中总线复位之后进行的第一步,如果DP
寄存器都没读取到,建议先找找硬件问题

sanger 发表于 2019-5-22 16:34:56

冲你这不服输的精神支持一下

1328616904 发表于 2019-5-22 17:49:40

sanjue 发表于 2019-5-22 12:17
没有读到DP,这个是SWD通信中总线复位之后进行的第一步,如果DP
寄存器都没读取到,建议先找找硬件问题 ...

好的我换个核心板再试试

tangpeng 发表于 2019-5-23 13:44:13

留下有时间也玩玩

tjx0512 发表于 2019-9-6 20:50:27

感谢大神无私分享!

贰梓 发表于 2019-9-6 21:22:07

感谢分享,学习一下有机会自己做个玩玩

tjx0512 发表于 2019-9-11 22:32:57

我已经成功加入ymodem协议更新程序文件,可实现一个简单的离线下载器了,ymodem源码参考这里(还有上位机源码)https://github.com/cpperrr/c-sharp

sanjue 发表于 2019-9-12 10:45:53

本帖最后由 sanjue 于 2019-9-12 10:47 编辑

tjx0512 发表于 2019-9-11 22:32
我已经成功加入ymodem协议更新程序文件,可实现一个简单的离线下载器了,ymodem源码参考这里(还有上位机源 ...

{:tongue:} ,赞一下,紫薯布丁

tjx0512 发表于 2019-9-19 19:37:54

本帖最后由 tjx0512 于 2019-9-19 19:39 编辑


用NV32F100+CH340N做的离线下载器可烧录100K内的程序。特感谢楼主的开源!



sanjue 发表于 2019-9-20 00:29:30

tjx0512 发表于 2019-9-19 19:37
用NV32F100+CH340N做的离线下载器可烧录100K内的程序。特感谢楼主的开源!




如果你愿意,来源出来,帮助更多的人

ycwjl728 发表于 2019-9-20 06:48:41

Mark!学习一下

霸气侧漏 发表于 2019-9-20 07:43:54

tjx0512 发表于 2019-9-19 19:37
用NV32F100+CH340N做的离线下载器可烧录100K内的程序。特感谢楼主的开源!




如果你愿意,来源出来,帮助更多的人

tjx0512 发表于 2019-9-20 09:22:54

sanjue 发表于 2019-9-20 00:29
如果你愿意,来源出来,帮助更多的人

有时间整理下可开源,其实也就是在你的基础上加了ymodem协议。

霸气侧漏 发表于 2019-11-27 00:14:59

tjx0512 发表于 2019-9-20 09:22
有时间整理下可开源,其实也就是在你的基础上加了ymodem协议。

说好的帮助更多人

tjx0512 发表于 2019-12-13 16:26:22

我好像上传不了附件,怎么办!

sanjue 发表于 2019-12-20 23:14:51

tjx0512 发表于 2019-12-13 16:26
我好像上传不了附件,怎么办!

Github分享,也可以贴网盘地址的

tarchen 发表于 2020-2-17 10:47:55

好帖,谢谢分享。

xuwuhan 发表于 2020-2-17 10:52:13

感谢分享。

TigerRay 发表于 2020-2-24 16:57:37

不错,好的分享!

鱼尾之恋 发表于 2020-5-8 22:39:50

这部分的资料不错,谢谢分享。

BS_good200xy 发表于 2020-5-9 07:48:13

多谢分享!

oooios 发表于 2020-7-13 22:09:42

本帖最后由 oooios 于 2020-7-13 22:15 编辑

sanjue 发表于 2018-9-18 20:01
拜读了坛友另外一篇帖子的程序https://www.amobbs.com/forum.php?mod=viewthread&tid=5698975&page=1&extra ...

请问下如何测试?第一次接触swd,还请多多指教。
代码里面
extern uint8_t STM32F1_demo_code;   //demo1
extern u8 binary;                  //demo2
是否需要准备两个stm板子,A,B;其中A使用j-link,刷入离线编程器固件,
然后通过A,引出4芯接口给B写入demo2。
谢谢
demo1,2运行有啥信息可以方便查看?

sanjue 发表于 2020-7-14 11:48:26

oooios 发表于 2020-7-13 22:09
请问下如何测试?第一次接触swd,还请多多指教。
代码里面
extern uint8_t STM32F1_demo_code;   / ...

extern uint8_t STM32F1_demo_code;   //demo1
extern u8 binary;                  //demo2
这两个是测试文件,其实是离线下载区下载到目标单片机的程序,是由BIN或者HEX文件转成数组的,有网友写过类似的小程序,自己也可以用python写
测试中需要两块板子,一个jlink
jlink连接A板子(离线下载器),A板子引出自己定义的SWD信号线到B板子的SWD口
至于demo1或者demo2有啥信息可以看,这个比较简单,你可以在B板子上写一个流水灯的的程序(或其他显示啊,声音),编译后获得BIN文件,BIN文件转成数组,替换demo数组就可以
实际中的离线下载器将是将BIN文件存储到外部EEPROM或者SD卡中的,这个乞丐版是为了简单,将这个demo固化到FLASH里面
实际中离线下载器有一个上位机,上位机会将bin文件或者hex文件以二进制的形式读取,并传输到单片机中,单片机接收之后存储到内部flash或者外部eeprom或者SD卡中,当然这个过程可能会加密
页: [1] 2
查看完整版本: 贴一个基于STM32的乞丐原始版SWD离线下载器MDK工程