搜索
bottom↓
回复: 182

分享离线SWD编程器代码

  [复制链接]

出0入25汤圆

发表于 2018-9-16 16:08:04 | 显示全部楼层 |阅读模式
本帖最后由 XIVN1987 于 2018-9-16 16:12 编辑

SWD离线编程器,其实很简单,,
因为关键代码国外的大侠都已经给实现了,,我们只需要简单拼接一下就OK啦

下面我就说下怎样通过拼接代码实现离线编程器:

1、首先,既然是SWD编程器,那首先当然是要实现SWD时序协议了
由于单片机都没有SWD外设,所以只能用GPIO模拟实现SWD时序,,这部分功能已经由ARM公司的CMSIS-DAP代码实现

2、然后就是基于CMSIS-DAP,实现通过DAP读写目标芯片的内存、内核寄存器,,这部分功能已经由DAPLink里面的swd_host.c文件实现

同时,swd_host.c还实现了另一个对实现编程器至关重要的函数:
  1. 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编程器已经实现

不过还有一个问题:要下载到目标芯片SRAM中去的编程算法从哪里来??

我们知道,Keil针对每一颗芯片都有一个Flash编程算法,这个算法存在一个后缀为.FLM的文件里面,,要是我们能把.FLM文件里面的算法内容抽取出来给我们用,,那不就完美了吗

3、其实这个功能也已经有国外大神给实现了,GitHub上的FlashAlgo项目里面有个flash_algo.py文件,它就是用来实现这个功能的


工程示例代码:

另外,这个工程我也已经上传到github上了,,希望坛友能顺便去给加个星,,谢谢啦

https://github.com/XIVN1987/DAPProg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入25汤圆

 楼主| 发表于 2018-9-17 09:02:33 | 显示全部楼层
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文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入25汤圆

 楼主| 发表于 2018-9-23 12:09:10 | 显示全部楼层
本帖最后由 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了!!

不过也有两个小问题:
1、这个项目是基于CMSIS-DAP(DAPLink)的,如果想用JLink做在线下载的话,需要把底层部分换成jlink.py
2、这是个命令行的项目,想要做个带图形界面的在线下载器的话,需要自己添加GUI功能


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入25汤圆

 楼主| 发表于 2018-9-23 17:21:07 | 显示全部楼层

继续填坑

下面两段内容分别来自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文件,,不过还好,生成是一次行的,,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-9-16 16:21:08 | 显示全部楼层
工程的事例是使用什么硬件?

出0入25汤圆

 楼主| 发表于 2018-9-16 16:25:50 | 显示全部楼层
belongfs 发表于 2018-9-16 16:21
工程的事例是使用什么硬件?


随便一个STM32F103C8的demo板就行,,模拟SWD用的B13、B14两个引脚

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-9-16 17:31:34 | 显示全部楼层
不错
曾经自己写过SWD协议实现,可以通过寄存器编程

出0入0汤圆

发表于 2018-9-16 18:18:11 | 显示全部楼层
这里也有一个类似的

贴一个基于STM32的乞丐原始版SWD离线下载器MDK工程
https://www.amobbs.com/thread-5698953-1-1.html
(出处: amoBBS 阿莫电子论坛)

出0入0汤圆

发表于 2018-9-16 19:22:45 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2018-9-16 19:43:04 | 显示全部楼层
哈哈哈  好像都是这么干的哦  keil的闪存编程算法就是这么个东西

出0入0汤圆

发表于 2018-9-16 19:43:34 | 显示全部楼层
感谢分享

出0入8汤圆

发表于 2018-9-16 19:54:32 来自手机 | 显示全部楼层
关注中                  

出0入46汤圆

发表于 2018-9-16 19:59:27 | 显示全部楼层
顶楼主!希望以后会用上廉价的脱机烧写器

出0入0汤圆

发表于 2018-9-16 20:06:44 | 显示全部楼层
楼主厉害,哈哈,我下载了

出0入25汤圆

 楼主| 发表于 2018-9-16 20:11:01 | 显示全部楼层
myxiaonia 发表于 2018-9-16 19:43
哈哈哈  好像都是这么干的哦  keil的闪存编程算法就是这么个东西


是啊,只有能利用Keil(或IAR)的编程算法,制作编程器(不管是离线的还是在线的)才有意义,不然每个芯片都自己实现一遍编程算法,累都累死啦

出0入0汤圆

发表于 2018-9-16 21:58:33 | 显示全部楼层
必须顶!!! 感谢楼主分享!

出0入0汤圆

发表于 2018-9-16 22:04:00 | 显示全部楼层

必须顶!!! 感谢楼主分享!

出140入115汤圆

发表于 2018-9-16 22:14:21 来自手机 | 显示全部楼层
必须顶!!! 感谢楼主分享!+ 收藏了。

出0入0汤圆

发表于 2018-9-16 22:16:57 | 显示全部楼层

感谢分享

出0入0汤圆

发表于 2018-9-16 22:20:09 | 显示全部楼层
mark,有空的时候研究一下,感谢楼主分享!

出0入13汤圆

发表于 2018-9-16 22:42:23 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2018-9-17 00:33:57 来自手机 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2018-9-17 00:37:38 | 显示全部楼层
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

这个怎么用的?

出0入0汤圆

发表于 2018-9-17 02:35:12 | 显示全部楼层
我更改了一下端口,修改打印口到串口1,在我测试的C8T6小板上没有试验成功。
修改硬件接线,程序没修改,还是没成功。空了再研究一下

出0入0汤圆

发表于 2018-9-17 08:38:50 | 显示全部楼层
感谢楼主分享,git已加星

出0入0汤圆

发表于 2018-9-17 08:43:25 来自手机 | 显示全部楼层
boboo 发表于 2018-9-17 00:37
Traceback (most recent call last):
  File "C:%users\FreeRTOS\Desktop\FlashAlgo\flash_algo.py", line  ...

pip安装这个库

出0入309汤圆

发表于 2018-9-17 08:56:44 来自手机 | 显示全部楼层
lz可以看看 adafruit用raspberry pi配合openocd直接用gpio烧录的教程。也算是离线烧录的一种方法。

出0入0汤圆

发表于 2018-9-17 09:01:21 | 显示全部楼层
感謝樓主分享

出0入25汤圆

 楼主| 发表于 2018-9-17 09:06:23 | 显示全部楼层
sanjue 发表于 2018-9-17 02:35
我更改了一下端口,修改打印口到串口1,在我测试的C8T6小板上没有试验成功。
修改硬件接线,程序没修改,还 ...


光修改PIN_SWCLK、PIN_SWDIO的宏定义是不够的,,下面还有些代码需要修改,,

封装性不太好,,

出0入25汤圆

 楼主| 发表于 2018-9-17 09:08:37 | 显示全部楼层
ttyyuuio 发表于 2018-9-17 08:38
感谢楼主分享,git已加星


感谢加星

还第一次长星这么快,,感动

出0入0汤圆

发表于 2018-9-17 09:13:01 | 显示全部楼层

感谢分享

出0入0汤圆

发表于 2018-9-17 09:28:10 | 显示全部楼层
这个要点赞....

出0入0汤圆

发表于 2018-9-17 09:42:42 | 显示全部楼层
谢谢分享  先收藏了  有空看看

出0入0汤圆

发表于 2018-9-17 10:14:48 | 显示全部楼层
这个不错,感谢分享

出0入0汤圆

发表于 2018-9-17 10:19:43 | 显示全部楼层
flash_algo.py 还能这么玩,编译完的东西还能提取出来,厉害厉害,又学到一招
如果能直接加载FLM就更厉害了

出50入58汤圆

发表于 2018-9-17 10:38:49 | 显示全部楼层
感谢分享,有空研究研究

出0入0汤圆

发表于 2018-9-17 11:20:22 | 显示全部楼层
XIVN1987 发表于 2018-9-17 09:08
感谢加星

还第一次长星这么快,,感动

说明这个有需求,哈哈,许多人都想做这个,奈何大牛都憋着不动。
另外,你的程序我测试可以了,就是下载程序之后,还无法软件复位运行,我尝试修改一下

出0入0汤圆

发表于 2018-9-17 11:50:18 | 显示全部楼层
target_flash_erase_sector(0x08000000+addr);

這應該是stm32的起始位置吧,其它家的不一定一樣

大俠的項目已給星

出20入118汤圆

发表于 2018-9-17 11:55:30 来自手机 | 显示全部楼层
good mark了

出0入0汤圆

发表于 2018-9-17 12:58:12 | 显示全部楼层
厉害厉害

出0入0汤圆

发表于 2018-9-17 15:02:43 | 显示全部楼层
SWD方便。

出0入0汤圆

发表于 2018-9-17 15:38:29 | 显示全部楼层
35楼的大哥,下载完程序不运行的问题有解决么?

出0入0汤圆

发表于 2018-9-17 15:44:20 | 显示全部楼层
等待楼主出一个离线烧录器

出0入0汤圆

发表于 2018-9-17 16:28:02 | 显示全部楼层
zkaifa 发表于 2018-9-17 15:38
35楼的大哥,下载完程序不运行的问题有解决么?

嗯,解决了,源代码的软件复位函数有点问题

出0入0汤圆

发表于 2018-9-17 20:38:17 | 显示全部楼层
必须顶!!! 感谢楼主分享!

出0入0汤圆

发表于 2018-9-17 22:06:19 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2018-9-17 23:11:18 来自手机 | 显示全部楼层
Mark 脱机烧写器实现方法。

出0入0汤圆

发表于 2018-9-18 01:45:38 | 显示全部楼层
本帖最后由 zhuisuoji 于 2018-9-18 01:53 编辑

关注一下
另已在github上加了个星

出0入0汤圆

发表于 2018-9-18 08:28:06 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2018-9-18 08:58:49 | 显示全部楼层
sanjue 发表于 2018-9-17 16:28
嗯,解决了,源代码的软件复位函数有点问题

可以分享下如何解决的么?

出0入0汤圆

发表于 2018-9-18 08:59:17 | 显示全部楼层
sanjue 发表于 2018-9-17 16:28
嗯,解决了,源代码的软件复位函数有点问题

可以分享下如何解决的么?

出0入0汤圆

发表于 2018-9-18 10:57:19 | 显示全部楼层
谢谢楼主分享~

出0入0汤圆

发表于 2018-9-18 12:47:24 | 显示全部楼层
zkaifa 发表于 2018-9-18 08:59
可以分享下如何解决的么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入4汤圆

发表于 2018-9-18 13:15:26 | 显示全部楼层
不错,以后做定制烧录器治具可以用得上,谢谢了

出0入25汤圆

 楼主| 发表于 2018-9-18 13:19:57 | 显示全部楼层


感谢反馈,,我晚上更新到github上去

出0入0汤圆

发表于 2018-9-18 13:28:15 | 显示全部楼层
这个不错。已加星

出0入0汤圆

发表于 2018-9-18 13:47:35 | 显示全部楼层
脱机烧录器的福音。感谢楼主

出20入0汤圆

发表于 2018-9-18 14:31:59 | 显示全部楼层
谢谢分享!!!

出0入0汤圆

发表于 2018-9-18 19:54:15 | 显示全部楼层
XIVN1987 发表于 2018-9-18 13:19
感谢反馈,,我晚上更新到github上去


我自己修改了你的代码,重新移植了IO驱动部分,方便定义IO,删除了JTAG部分的一些定义
将代码上传到github了
https://github.com/jiaosanjue/swd_offlie_downloader

出0入25汤圆

 楼主| 发表于 2018-9-18 21:57:35 | 显示全部楼层
sanjue 发表于 2018-9-18 19:54
我自己修改了你的代码,重新移植了IO驱动部分,方便定义IO,删除了JTAG部分的一些定义
将代码上传到github ...


赞!!GitHub上好资源很多

出0入0汤圆

发表于 2018-9-18 23:02:24 | 显示全部楼层
历害了,持续关注。谢谢分享。

出0入0汤圆

发表于 2018-9-19 08:24:48 来自手机 | 显示全部楼层
必须顶!!! 感谢楼主分享!

出0入0汤圆

发表于 2018-9-19 08:45:45 | 显示全部楼层
给你点赞~ mark~

出0入8汤圆

发表于 2018-9-20 22:11:16 来自手机 | 显示全部楼层
能否支持同时给8个板编程
头像被屏蔽

出0入0汤圆

发表于 2018-9-21 08:57:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2018-9-21 09:36:03 | 显示全部楼层
感谢分享,正好需要用到

出0入0汤圆

发表于 2018-9-22 10:04:31 | 显示全部楼层

多谢~~~~~~

出0入0汤圆

发表于 2018-9-23 12:35:58 | 显示全部楼层
过节了还在更新,顶楼主一下。

出0入0汤圆

发表于 2018-9-23 13:45:03 来自手机 | 显示全部楼层
这个有用

出0入0汤圆

发表于 2018-9-23 15:21:53 | 显示全部楼层
感谢分享,最近刚好研究离线烧写的资料

出0入0汤圆

发表于 2018-9-23 16:08:06 | 显示全部楼层
XIVN1987 发表于 2018-9-23 12:09
Keil_v5\ARM\Flash\_Template目录下有个烧录算法模板,,其中部分函数如下:

替你验证了,C8T6给C8T6,rct6下载,可以

出0入25汤圆

 楼主| 发表于 2018-9-23 16:41:35 | 显示全部楼层
sanjue 发表于 2018-9-23 16:08
替你验证了,C8T6给C8T6,rct6下载,可以


好的,,感谢

出0入0汤圆

发表于 2018-9-26 10:08:21 | 显示全部楼层
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

不知道還有哪些地方是沒注意到的

出0入0汤圆

发表于 2018-9-26 10:43:49 | 显示全部楼层
谢谢分享,正想看这方面的。

出0入0汤圆

发表于 2018-9-27 08:51:17 | 显示全部楼层
好东西,一直调用jlink实现下载功能。有这个可以抛弃jlink了。

出0入0汤圆

发表于 2018-9-27 09:40:22 | 显示全部楼层
把keil的编程算法加到你的MCUProg里  速度应该可以提起来了

出0入0汤圆

发表于 2018-9-27 13:10:13 | 显示全部楼层
好东西。可以给客户提供定制的下载器,

出0入0汤圆

发表于 2018-9-27 14:01:10 | 显示全部楼层
认真学习一下才行,自己做编程器

出40入518汤圆

发表于 2018-9-27 14:11:35 | 显示全部楼层
不错不错,我们也做了nrf51系列的一拖16离线烧录器,改装了下也可以烧stm32和da14580

出0入0汤圆

发表于 2018-9-28 14:47:37 | 显示全部楼层
感谢楼主分享,好资料。

出0入170汤圆

发表于 2018-9-29 09:03:35 | 显示全部楼层

感谢楼主分享, SWD编程器这种实现方法很巧妙

出0入0汤圆

发表于 2018-9-29 11:36:39 | 显示全部楼层
不错   学习一下  谢谢分享

出0入8汤圆

发表于 2018-9-29 13:44:56 来自手机 | 显示全部楼层
看起来很有意思,谢谢分享。

出0入0汤圆

发表于 2018-9-29 15:13:13 | 显示全部楼层

提示:
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

请教一下,这个如何解决?

出0入25汤圆

 楼主| 发表于 2018-9-29 17:20:36 | 显示全部楼层
山外メ雲ジ 发表于 2018-9-29 15:13
提示:
Traceback (most recent call last):
  File "flash_algo.py", line 14, in


pip install pyelftools

出0入0汤圆

发表于 2018-9-29 18:33:28 | 显示全部楼层
XIVN1987 发表于 2018-9-29 17:20
pip install pyelftools

非常感谢,已经解决

出0入0汤圆

发表于 2018-10-15 17:10:58 | 显示全部楼层
现在使用的是网上购买的,有空自己倒腾下SWD离线下载,谢谢分享。

出0入0汤圆

发表于 2018-10-17 20:22:57 来自手机 | 显示全部楼层
Mark 脱机烧写器实现方法。谢谢

出0入0汤圆

发表于 2018-10-22 16:08:29 | 显示全部楼层
XIVN1987 发表于 2018-9-17 09:02
我把flash_algo.py给打包成.exe文件了,,把*.FLM文件放到flash_algo.exe文件目录下,,,然后双击执行f ...

大神,前面的资料已经学习了很多,能不能再分享一下,FLM你如何解析的,特别感激,再次谢谢

出0入25汤圆

 楼主| 发表于 2018-10-22 18:16:58 | 显示全部楼层
china520fly 发表于 2018-10-22 16:08
大神,前面的资料已经学习了很多,能不能再分享一下,FLM你如何解析的,特别感激,再次谢谢 ...


解析*.FLM文件的flash_algo.py是从网上找到的,,只知道*.FLM实际是个.elf文件,所以flash_algo.py内部是通过elftools.elf.elffile完成解析的,

底层工作原理我也没深究,我觉得要研究底层的话需要先研究清楚.elf文件格式,,然后阅读下elftools的源码

出0入0汤圆

发表于 2018-10-22 22:16:03 | 显示全部楼层
看到网上有成品300以内一个的都有,就没有在去研究了。自已用,买来得快

出0入0汤圆

发表于 2018-10-22 22:32:11 | 显示全部楼层
XIVN1987 发表于 2018-10-22 18:16
解析*.FLM文件的flash_algo.py是从网上找到的,,只知道*.FLM实际是个.elf文件,所以flash_algo.py内部 ...

大神,其他芯片你有过验证码?我用转好的STM32L0xx_64.c,可是下载进去后,只有前200个字节正确??是你转的.c有问题,还是我的有问题?期待回复,谢谢诶

出0入0汤圆

发表于 2018-10-23 09:33:46 | 显示全部楼层
china520fly 发表于 2018-10-22 22:32
大神,其他芯片你有过验证码?我用转好的STM32L0xx_64.c,可是下载进去后,只有前200个字节正确??是你 ...

字节的问题,谢谢

出0入0汤圆

发表于 2018-11-16 12:23:52 | 显示全部楼层
666666666666

出0入0汤圆

发表于 2018-11-24 00:25:46 来自手机 | 显示全部楼层
这个有用,666

出0入20汤圆

发表于 2018-12-9 16:51:50 | 显示全部楼层
感谢分享。已经试验ST的F1和F0芯片烧录成功,F4等其他品牌的Cortex M4 内核的烧录 失败,不知道为啥

出0入0汤圆

发表于 2018-12-9 18:25:17 | 显示全部楼层
这个资料猛,必须得顶。 我目前是用SWD的代码直接去操作寄存器来实现的,而不是下载到RAM中去执行。

出0入0汤圆

发表于 2018-12-9 21:30:02 | 显示全部楼层
感谢分享

出100入101汤圆

发表于 2018-12-9 21:38:30 | 显示全部楼层
高手,大牛

出0入0汤圆

发表于 2018-12-10 00:32:09 来自手机 | 显示全部楼层
swd资料猛
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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