贴一个基于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
(修改:增加了一些文档资料) 好帖,谢谢。 支持 多谢了,记号下{:handshake:} 好贴 楼主好强大 好資料,謝謝分享 加一块小彩屏,加上u盘模拟,就是完整的脱机下载器了。 binary 替换成一块flash区域不就好了?再配合上位机,将文件的大小信息写入flash某个位置。然后读取就可以了。
没研究过msd怎样写入的。 多谢了,记号下 多谢分享,我最开始的想法也是通过cmsis daplink里面的SWD接口部分拿出来自己来做离线下载器,一直没有做,楼主可以将现有的代码分享在GitHub上面吧 KongQuan 发表于 2018-9-16 09:39
加一块小彩屏,加上u盘模拟,就是完整的脱机下载器了。
屏幕和U盘模拟比较简单,许多开发版额的例程就有,移植过来就可以 miaoguoqiang 发表于 2018-9-16 10:26
binary 替换成一块flash区域不就好了?再配合上位机,将文件的大小信息写入flash某个位置。然后读取就可以 ...
其实这种下载方法比较慢的
最好是将文件信息写入再接的EEPROM,一般的成品是这么干的 596142041 发表于 2018-9-16 12:31
多谢分享,我最开始的想法也是通过cmsis daplink里面的SWD接口部分拿出来自己来做离线下载器,一直没有做,楼 ...
没github账号,也不怎么会用github,我注册一下试验一下 谢谢楼主,下载来研究一下 谢谢分享! 支持一下 这里也有一个类似的
分享离线SWD编程器代码
https://www.amobbs.com/thread-5698975-1-1.html
(出处: amoBBS 阿莫电子论坛)
好贴,支持一下。
记号谢谢分享 SWD离线下载器 线缆套磁环,骚年,你可以的 谢谢分享 jzb8736 发表于 2018-9-16 21:49
线缆套磁环,骚年,你可以的
JLINK使用的场合高频干扰及其大,所以套了一个,后面就没取下来 sanjue 发表于 2018-9-16 22:04
JLINK使用的场合高频干扰及其大,所以套了一个,后面就没取下来
抑制共模干扰的神器 感谢分享
谢谢分享 给RCT6下载程序,没有出过错,给C8T6下载程序,偶尔没法连接到AP,看了一下信号线毛刺太多,可能是飞线等的原因,空了画一张板子试一下了 本帖最后由 sanjue 于 2018-9-17 02:46 编辑
飞线用C8T6的小板搭了个实验板子,外接了一片32Mb的eeprom以及一块CH376demo板
好帖,一直也想做一个玩下,无奈自己太菜~ 1874 发表于 2018-9-17 10:23
好帖,一直也想做一个玩下,无奈自己太菜~
我也菜,别的代码都太过于复杂,不适合新手移植玩玩,这个代码算是比较简单的了 之前也研究过swd协议,时间有限也就搁浅了,总之感谢分享 ttyyuuio 发表于 2018-9-17 16:29
之前也研究过swd协议,时间有限也就搁浅了,总之感谢分享
我也是忙里抽闲,暂时我也是搁置了,后面有时间我还会继续做的 本帖最后由 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等相关的驱动代码,让程序看起来不那么臃肿,方便我这种新手阅读修改。
(修改:修改错别字) 不错,给楼主点赞~ 好东西。。。。。 小白问一下:离线的意思是程序拷到单片机,然后单片机去用swd去下载吗?不需要电脑 ywq 发表于 2018-9-21 09:17
小白问一下:离线的意思是程序拷到单片机,然后单片机去用swd去下载吗?不需要电脑 ...
对的,是这个意思,通过单片机实现SWD通信过程,然后用这个单片机给目标单片机刷程序
其实SWD还有其他好玩的功能,比如通过SWD控制单片机的AD,DA,IO等基本所有外设。 好东西, sanjue 发表于 2018-9-21 12:17
对的,是这个意思,通过单片机实现SWD通信过程,然后用这个单片机给目标单片机刷程序
其实SWD还有其他好 ...
是不是这样,先用PC把要烧录的文件烧到离线下载器的外部FLASH里,然后通过离线下载器的SWD通信协议与目标板的SWD接口进行烧录 bad_fpga 发表于 2018-9-22 00:35
是不是这样,先用PC把要烧录的文件烧到离线下载器的外部FLASH里,然后通过离线下载器的SWD通信协议与目标 ...
是这么回事 高手,有前途! 支持一下,如果是从学习的角度,能学不少东西 sky_walker 发表于 2018-9-22 16:09
支持一下,如果是从学习的角度,能学不少东西
这个做产品也没啥赚的,淘宝太多卖的了
我当初也只是想自己给生产做了一个生产工具,才萌发了自己做一个玩玩的想法
都是抽空做的,等哪天我做出来了,我会完全开源的
就是上位机我不会,只能重新慢慢学,可能会学习用python写一个吧 樓主您好,git上抓的代碼,F103C8T6燒F103VE 、 F072 成功{:handshake:}
不過F103C8T6燒NXP的KE04失敗,
設定 改addr=0x0 、flash page size=512,無法讀寫FLASH,
感覺應該有不少地方還沒改到{:sweat:} zxzx8059 发表于 2018-9-22 22:56
樓主您好,git上抓的代碼,F103C8T6燒F103VE 、 F072 成功
不過F103C8T6燒NXP的KE04失敗,
你好,目前代码无法烧录NXP的
不同芯片的Flash控制寄存器的地址不一样,FLASH下载算法不一样,这个代码里只是简单的用STM32F1系列作为例子实现了简单的过程。
相信熟悉了整个过程,可以识别下载NXP系列的,也是比较容易的
早上试了下,只要找到对应的.FLM,支持SDW接口的,应该都可以烧录的,测试了下STM32F030C8 和 ?CF130C8 可以烧录 linjunxiong 发表于 2018-9-23 08:58
早上试了下,只要找到对应的.FLM,支持SDW接口的,应该都可以烧录的,测试了下STM32F030C8 和 ?CF130C8 可 ...
嗯是的,和MDK设置debug里面的芯片类型一个道理 sanjue 发表于 2018-9-23 10:40
嗯是的,和MDK设置debug里面的芯片类型一个道理
试了手上有4款M0,STM32F030 HC32L130 HR8P506,都可以烧录,但是NXP 的Lpc824 在target_flash_init就失败了。 linjunxiong 发表于 2018-9-23 16:01
试了手上有4款M0,STM32F030 HC32L130 HR8P506,都可以烧录,但是NXP 的Lpc824 在target_flash_init就失败 ...
我手上只有STM32的片子,NXP的没法验证测试。。。。。 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 脱机下载又有新进展 抽空研究下 做个下载器玩下
感谢楼主分享,正在找这方面的资料。 thanks for share{:lol:} 感谢楼主分享, 可以搞一个脱机下载器玩玩 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。
不错的资料 谢谢分享{:handshake:} 不错的资料 谢谢分享。一直研究SWD头都大了。现在简单了 不错的资料 谢谢分享 楼主厉害,谢谢楼主分享~ 楼主厉害 楼主厉害,有空自己跟着做一个{:lol:}{:lol:} 有人做成商业化了,很少有开源的,谢谢 感谢分享 楼主好强大 高机密还有马赛克666 记下了!!!! 好资料谢谢分享 mark,离线swd下载 可以实现批发下载了!!!!! wowangru 发表于 2018-11-20 09:44
可以实现批发下载了!!!!!
你很活跃啊,批发下载是啥意思? yufeistudio 发表于 2018-11-16 12:25
高机密还有马赛克666
没啥机密的,板子丑,打马赛克掩饰一下 mark,离线swd下载 好东西,支持一下。 最近在搞nordic的51822 一定要swd烧录。 准备买一个离线烧录器 可以啊,学习了,最近刚好有需要。 感谢楼主分享,git了一份代码,用板子试了一下发现这一条返回的是有问题的 if(swd_read_dp(0, (uint32_t *)tmp_out) != 0x01)
{
return 0;
},请问大佬这样的问题可能是啥原因造成的 好帖,谢谢。 1328616904 发表于 2019-5-20 14:27
感谢楼主分享,git了一份代码,用板子试了一下发现这一条返回的是有问题的 if(swd_read_dp(0, (uint32_t...
没有读到DP,这个是SWD通信中总线复位之后进行的第一步,如果DP
寄存器都没读取到,建议先找找硬件问题 冲你这不服输的精神支持一下 sanjue 发表于 2019-5-22 12:17
没有读到DP,这个是SWD通信中总线复位之后进行的第一步,如果DP
寄存器都没读取到,建议先找找硬件问题 ...
好的我换个核心板再试试 留下有时间也玩玩 感谢大神无私分享! 感谢分享,学习一下有机会自己做个玩玩 我已经成功加入ymodem协议更新程序文件,可实现一个简单的离线下载器了,ymodem源码参考这里(还有上位机源码)https://github.com/cpperrr/c-sharp 本帖最后由 sanjue 于 2019-9-12 10:47 编辑
tjx0512 发表于 2019-9-11 22:32
我已经成功加入ymodem协议更新程序文件,可实现一个简单的离线下载器了,ymodem源码参考这里(还有上位机源 ...
{:tongue:} ,赞一下,紫薯布丁 本帖最后由 tjx0512 于 2019-9-19 19:39 编辑
用NV32F100+CH340N做的离线下载器可烧录100K内的程序。特感谢楼主的开源!
tjx0512 发表于 2019-9-19 19:37
用NV32F100+CH340N做的离线下载器可烧录100K内的程序。特感谢楼主的开源!
如果你愿意,来源出来,帮助更多的人 Mark!学习一下 tjx0512 发表于 2019-9-19 19:37
用NV32F100+CH340N做的离线下载器可烧录100K内的程序。特感谢楼主的开源!
如果你愿意,来源出来,帮助更多的人 sanjue 发表于 2019-9-20 00:29
如果你愿意,来源出来,帮助更多的人
有时间整理下可开源,其实也就是在你的基础上加了ymodem协议。 tjx0512 发表于 2019-9-20 09:22
有时间整理下可开源,其实也就是在你的基础上加了ymodem协议。
说好的帮助更多人 我好像上传不了附件,怎么办! tjx0512 发表于 2019-12-13 16:26
我好像上传不了附件,怎么办!
Github分享,也可以贴网盘地址的 好帖,谢谢分享。 感谢分享。 不错,好的分享! 这部分的资料不错,谢谢分享。 多谢分享! 本帖最后由 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运行有啥信息可以方便查看? 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