分享离线SWD编程器代码
本帖最后由 XIVN1987 于 2018-9-16 16:12 编辑SWD离线编程器,其实很简单,,
因为关键代码国外的大侠都已经给实现了,,我们只需要简单拼接一下就OK啦{:lol:}
下面我就说下怎样通过拼接代码实现离线编程器:
1、首先,既然是SWD编程器,那首先当然是要实现SWD时序协议了
由于单片机都没有SWD外设,所以只能用GPIO模拟实现SWD时序,,这部分功能已经由ARM公司的CMSIS-DAP代码实现
2、然后就是基于CMSIS-DAP,实现通过DAP读写目标芯片的内存、内核寄存器,,这部分功能已经由DAPLink里面的swd_host.c文件实现
同时,swd_host.c还实现了另一个对实现编程器至关重要的函数:
uint8_t swd_flash_syscall_exec(const program_syscall_t *sysCallParam, uint32_t entry, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4)
它的作用是通过DAP在目标芯片上执行
那么,我们只要把编程算法(一段在目标芯片上执行的代码,里面有Flash_Erase、Flash_Write两个函数)通过SWD写入目标芯片的SRAM,然后再通过SWD调用目标芯片SRAM里面的Flash_Erase、Flash_Write两个函数,不就能实现通过SWD给目标芯片编程了吗??
所以,程序的主体结构就是:
其中target_flash_init()的主要作用就是把芯片的编程算法下载到目标芯片的SRAM中去
好了,SWD编程器已经实现{:lol:}
不过还有一个问题:要下载到目标芯片SRAM中去的编程算法从哪里来??
我们知道,Keil针对每一颗芯片都有一个Flash编程算法,这个算法存在一个后缀为.FLM的文件里面,,要是我们能把.FLM文件里面的算法内容抽取出来给我们用,,那不就完美了吗
3、其实这个功能也已经有国外大神给实现了,GitHub上的FlashAlgo项目里面有个flash_algo.py文件,它就是用来实现这个功能的
工程示例代码:
另外,这个工程我也已经上传到github上了,,希望坛友能顺便去给加个星,,谢谢啦{:biggrin:}
https://github.com/XIVN1987/DAPProg
boboo 发表于 2018-9-17 00:37
Traceback (most recent call last):
File "C:%users\FreeRTOS\Desktop\FlashAlgo\flash_algo.py", line...
我把flash_algo.py给打包成.exe文件了,,把*.FLM文件放到flash_algo.exe文件目录下,,,然后双击执行flash_algo.exe就能生成*.FLM对应的*.c文件
本帖最后由 XIVN1987 于 2018-9-23 15:25 编辑
Keil_v5\ARM\Flash\_Template目录下有个烧录算法模板,,其中部分函数如下:
对比SWD_flash.c的代码发现一些问题:
1、Keil算法中的函数都是正确返回0、错误返回1,而SWD_flash.c认为函数返回0表示出错
2、Keil算法中Init函数的第三个参数说明,Init函数应该是在Erase、Program、Verify之前各分别执行一次,,而SWD_flash.c的实现只在最开始(也就是Erase之前)调用一次Init
所以,很可能SWD_flash.c不是针对Keil的编程算法写的,,DAPLink项目可能实现了自己的编程算法接口,,而我上面那个STM32的Demo之所以能执行成功,可能是因为:
1、所有函数都没检查返回值,
2、可能在STM32的编程算法中Init函数对Erase、Program、Verify这三个操作执行的内容是一样的,,所以执行一遍Init就行了
不过用在另一些芯片上可能就不行了
所以,我对SWD_flash.c做了一些修正,,不过由于没有板子,暂时没法测试,,感兴趣的坛友可用试一下
============================================================
另外如果想实现在线编程器的话,其实GitHub上也有现成的代码可用参考:https://github.com/mbedmicro/pyOCD
在这个项目下有个叫flash.py的文件,其中部分函数如下:
是不是看起来和SWD_flash.c中的函数非常像啊 ,,有了这个文件,实现在线编程器就So Easy了!!{:smile:}
不过也有两个小问题:
1、这个项目是基于CMSIS-DAP(DAPLink)的,如果想用JLink做在线下载的话,需要把底层部分换成jlink.py
2、这是个命令行的项目,想要做个带图形界面的在线下载器的话,需要自己添加GUI功能
继续填坑{:titter:}
下面两段内容分别来自flash_algo.py和c_blob.tmpl
整个编程烧写过程占用了目标芯片4K SRAM,其中SRAM起始地址为0x20000000,栈顶指向4K SRAM的末尾,,编程算法占用4K SRAM的前1K,,待烧写数据占用4K SRAM的中间2K,,静态变量和栈共用4K SRAM的最后1K
这种设计对绝大多数Cortex-M芯片是没有问题的,,不过有几种情况可能需要调整红线框住的部分:
1、SRAM的起始地址不是0x20000000,这种调整最简单,把entry的值调整成正确值就可用了
2、单片机的SRAM小于4K,这种就比较麻烦,得根据实际情况重新规划SRAM的分配,,然后红线框住的部分可能都要改动
3、编程算法内容大于1K,,有些使用片外SPI Flash的芯片它的编程算法会非常大,1K SRAM装不下,,这种把后面几个部分的地址都往后延就行了
所以,对于有些比较特殊的芯片,,需要先修改一下flash_algo.py和c_blob.tmpl,然后再生成算法文件对应的.c文件,,不过还好,生成是一次行的,,
工程的事例是使用什么硬件? belongfs 发表于 2018-9-16 16:21
工程的事例是使用什么硬件?
随便一个STM32F103C8的demo板就行,,模拟SWD用的B13、B14两个引脚
不错
曾经自己写过SWD协议实现,可以通过寄存器编程 这里也有一个类似的
贴一个基于STM32的乞丐原始版SWD离线下载器MDK工程
https://www.amobbs.com/thread-5698953-1-1.html
(出处: amoBBS 阿莫电子论坛)
感谢楼主分享 哈哈哈好像都是这么干的哦keil的闪存编程算法就是这么个东西 感谢分享 关注中 顶楼主!希望以后会用上廉价的脱机烧写器 楼主厉害,哈哈,我下载了 myxiaonia 发表于 2018-9-16 19:43
哈哈哈好像都是这么干的哦keil的闪存编程算法就是这么个东西
是啊,只有能利用Keil(或IAR)的编程算法,制作编程器(不管是离线的还是在线的)才有意义,不然每个芯片都自己实现一遍编程算法,累都累死啦{:lol:} 必须顶!!! 感谢楼主分享!
必须顶!!! 感谢楼主分享! 必须顶!!! 感谢楼主分享!+ 收藏了。
感谢分享 mark,有空的时候研究一下,感谢楼主分享! 感谢分享 感谢分享 Traceback (most recent call last):
File "C:\Users\FreeRTOS\Desktop\FlashAlgo\flash_algo.py", line 13, in <module>
import jinja2
ImportError: No module named jinja2
这个怎么用的? 我更改了一下端口,修改打印口到串口1,在我测试的C8T6小板上没有试验成功。
修改硬件接线,程序没修改,还是没成功。空了再研究一下 感谢楼主分享,git已加星 boboo 发表于 2018-9-17 00:37
Traceback (most recent call last):
File "C:%users\FreeRTOS\Desktop\FlashAlgo\flash_algo.py", line...
pip安装这个库 lz可以看看 adafruit用raspberry pi配合openocd直接用gpio烧录的教程。也算是离线烧录的一种方法。 感謝樓主分享 sanjue 发表于 2018-9-17 02:35
我更改了一下端口,修改打印口到串口1,在我测试的C8T6小板上没有试验成功。
修改硬件接线,程序没修改,还 ...
光修改PIN_SWCLK、PIN_SWDIO的宏定义是不够的,,下面还有些代码需要修改,,
封装性不太好,, ttyyuuio 发表于 2018-9-17 08:38
感谢楼主分享,git已加星
感谢加星{:handshake:}
还第一次长星这么快,,感动{:cry:}
感谢分享 这个要点赞.... 谢谢分享先收藏了有空看看 这个不错,感谢分享 flash_algo.py 还能这么玩,编译完的东西还能提取出来,厉害厉害,又学到一招
如果能直接加载FLM就更厉害了 感谢分享,有空研究研究 XIVN1987 发表于 2018-9-17 09:08
感谢加星
还第一次长星这么快,,感动
说明这个有需求,哈哈,许多人都想做这个,奈何大牛都憋着不动。
另外,你的程序我测试可以了,就是下载程序之后,还无法软件复位运行,我尝试修改一下 target_flash_erase_sector(0x08000000+addr);
這應該是stm32的起始位置吧,其它家的不一定一樣
大俠的項目已給星 good mark了 厉害厉害 SWD方便。 35楼的大哥,下载完程序不运行的问题有解决么? 等待楼主出一个离线烧录器 zkaifa 发表于 2018-9-17 15:38
35楼的大哥,下载完程序不运行的问题有解决么?
嗯,解决了,源代码的软件复位函数有点问题 必须顶!!! 感谢楼主分享! 感谢楼主分享 Mark 脱机烧写器实现方法。 本帖最后由 zhuisuoji 于 2018-9-18 01:53 编辑
关注一下
另已在github上加了个星 谢谢楼主分享 sanjue 发表于 2018-9-17 16:28
嗯,解决了,源代码的软件复位函数有点问题
可以分享下如何解决的么? sanjue 发表于 2018-9-17 16:28
嗯,解决了,源代码的软件复位函数有点问题
可以分享下如何解决的么? 谢谢楼主分享~ zkaifa 发表于 2018-9-18 08:59
可以分享下如何解决的么?
不错,以后做定制烧录器治具可以用得上,谢谢了{:handshake:} sanjue 发表于 2018-9-18 12:47
感谢反馈,,我晚上更新到github上去{:handshake:} 这个不错。已加星{:biggrin:} 脱机烧录器的福音。感谢楼主 谢谢分享!!! XIVN1987 发表于 2018-9-18 13:19
感谢反馈,,我晚上更新到github上去
我自己修改了你的代码,重新移植了IO驱动部分,方便定义IO,删除了JTAG部分的一些定义
将代码上传到github了
https://github.com/jiaosanjue/swd_offlie_downloader sanjue 发表于 2018-9-18 19:54
我自己修改了你的代码,重新移植了IO驱动部分,方便定义IO,删除了JTAG部分的一些定义
将代码上传到github ...
赞!!GitHub上好资源很多{:biggrin:}
历害了,持续关注。谢谢分享。 必须顶!!! 感谢楼主分享! 给你点赞~ mark~ 能否支持同时给8个板编程 感谢分享,正好需要用到 sanjue 发表于 2018-9-18 12:47
多谢~~~~~~
过节了还在更新,顶楼主一下。 这个有用 感谢分享,最近刚好研究离线烧写的资料 XIVN1987 发表于 2018-9-23 12:09
Keil_v5\ARM\Flash\_Template目录下有个烧录算法模板,,其中部分函数如下:
替你验证了,C8T6给C8T6,rct6下载,可以 sanjue 发表于 2018-9-23 16:08
替你验证了,C8T6给C8T6,rct6下载,可以
好的,,感谢{:handshake:} NXP KE0系列的ROM是0x0開始,所以改了Flash_Start_Addr=0;
其它0x08000000的也都改成0x0
NXP的sectors是512Bytes,不像ST是1024,但是改了Flash_Page_Size為512,程序就只會寫0x00
NXP KE0系列的MCU都失敗,
KE04只有1k SRAM,KEIL平常燒寫就比較久,c_blob.tmpl、flash_algo.py還沒想好怎麼改
KE06的RAM有16K但是失敗了,偶爾會讓原本MCU內的Code無法執行,多數是f103c8不一定連上NXP KE06
不知道還有哪些地方是沒注意到的{:sweat:} 谢谢分享,正想看这方面的。 好东西,一直调用jlink实现下载功能。有这个可以抛弃jlink了。 把keil的编程算法加到你的MCUProg里速度应该可以提起来了 好东西。可以给客户提供定制的下载器, 认真学习一下才行,自己做编程器 不错不错,我们也做了nrf51系列的一拖16离线烧录器,改装了下也可以烧stm32和da14580 感谢楼主分享,好资料。
感谢楼主分享, SWD编程器这种实现方法很巧妙 不错 学习一下谢谢分享 看起来很有意思,谢谢分享。 nanfang2000 发表于 2018-9-17 08:43
pip安装这个库
提示:
Traceback (most recent call last):
File "flash_algo.py", line 14, in <module>
from elftools.elf.elffile import ELFFile
ImportError: No module named elftools.elf.elffile
我用pip安装:pip install elftools.elf.elffile
安装不成功,提示:Could not find any downloads that satisfy the requirement elftools.elf.elffile
请教一下,这个如何解决? 山外メ雲ジ 发表于 2018-9-29 15:13
提示:
Traceback (most recent call last):
File "flash_algo.py", line 14, in
pip install pyelftools XIVN1987 发表于 2018-9-29 17:20
pip install pyelftools
非常感谢,已经解决
现在使用的是网上购买的,有空自己倒腾下SWD离线下载,谢谢分享。 Mark 脱机烧写器实现方法。谢谢 XIVN1987 发表于 2018-9-17 09:02
我把flash_algo.py给打包成.exe文件了,,把*.FLM文件放到flash_algo.exe文件目录下,,,然后双击执行f ...
大神,前面的资料已经学习了很多,能不能再分享一下,FLM你如何解析的,特别感激,再次谢谢 china520fly 发表于 2018-10-22 16:08
大神,前面的资料已经学习了很多,能不能再分享一下,FLM你如何解析的,特别感激,再次谢谢 ...
解析*.FLM文件的flash_algo.py是从网上找到的,,只知道*.FLM实际是个.elf文件,所以flash_algo.py内部是通过elftools.elf.elffile完成解析的,
底层工作原理我也没深究,我觉得要研究底层的话需要先研究清楚.elf文件格式,,然后阅读下elftools的源码 看到网上有成品300以内一个的都有,就没有在去研究了。自已用,买来得快 XIVN1987 发表于 2018-10-22 18:16
解析*.FLM文件的flash_algo.py是从网上找到的,,只知道*.FLM实际是个.elf文件,所以flash_algo.py内部 ...
大神,其他芯片你有过验证码?我用转好的STM32L0xx_64.c,可是下载进去后,只有前200个字节正确??是你转的.c有问题,还是我的有问题?期待回复,谢谢诶 china520fly 发表于 2018-10-22 22:32
大神,其他芯片你有过验证码?我用转好的STM32L0xx_64.c,可是下载进去后,只有前200个字节正确??是你 ...
字节的问题,谢谢 666666666666 这个有用,666 感谢分享。已经试验ST的F1和F0芯片烧录成功,F4等其他品牌的Cortex M4 内核的烧录 失败,不知道为啥{:cry:} 这个资料猛,必须得顶。 我目前是用SWD的代码直接去操作寄存器来实现的,而不是下载到RAM中去执行。 感谢分享 高手,大牛 swd资料猛
页:
[1]
2