搜索
bottom↓
回复: 125

GPIO 访问 SWD 接口的心得体会

  [复制链接]

出0入0汤圆

发表于 2016-6-23 22:28:31 | 显示全部楼层 |阅读模式
本帖最后由 helislayer 于 2016-6-23 22:30 编辑

最近写了些用 GPIO 访问 swd 的程序来玩。记录一下体会:

1)ARM Debug Interface Architecture Specification 这个是 ARM
给的规范,初学不要去读。用这个上手极其困难。这个规范讲了
太多细节,很多常识性的东西没有讲。例如我一直疑惑 turn around
的时候是谁驱动 swclk,应该是 host 但是没有说。这个规范比较
适合已经把底层跑通了,看细节某个寄存器如何用的。适合做 ARM
的厂家不适合作为程序员来写个 swd 访问的程序。

2)上手收建议这个:EFM32: Programming Internal Flash
Over the Serial Wire Debug Interface。
这个手册是从如何写 SWD 接口程序的,虽然不是 STM32 的,
但是比较清楚,例如我前面的疑惑就讲很明白。这个手册也不长。
我上传上来了。

3)那个 SWD 接口其实就是和 SPI 非常像,基本上可以理解为
MOSI 和 MISO 合并成一根线SWD-IO。中间有软件协议上下文来
协商谁来驱动这根线。这个转换需要一个 clock, 就是 turn around。

4) 那个 SWD 的 CLK 就是 SPI CLK, 永远由 host 来驱动。

5)target 永远再上升沿采集和放新的数据。这个意味着 host 从
target 读数的时候是在下降沿读比较方便。

6)思路和攻略大概是这样,要先写个底层的接口可以 reset。
就是发一堆 1 (50 以上) 和 中间发一个 0xE79E 再发 50 多个 1.
0xE79E 就是说老子要用 SWD 而不是 JTAG。

7)接下来就要写 读写 AP 和 DP 的寄存器。每种一共 4 个地址很简单。
这个 DP 就是调试接口的硬件。这个 AP 就是一个访问周边外设和内存
的硬件接口。因为 ARM 的外设都是影射到内存地址的,所以可以访问
任意内存地址就可以刷程序和调试了。

8)访问内存需要通过 AP。就是先写访问内存的地址到一个地址寄存器,
然后通过另外一个数据寄存器读写内存。

大概就是这样,我先在也就只是做到这一步。



本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-6-23 22:43:53 | 显示全部楼层
这个不错,我最近也在着手玩这个东西。
另外,楼主不知道arm官方开源的cmsis-DAP吗,这个有现成的代码可以分析仪的。

虽然复杂的debug协议操作都是mdk软件发相应命令,cmsis-DAP工具只管翻译执行相关操作。但是可以通过配置debug模式,在串口打印具体的操作命令的详细信息出来分析的。

我英文太差,不打算去啃英文文档来入门。那样太累了。直接分析代码,再架上逻辑分析仪,直接调试cmsis-DAP去!

出0入0汤圆

 楼主| 发表于 2016-6-23 22:59:11 | 显示全部楼层
chaled 发表于 2016-6-23 22:43
这个不错,我最近也在着手玩这个东西。
另外,楼主不知道arm官方开源的cmsis-DAP吗,这个有现成的代码可以 ...

我用 Linux 所以没有 MDK 可以用。我只用 arm gcc。
那个是通过 MDK 的 USB 接口来访问的吧。
找到一个 https://github.com/mbedmicro/CMS ... /Common/src/SW_DP.c
是这个吗?

我看过一些开源的 swd 代码都写得好绕啊。
底层访问自己写也才几百行 C 就差不多了,不包括定
义寄存器那些。

出0入0汤圆

发表于 2016-6-23 23:09:13 | 显示全部楼层
helislayer 发表于 2016-6-23 22:59
我用 Linux 所以没有 MDK 可以用。我只用 arm gcc。
那个是通过 MDK 的 USB 接口来访问的吧。
找到一个 h ...

是这样的。cmsis-DAP绕来绕去是为了做通用。大家可以移植到不同的MCU上面去吧。

我都懒得一行行分析代码,先看操作过程日志信息。调试通了,再慢慢分析代码,优化速度等!

出0入0汤圆

 楼主| 发表于 2016-6-23 23:19:34 | 显示全部楼层
chaled 发表于 2016-6-23 23:09
是这样的。cmsis-DAP绕来绕去是为了做通用。大家可以移植到不同的MCU上面去吧。

我都懒得一行行分析代码 ...

那代码我看了一下头疼。

你直接调 trace 那个也很绕,都是访问  DP AP 的寄存器,
所以你还是要回到理解 DP AP 这些寄存器干什么用的。
其实一共就 8 个寄存器地址,读读文档也没有损失。

我找到一个归纳特别好的英文的文档,各个技术要点
基本上都讲到了。

http://markdingst.blogspot.com/2 ... -sram-over-swd.html

出0入0汤圆

 楼主| 发表于 2016-6-24 00:37:53 | 显示全部楼层
chaled 发表于 2016-6-23 23:09
是这样的。cmsis-DAP绕来绕去是为了做通用。大家可以移植到不同的MCU上面去吧。

我都懒得一行行分析代码 ...

我又看了一下那个 CMSIS DAP 代码。那个代码应该可以用。
不过写得不是很好,很长一段代码很深的一个传递函数,还是
用宏写的。

出0入0汤圆

发表于 2016-6-24 01:19:38 | 显示全部楼层
辛苦了,感谢分享!

出0入0汤圆

发表于 2016-6-24 03:52:20 来自手机 | 显示全部楼层
再加一个工具,逻辑分析仪,最新版软件支持Swd分析了。对着看更明白

出0入0汤圆

发表于 2016-6-24 03:55:36 来自手机 | 显示全部楼层
6,之前的Swd帖有提到,两个新老版本在这发送的不一样,所以最好两种都发一遍

出0入0汤圆

发表于 2016-6-24 08:20:31 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2016-6-24 08:55:15 | 显示全部楼层
boboo 发表于 2016-6-24 03:55
6,之前的Swd帖有提到,两个新老版本在这发送的不一样,所以最好两种都发一遍 ...

哦,是那个 0xDEB6 那个过时的 SWD 切换命令吗?
我发现我的 STM32F030 用新的标准的 SWD 切换完全
没有问题所以就没有管这个。

我怀疑是原来那个帖子 LZ 碰到一些特殊情况没有去
处理,例如 ACK Fail, target busy  这些需要多试几
次。正版的STLink 也有重试这回事。

这个浪费了我很多时间,因为看上去发的是对的。
然后才发现换STLink 也会碰到同样情况,然后stlink
重试几次就好了。估计是我前面调试写了很多垃圾
进去,reset 需要点时间。

出0入0汤圆

发表于 2016-6-24 09:18:17 来自手机 | 显示全部楼层
具体是多少忘记了,反正jlink 是两种都发了。我之前仔细分析过。想搞一个通用的,分析flasher 的配置文件中。

出0入0汤圆

 楼主| 发表于 2016-6-24 09:40:42 来自手机 | 显示全部楼层
0xDEB6 是吧,我猜都发大概也没有什么坏处。我看到的stlink就发一种。flasher有什么配置文件可以看的?

出0入0汤圆

发表于 2016-6-24 09:56:07 | 显示全部楼层
学习,学习。

出0入0汤圆

发表于 2016-6-24 10:04:38 | 显示全部楼层
Programming internal SRAM over SWD
http://www.cnblogs.com/shangdawei/p/4750723.html

出0入0汤圆

发表于 2016-6-24 10:43:28 来自手机 | 显示全部楼层
boboo 发表于 2016-6-24 03:52
再加一个工具,逻辑分析仪,最新版软件支持Swd分析了。对着看更明白


哪种逻辑仪支持swd

出0入0汤圆

 楼主| 发表于 2016-6-24 11:44:07 | 显示全部楼层
so_so_so_so 发表于 2016-6-24 10:04
Programming internal SRAM over SWD
http://www.cnblogs.com/shangdawei/p/4750723.html

这个里面的程序就是我前面说有个比较好的技术资源那个
MarkDing 的。
这个代码看上去比较干净。比 CMISS-DAP 的要舒服。

出0入0汤圆

发表于 2016-6-24 12:22:14 | 显示全部楼层
SWD,留名,后续可能会用到!

出0入0汤圆

发表于 2016-6-24 12:35:48 来自手机 | 显示全部楼层
helislayer 发表于 2016-6-24 09:40
0xDEB6 是吧,我猜都发大概也没有什么坏处。我看到的stlink就发一种。flasher有什么配置文件可以看的? ...

Jflash那,文件,下面有一个生成配置文件,一个数据文件,给自家的flasher配套使用的。

出0入0汤圆

发表于 2016-6-24 12:37:36 来自手机 | 显示全部楼层
huangqi412 发表于 2016-6-24 10:43
哪种逻辑仪支持swd

淘宝里比较火的那个,1.2.10最新版好像。看我的回帖自己有牌子,就这几天的回帖。

出0入0汤圆

发表于 2016-6-24 12:38:16 来自手机 | 显示全部楼层
huangqi412 发表于 2016-6-24 10:43
哪种逻辑仪支持swd

目前好像支持的不太好,但是大部分没问题

出0入0汤圆

发表于 2016-6-24 12:51:02 | 显示全部楼层
boboo 发表于 2016-6-24 12:37
淘宝里比较火的那个,1.2.10最新版好像。看我的回帖自己有牌子,就这几天的回帖。 ...

Saleae   这个啊,   再问问这个支持USB么,网上搜了下似乎有讲支持的,但是看网上软件界面图似乎没USB协议分析。             还有那个USBEE 的逻辑义,似乎也有说支持的,但是找了下也没找到,另外那个USBEE采样才24M最大,USB就12M,还很可能会出现不支持什么的,似乎也不靠谱。         想找个便宜办法抓抓USB,不要BUS HOUND这种驱动抓包。

出0入0汤圆

发表于 2016-6-24 12:51:18 | 显示全部楼层
boboo 发表于 2016-6-24 12:37
淘宝里比较火的那个,1.2.10最新版好像。看我的回帖自己有牌子,就这几天的回帖。 ...

Saleae   这个啊,   再问问这个支持USB么,网上搜了下似乎有讲支持的,但是看网上软件界面图似乎没USB协议分析。             还有那个USBEE 的逻辑义,似乎也有说支持的,但是找了下也没找到,另外那个USBEE采样才24M最大,USB就12M,还很可能会出现不支持什么的,似乎也不靠谱。         想找个便宜办法抓抓USB,不要BUS HOUND这种驱动抓包。

出0入0汤圆

发表于 2016-6-24 12:56:20 来自手机 | 显示全部楼层
软件里有插件,不过我没用过。你买一个试试呗。买之前说好不支持退货么。

出0入0汤圆

发表于 2016-6-24 12:57:43 | 显示全部楼层

SWD,留名

出0入0汤圆

 楼主| 发表于 2016-6-24 13:33:51 | 显示全部楼层
Saleae 最新软件是支持 swd 的,里面也有菜单号称支持 USB 1.0 的那个比较慢的
速度,我没有用过。USB 2.0 肯定就不用想了。

出0入0汤圆

 楼主| 发表于 2016-6-25 14:17:23 | 显示全部楼层
最近又研究了一下如何把程序通过 swd 写到 flash 里面。
swd 并没有特别的写 flash 的支持。写 flash 是一般有两个策略。

第一个直接通过 AP 在 stm32 是 AHB-AP 来写 flash 的寄存器。
这个和在程序里面写 flash 步骤是一样的,要先写 Key 解锁 flash
等等。不同的是,利用 swd 的 AP 访问来完成寄存器读写。
例如, C 里面的 FLASH->CR = 1

在 SWD 就要分两步,
1)为了写一个寄存器,需要先写 AP 的 TAR 寄存器放入 FLASH->CR
的地址。
2)然后写 AP 的 DRW 寄存器,放入 1。

读就更麻烦了,因为 AP 寄存器读是上个周期的数据,为了拿到新
的数据要读两次。所以 C 里面 a = FLASH->CR 这个简单操作,
等价的 swd 步骤是:
1)AP 的 TAR 写入 FLASH->CR 的地址。
2)AP 的 DRW 读入一个数据,这个数据是上次产生的,扔掉。
这个时候 AP 去读 AHB 的内存,DRW 已经被更新了,但是我们
没有见到新的数据。
3)AP 的 RDBUFF 读入一个数据。这个数据就是上次 DRW 读入
那个。为什么不去读 DRW 呢?读 DRW 也能拿到同样的数,但是
TAR 有可能会自动增加,如果你打开了 CSW 里面的自动增加机制。
相比之下读 RDBUFF 就不会修改 TAR。

好了,可以看见读一个32位值很麻烦,需要三个 swd request。
然后写flash 的时候需要不断的读 flash 的busy 状态才能知道可以
写下一个 flash。这个就很亏,因为写一个 flash word 需要好几个
swd 操作。 也就是说,下载速度会比较慢。


然后自然就有了第二个策略,就是先把要 flash 的内容放到 ram
里面,然后在 ram 里面跑个循环把 flash 写进去。这样就不用反复
在 swd 上来查 flash 的 busy 状态。这种做法 swd 上传输的数据可以
和需要 flash 的数据差不多,而不是 几个倍数的关系。因为前面提到
TAR 有个自动增加机制,写 RAM 就一股脑灌 DRW 就行了。

如果要用这个策略,问题马上来了,如何装程序进去到 ram 里面?
和装flash 数据一样。

那如何让程序跑起来?这个就要用到 STM32 的 CoreDebug 调试外设。
CoreDebug 在手册里有提到一下,头文件也有。 CoreDebug 就可以
halt, run 一个程序,改 PC R1 R2 寄存器这些。

出0入0汤圆

发表于 2016-6-25 15:55:57 | 显示全部楼层
helislayer 发表于 2016-6-25 14:17
最近又研究了一下如何把程序通过 swd 写到 flash 里面。
swd 并没有特别的写 flash 的支持。写 flash 是一 ...

直接闪存编程如何做的,  STM32闪存写入是16位, SWD通信是32位。   

出0入0汤圆

 楼主| 发表于 2016-6-25 20:04:19 来自手机 | 显示全部楼层
huangqi412 发表于 2016-6-25 15:55
直接闪存编程如何做的,  STM32闪存写入是16位, SWD通信是32位。

AP 访问的第一个寄存器 CSW 可以设定 TAR 是否自动增长和 DRW 访问的位数。在那里设置16位就可以用16位访问。虽然DRW是32的。

出0入0汤圆

发表于 2016-6-25 22:02:28 | 显示全部楼层
helislayer 发表于 2016-6-25 20:04
AP 访问的第一个寄存器 CSW 可以设定 TAR 是否自动增长和 DRW 访问的位数。在那里设置16位就可以用16位访 ...


我回头看看  依然写32位数据但是高16位忽略无效对吧   好久前也搞过swd和jtag. 后面忘记了  有人问我这个 我也不知道了

出0入0汤圆

 楼主| 发表于 2016-6-26 06:53:43 | 显示全部楼层
huangqi412 发表于 2016-6-25 22:02
我回头看看  依然写32位数据但是高16位忽略无效对吧   好久前也搞过swd和jtag. 后面忘记了  有人问我这个 ...

对。是这样的。

出0入0汤圆

发表于 2016-6-26 12:23:00 来自手机 | 显示全部楼层
helislayer 发表于 2016-6-25 14:17
最近又研究了一下如何把程序通过 swd 写到 flash 里面。
swd 并没有特别的写 flash 的支持。写 flash 是一 ...

keil下载程序就是用后一种办法,放一段小程序到sram

出0入0汤圆

 楼主| 发表于 2016-6-26 12:29:02 | 显示全部楼层
myxiaonia 发表于 2016-6-26 12:23
keil下载程序就是用后一种办法,放一段小程序到sram

stlink 也是,我看到的所有的商业应用的都是。
stlink 连 erase 都是用下载程序的方式做的。
这个下固件的速度最多也就 几十K 的样子,
因为 stm32 flash 写一次要几十个 us 的等待。
这个最快也快不到那里去。

出0入0汤圆

发表于 2016-6-26 12:49:39 来自手机 | 显示全部楼层
所以,我觉得,先把下载数据的过程监控下来,剩下的慢慢画瓢就好。

出0入0汤圆

 楼主| 发表于 2016-6-26 12:58:40 | 显示全部楼层
boboo 发表于 2016-6-26 12:49
所以,我觉得,先把下载数据的过程监控下来,剩下的慢慢画瓢就好。

那个真的没有很多意思,你会看到一大堆往内存写数字,
然后就是 unhalt 运行一下程序就搞定了。
变成你要反汇编内存那个 flashloader 才明白人家是如何
玩的。

出0入0汤圆

发表于 2016-6-26 13:12:21 来自手机 | 显示全部楼层
helislayer 发表于 2016-6-26 12:58
那个真的没有很多意思,你会看到一大堆往内存写数字,
然后就是 unhalt 运行一下程序就搞定了。
变成你要 ...

我的计划是多次试验,找出不同的差异。然后根据差异分析JFlasher 的配置文件。

出0入0汤圆

发表于 2016-6-26 13:16:35 | 显示全部楼层
非常感谢,学习了

出0入0汤圆

 楼主| 发表于 2016-6-26 13:26:54 | 显示全部楼层
boboo 发表于 2016-6-26 13:12
我的计划是多次试验,找出不同的差异。然后根据差异分析JFlasher 的配置文件。 ...

哦是这样。因为我没有 JLink 所以没有办法帮你。

我觉得我自己写的 swd adapter 马上就可以用了。
应该也不太需要 JLink 了。linux 里面就是用 gdb,
我大不了自己搞个 gdb remote server 就大功告成
了。

出0入0汤圆

发表于 2016-6-26 13:52:38 | 显示全部楼层
helislayer 发表于 2016-6-26 13:26
哦是这样。因为我没有 JLink 所以没有办法帮你。

我觉得我自己写的 swd adapter 马上就可以用了。

是某个IC专用还是所有IC通用?

出0入0汤圆

 楼主| 发表于 2016-6-26 15:17:38 | 显示全部楼层
boboo 发表于 2016-6-26 13:52
是某个IC专用还是所有IC通用?

加个 IC 改动不大。一般就是某个 flash 地址要改一下这些。

出0入0汤圆

 楼主| 发表于 2016-6-26 17:43:12 | 显示全部楼层
哈哈,可以发指令可以擦除了。庆祝一下。

出0入0汤圆

发表于 2016-6-26 18:43:36 来自手机 | 显示全部楼层
很好的帖子,找了很久了,多谢啊

出0入0汤圆

 楼主| 发表于 2016-7-2 10:43:17 | 显示全部楼层
终于把外部刷 flash 的策略调通了。还是费了点周折。

外部刷就是没有在 ARM 里面跑程序来刷,跑程序来刷
那个会快一些。

碰到的问题主要有几个方面:
1)错误恢复。当传比较大量的数据的时候,arm swd 会偶尔出现
不能正确 ACK。而且这个不是传输错误引起的,我感觉是似乎 swd
那个 debug core 内部乱了。发一堆零清除以后再重发也频繁出错。
连试图发指令给 debug core reset 都完成不了。
试了不同的恢复方式,最有效的恢复方式就是重新链接 swd,发一堆
1 那个然后选择 swd 那个。我发现在我的 stm32f0 上比较有效的恢复
了到正常状态。观察 stlink-v2 也有同样的 reset 问题, stlink 也会做
reset 动作。

2)16 位的 DRW 读写。这个是比较坑的。我发现我写的 flash 都是头一个
16位正确,后面一个16位全是0。然后又一个正确,非常有规律。
这个问题最后找到就是如果不满 32 位的读写,DRW 是那个部分位被写出去。
我以为是最低的 16 位,但是其实不是。其实 DRW 是跳过了 TAR 不对齐 32
位的部分来写。

例如 CSW = 16 位访问 ,TAR = 0x8000002, 那 DRW 就要写 0xABCD0000,
有效的位数在高16位。
如果是 TAR = 0x8000004, 那 DRW有效的数据就在低 16 位。
也就是说, DRW 内部电路是跳过了不对齐 32 的位数去拿有效的数。

出0入0汤圆

发表于 2016-7-2 11:08:12 来自手机 | 显示全部楼层
恭喜了,我还在分析通用性配置,手里目前没有工具不好动手

出0入0汤圆

发表于 2016-7-2 21:33:45 | 显示全部楼层
我觉得速度是关键,没有速度swd实用性降低很多。时钟频率至少是2m才有意义。

出0入0汤圆

 楼主| 发表于 2016-7-2 22:36:04 | 显示全部楼层
wangweigang0 发表于 2016-7-2 21:33
我觉得速度是关键,没有速度swd实用性降低很多。时钟频率至少是2m才有意义。 ...

速度还好吧,我用75M 左右 MCU 可以做到时钟 4M 左右。
我调试的时候一般是把时钟放到 700K 左右。如果是连续
读写 DRW request 和 request 之间的间隙还挺小的。

这个完全是没有用到硬件的时钟,如果能用 I2S 之类的硬
件时钟会更快。

一般 stm32 flash 的写一个 word 需要几十个 us。所以最
快也要 50KB/s左右。那个时钟快对写 firmware 速度影响
不是特别大。

出0入0汤圆

 楼主| 发表于 2016-7-6 18:41:29 | 显示全部楼层
刚刚从一个大坑爬出来,庆祝一下。

我在试图用 flash loader 的程序来刷 flash。
就是前面说的第二种策略。

但是每次一跑就 lockup condition。程序感觉
就是跑飞了那样。各种验证百思不得其解。
把程序从 ram 读出来没有问题。

一怒之下写了个单步调试的功能,跟踪我那个
flash loader 的代码。这下就把问题暴露了,跑
的程序是乱码。根本不是我的flash loader 程序。
难怪一跑就崩掉。

然后各种调试看什么地方把我的 flash loader 程序
给覆盖掉了。最后发现这个特别坑的东西。

就是 AHB-AP 里面这个 TAR 地址的自动增加只会
在 4K 页面里面增加。超出了 4K 页面就会绕回来。
于是绕回来就把我的 flash loader 给刷掉了。
太坑了。

后来我找到了 ARM 的官方依据:

Auto address increment and pack mode on Read or Write data access. Only increments if the current transaction completes with no error.
Auto address incrementing and packed transfers are not performed on access to Banked Data registers 0x10 - 0x1C. The status of these bits is ignored in these cases.
Increments and wraps within a 4-KB address boundary, for example from 0x1000 to 0x1FFC. If the start is at 0x14A0, then the counter increments to 0x1FFC, wraps to 0x1000, then continues incrementing to 0x149C.

浪费了我不少时间。不过写了半个调试器也挺有用的。

出0入8汤圆

发表于 2016-8-2 15:52:30 | 显示全部楼层
楼主有什么新的进展吗?很期待啊

出0入0汤圆

 楼主| 发表于 2016-8-2 16:55:31 | 显示全部楼层
蓝蓝的恋 发表于 2016-8-2 15:52
楼主有什么新的进展吗?很期待啊

这个我已经可以刷 F0,F1,F3 了,F4 还没有试。F2 我没有。
然后我发现其实 F0 到 F3 都可以用同样的 flash loader 的程序
来刷,就是只用 Thumb 的代码就可以了。因为刷 flash 本来
时间就是花在等待那个 busy。 所以用Thumb-2 的指令完全
不必要。

我发现基本上用 flash loader 比外部直接操作flash 寄存器快
差不多 1 倍左右。

然后我也实现了类似 RTT 那样通过 SWD 来打印的功能。
原来的实现是覆盖的,然后发现这个覆盖很糟糕,基本上
stm32打多了不能知道什么时候发生了覆盖,读出来的
每个位置都有可能是覆盖过的。所以又实现了不覆盖的
版本。这个就好很多了。stm32 可以先reset 跑一阵子
再去读输出也不会漏掉开始的那些信息。
打印速度基本上可以接近 SWD 速度的极限,差不多 2M
左右,比 uart 快多了。而且是写内存的,不需要配置
任何东西。连接调用就好了。

自己写了个 sprintf,因为 gcc 那个 sprintf 一用就把我 f030
的 16K flash 爆掉了。

F3 的 swd reset 有些小问题,erase 以后需要外部 reset
一下就可以刷了。似乎 swd reset 以后寄存器的值没有归零。
外部reset 就归零了。
还没有仔细调。估计和 swd 关系不大,是如何用 F3 的调
试寄存器问题。反正 F0 和 F1 没有这个问题。

我已经好久都没有用过官方的 stlink 来刷程序了。
我自己的刷程序比 stutil 的那个快很多。

自己的 swd 打印输出控制比较方便,用程序自动采集
处理调试打印输出都容易。

出0入0汤圆

发表于 2016-8-2 17:13:40 | 显示全部楼层
期待高手 的大作。

出0入0汤圆

发表于 2016-8-2 19:39:14 | 显示全部楼层
helislayer 发表于 2016-6-23 22:59
我用 Linux 所以没有 MDK 可以用。我只用 arm gcc。
那个是通过 MDK 的 USB 接口来访问的吧。
找到一个 h ...

你是用eclipse+gcc开发吗

出0入0汤圆

发表于 2016-8-2 20:51:29 | 显示全部楼层
有用,收藏

出0入0汤圆

发表于 2016-8-2 21:04:29 | 显示全部楼层
学习了,谢谢

出20入0汤圆

发表于 2016-8-2 21:37:24 | 显示全部楼层
收藏备用。

出0入4汤圆

发表于 2016-8-2 21:51:55 | 显示全部楼层
helislayer 发表于 2016-7-6 18:41
刚刚从一个大坑爬出来,庆祝一下。

我在试图用 flash loader 的程序来刷 flash。

大牛,学习了

出0入8汤圆

发表于 2016-8-3 08:01:40 | 显示全部楼层
helislayer 发表于 2016-8-2 16:55
这个我已经可以刷 F0,F1,F3 了,F4 还没有试。F2 我没有。
然后我发现其实 F0 到 F3 都可以用同样的 fl ...

厉害

出0入0汤圆

 楼主| 发表于 2016-8-3 12:30:27 | 显示全部楼层
sanger 发表于 2016-8-2 19:39
你是用eclipse+gcc开发吗

我是用 vim + make + gcc 开发。
还有 vim 内部使用 cscope 和 ctags 做 cross reference。
这个组合跑起来最快依赖的资源最少。

出0入0汤圆

发表于 2016-8-3 13:45:07 | 显示全部楼层
swd , 学习了.

出0入0汤圆

发表于 2016-9-8 16:32:34 | 显示全部楼层

swd 学习中 。 。。。 不错

出0入0汤圆

发表于 2016-9-8 16:40:33 | 显示全部楼层
GPIO 访问 SWD 接口  mark

出0入8汤圆

发表于 2016-9-8 18:33:20 来自手机 | 显示全部楼层
非常好!!!

出0入0汤圆

发表于 2016-9-8 21:06:02 | 显示全部楼层
mark~!!!!

出0入0汤圆

发表于 2016-11-3 19:07:13 | 显示全部楼层
我用swd写flash一直无法成功,先擦除整个页擦出成功了,但写的时候按上面说的csw设置成16bit,然后写,但写完后,读FLASH_SR寄存器,一直是BUSY状态

出0入0汤圆

发表于 2016-11-3 19:34:25 | 显示全部楼层




本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2016-11-3 20:22:53 | 显示全部楼层
研究这个的都是牛人啊

出0入0汤圆

发表于 2016-11-3 20:54:56 | 显示全部楼层

请教下,在吧csw.size设置成16bit后,写flash操作有什么需要注意的么,为什么我写一个数据后flash_SR寄存器的BUSY位一直是1

出0入0汤圆

发表于 2016-11-3 22:44:47 | 显示全部楼层
强帖,做个记号!

出0入0汤圆

发表于 2016-11-3 23:30:03 | 显示全部楼层
zhangyh89 发表于 2016-11-3 20:54
请教下,在吧csw.size设置成16bit后,写flash操作有什么需要注意的么,为什么我写一个数据后flash_SR寄存 ...

帮不上忙,我也不懂。

出0入0汤圆

 楼主| 发表于 2016-11-5 13:54:12 | 显示全部楼层
zhangyh89 发表于 2016-11-3 20:54
请教下,在吧csw.size设置成16bit后,写flash操作有什么需要注意的么,为什么我写一个数据后flash_SR寄存 ...

我遇到的问题有两个。

一个是,那个访问地址的 16 在 32 位内部对齐的问题。
这个问题在前面有提到。表现是写了错误的数据进去,
往往是每隔一个 16 bit 的word 有一个word 是 0.

还有一个是写那个 flash 保护位会奇妙的出错,
完全没有错误信息,看上去是写上去了,但是再读
回来那个 flash PG bit 没有写上去,后面真的写 flash
就一踏糊涂了。解决是多写很多次后面就有成功的了了。
不知道是什么原因,还没有找到。这个是写那个 PG 的
位。

多写些验证代码,例如读当前 flash programming 那
几个寄存器看看是不是希望的状态。

出0入0汤圆

发表于 2016-11-5 22:36:23 | 显示全部楼层
helislayer 发表于 2016-11-5 13:54
我遇到的问题有两个。

一个是,那个访问地址的 16 在 32 位内部对齐的问题。

找到原因了,其实就是我擦除flash后上锁了,结果写的flash的时候没开锁。

不过现在在尝试使用spi通讯,发现读写DP的寄存器写AP寄存器都正常,但是只要是读AP寄存器的话,读第一次能读出来,读第二次就移植返回0xFFFFFFFF,之后读任何DP AP寄存器都是返回0xFFFFFFFF,这个时候只能给目标板重新上电

出0入0汤圆

 楼主| 发表于 2016-11-5 23:06:07 | 显示全部楼层
zhangyh89 发表于 2016-11-5 22:36
找到原因了,其实就是我擦除flash后上锁了,结果写的flash的时候没开锁。

不过现在在尝试使用spi通讯, ...

上锁这个通过打印 flash 寄存器是可以看出问题的。

你访问的是 DRW 还是 RDBUFF?

出0入0汤圆

发表于 2016-11-5 23:28:21 | 显示全部楼层
helislayer 发表于 2016-11-5 23:06
上锁这个通过打印 flash 寄存器是可以看出问题的。

你访问的是 DRW 还是 RDBUFF?

又试了下,读DRW RDBUFF都会这样,读AP-IDR也只能都成功一次,但是如果只是读IDCODE  CTRLSTAT的话一直斗士正常的

出0入0汤圆

发表于 2016-11-5 23:32:04 | 显示全部楼层
helislayer 发表于 2016-11-5 23:06
上锁这个通过打印 flash 寄存器是可以看出问题的。

你访问的是 DRW 还是 RDBUFF?

用IO口直接模拟的写flash都正常了,不过每次都是半个字的写而且写前写后都要重新设置CSW.SIZE读FLASH_CR判断忙标志,巨费时间

出0入0汤圆

 楼主| 发表于 2016-11-6 07:22:32 | 显示全部楼层
zhangyh89 发表于 2016-11-5 23:32
用IO口直接模拟的写flash都正常了,不过每次都是半个字的写而且写前写后都要重新设置CSW.SIZE读FLASH_CR ...

哦,对,因为访问其他寄存器CSW.SIZE 要设置回来。恭喜。
我对比过,用程序从内部写快一倍左右,也不是特别多。
关键是那个 flash 的 wait 时间挺多的。这个没办法。

那个 多次读异常的,你的寄存器访问序列是怎么样的?
你需要有个调试打印出所有的底层访问数据,地址和内容。

出0入0汤圆

发表于 2016-11-6 14:16:57 | 显示全部楼层
本帖最后由 zhangyh89 于 2016-11-6 14:18 编辑
helislayer 发表于 2016-11-6 07:22
哦,对,因为访问其他寄存器CSW.SIZE 要设置回来。恭喜。
我对比过,用程序从内部写快一倍左右,也不是特 ...


我板子上有个液晶,调试的时候显示返回结果,还有逻辑分析仪。
我现在用SPI写的读写DP AP函数
1.   linereset
2.   jtag转swd
3.  读IDCODE(读正常,返回0x1BA01477)
4.  读DP-CTRLSTAT(读正常,返回0x00000000)
5.  写DP-ABORT  0x0000003F
6.  写DP-CTRLSTAT  0x50000000
7.  读DP-CTRLSTAT  (返回0xF0000000)
8.  写DP-SELECT 0x000000F0
9.  读AP-IDR
10.  读DP-RDBUFF (返回14770011)
11.  写DP-SELECT 0x00000000
12.   读DP-CTRLSTAT  (返回0xF0000040)
之后任何的读操作就是一直返回0xFFFFFFFF,重新linereset也不行,只能重新给目标板上电

出0入0汤圆

发表于 2016-11-6 14:37:20 | 显示全部楼层
helislayer 发表于 2016-11-6 07:22
哦,对,因为访问其他寄存器CSW.SIZE 要设置回来。恭喜。
我对比过,用程序从内部写快一倍左右,也不是特 ...

你用IO模拟的时候IO口翻转的频率最高能到多少,我用的STM32F429,系统时钟180M,IO口速度设到最高,测了下直接循环CLK_H;CLK_L;最高频率才6.5MHz,这还是在我直接操作的寄存器情况下的速度。
实际使用的时候加上数据线操作的时间,频率才2.7MHz左右

出0入0汤圆

发表于 2016-11-6 14:38:32 | 显示全部楼层
helislayer 发表于 2016-11-6 07:22
哦,对,因为访问其他寄存器CSW.SIZE 要设置回来。恭喜。
我对比过,用程序从内部写快一倍左右,也不是特 ...

是不是操作IO口翻转的时候用汇编,能再快点

出0入0汤圆

发表于 2016-11-6 15:20:50 | 显示全部楼层
改用位操做的方式翻转IO口,速度提高到了4M左右

出0入0汤圆

 楼主| 发表于 2016-11-7 11:00:22 | 显示全部楼层
zhangyh89 发表于 2016-11-6 14:37
你用IO模拟的时候IO口翻转的频率最高能到多少,我用的STM32F429,系统时钟180M,IO口速度设到最高,测了 ...

我没有用汇编指令,仅仅是优化访问寄存器的方式。
我用的不是 STM32 的 MCU 来访问 SWD, 所以不是
很直接的比较。我做到差不多 3.x M, 用的是差不多 80M
的 MCU。

不过我确认我的 GPIO 操作函数全部都 inline 了。

出0入0汤圆

发表于 2016-11-8 12:39:57 | 显示全部楼层
helislayer 发表于 2016-11-7 11:00
我没有用汇编指令,仅仅是优化访问寄存器的方式。
我用的不是 STM32 的 MCU 来访问 SWD, 所以不是
很直 ...

目标板的通用寄存器是怎么读写的呀,是不是通过DCRSR选择具体哪一个寄存器(R0~R14、PC 、MSP ),然后通过DCRDR读写。
读的时候能正常读出来,但如果写的话就会出现很诡异的情况

出0入0汤圆

 楼主| 发表于 2016-11-8 15:38:29 | 显示全部楼层
zhangyh89 发表于 2016-11-8 12:39
目标板的通用寄存器是怎么读写的呀,是不是通过DCRSR选择具体哪一个寄存器(R0~R14、PC 、MSP ),然后通过D ...

没错,就是通过 DCRSR。你写的时候是不是没有 halt CPU 啊。
如果没有的话是很有风险的。需要 halt 再写。

出0入0汤圆

发表于 2016-11-8 17:06:38 | 显示全部楼层
本帖最后由 zhangyh89 于 2016-11-8 17:07 编辑
helislayer 发表于 2016-11-8 15:38
没错,就是通过 DCRSR。你写的时候是不是没有 halt CPU 啊。
如果没有的话是很有风险的。需要 halt 再写 ...


看了下Cortex-M3权威指南解决了,异常原因是操作两个寄存器的顺序有问题
1. 确定处理器已停机
2. 往DCRSR写数据,其中位16要为0,表示这是要读数据
3. 查询,直到DHCSR.S_REGRDY=1
4. 读取DCRDR以获取寄存器的内容
寄存器写操作的顺序与上面的类似:
1. 确定处理器已停机
2. 往DCRDR中写数据
3. 往DCRSR写数据,其中位16要为1,表示这是要写数据
4. 查询,直到DHCSR.S_REGRDY=1


现在又出现个异常,我把写的一个在RAM中运行的小程序复制到了RAM中0x20000000起始处(小程序在工程设置里也设置好了起始地址,看了下反汇编,地址也都没问题),
但我设置MSP=0x20000000   PC=0x20000004后启动运行,这时候貌似是跳过startup启动文件里的SystemInit函数,直接进入main函数了,我写的延时100ms的
闪灯程序,发现实际延时有差不多1S,如果我把SystemInit放在main函数开头再执行一次的话,延时就会正常。

跳转的时候我的MSP  PC设置应该是没问题的吧

出0入0汤圆

 楼主| 发表于 2016-11-8 18:44:45 | 显示全部楼层
zhangyh89 发表于 2016-11-8 17:06
看了下Cortex-M3权威指南解决了,异常原因是操作两个寄存器的顺序有问题
1. 确定处理器已停机
2. 往DCRSR ...

恭喜你都跑起来了。

你跳过了初始化的代码,那个代码有设置时钟到比较高的主频。
如果你没有初始化就是停留在 8M 的系统时钟。我猜那个是你的
问题。

程序注入能跑起来的话就很爽了。

出0入0汤圆

发表于 2016-11-8 20:29:27 | 显示全部楼层
helislayer 发表于 2016-11-8 18:44
恭喜你都跑起来了。

你跳过了初始化的代码,那个代码有设置时钟到比较高的主频。


就是不明白为什么会跳过那段代码,又试了下把那个小程序改到正常的ROM段编译,然后直接把代码刷到flash运行,结果更改MSP PC启动后,还是这种现象,这时候我把目标重新上电,单片机就正常运行了。
难道改完MSP PC后还需要设置什么东西么

出0入0汤圆

发表于 2016-11-8 20:32:26 | 显示全部楼层
helislayer 发表于 2016-11-8 18:44
恭喜你都跑起来了。

你跳过了初始化的代码,那个代码有设置时钟到比较高的主频。

这几天看你这帖子受到不少启发,感谢感谢

出0入0汤圆

发表于 2016-11-8 21:22:49 | 显示全部楼层
犯二了,应该是吧0x20004004里的地址赋值给PC,而不是把0x20004004赋值给PC。这下可以给公司做个脱机下载器了。
再次感谢楼主的帖子

出0入0汤圆

发表于 2016-11-8 22:15:51 | 显示全部楼层
学习下,谢谢!

出0入0汤圆

 楼主| 发表于 2016-11-9 08:23:26 | 显示全部楼层
zhangyh89 发表于 2016-11-8 21:22
犯二了,应该是吧0x20004004里的地址赋值给PC,而不是把0x20004004赋值给PC。这下可以给公司做个脱机下载器 ...

恭喜恭喜。

这个是小问题你多打印一下就知道了。
我当时做这个的时候写了个单步调试的功能。
其实也很简单,就是设置单步中断的bit,
然后做个循环来 unhalt 就是了。那个帮我
调出了我的问题所在。(4K 地址循环了)

出0入0汤圆

发表于 2016-11-24 22:04:02 来自手机 | 显示全部楼层
helislayer 发表于 2016-11-9 08:23
恭喜恭喜。

这个是小问题你多打印一下就知道了。

刚有时间做了个脱离下载的板子,现在调试在目标板RAM中运行的程序时发现个很奇异的问题,不知道楼主有没有遇到过
当我在目标板RAM中运行的程序中把STM32的0x8000000地址处随意写一些数据后,然后把目标板断电,再上电后swd再次执行将RAM程序考入RAM后启动RAM程序,这时候RAM程序竟然不执行了,启动程序前读了下PC和SP MSP都是正常的

出0入0汤圆

 楼主| 发表于 2016-11-27 20:36:04 | 显示全部楼层
zhangyh89 发表于 2016-11-24 22:04
刚有时间做了个脱离下载的板子,现在调试在目标板RAM中运行的程序时发现个很奇异的问题,不知道楼主有没 ...

我没有做个这个实验。如果要调试的话,还是用单步调试。
看看开机以后那个 IP 去那里了。

出0入0汤圆

 楼主| 发表于 2017-2-9 08:57:31 | 显示全部楼层
helislayer 发表于 2016-11-5 13:54
我遇到的问题有两个。

一个是,那个访问地址的 16 在 32 位内部对齐的问题。

冒个泡,就是报告一下以前碰到那个 stm32f3 不能通过 swd reset
的问题已经解决了。问题出在 stm32f3 的 reset pin 直接焊接在一个
MCU GPIO 输出上面。我估计是通过 swd reset 的时候,swd 内部
有个下拉电路,但是因为被 MCU GPIO 锁在高位所以 reset 不成功。
验证去掉那个上拉 reset 的 GPIO 输出就可以 swd reset了。有 swd
reset 目前也不需要用到另外的 GPIO 了。

所以现在这个可以从 F0 一直刷到 F4 了。

出0入0汤圆

发表于 2017-2-9 11:49:31 | 显示全部楼层
helislayer 发表于 2016-6-23 22:59
我用 Linux 所以没有 MDK 可以用。我只用 arm gcc。
那个是通过 MDK 的 USB 接口来访问的吧。
找到一个 h ...

linux stm32 gcc有没有搭建环境的教程?

出0入0汤圆

发表于 2017-2-9 12:41:42 | 显示全部楼层
helislayer 发表于 2017-2-9 08:57
冒个泡,就是报告一下以前碰到那个 stm32f3 不能通过 swd reset
的问题已经解决了。问题出在 stm32f3 的  ...

stm32就这点好   整个系列通用  不像其他的  多少都有点区别  唉

出0入0汤圆

 楼主| 发表于 2017-2-9 12:46:22 | 显示全部楼层
sanger 发表于 2017-2-9 11:49
linux stm32 gcc有没有搭建环境的教程?

直接下载阿,不需要自己编译。
https://launchpad.net/gcc-arm-embedded

出0入0汤圆

发表于 2017-2-10 11:15:54 | 显示全部楼层
helislayer 发表于 2017-2-9 12:46
直接下载阿,不需要自己编译。
https://launchpad.net/gcc-arm-embedded

5.4_2016q3装好了,大神能不能给个简单的stm32 gcc模块工程

出0入0汤圆

 楼主| 发表于 2017-2-10 15:44:53 | 显示全部楼层
sanger 发表于 2017-2-10 11:15
5.4_2016q3装好了,大神能不能给个简单的stm32 gcc模块工程

stm32 一般都不太自己简单用,一般都要和 stlib, cubemx, libopencm3 这类的
系统库来连接。

我自己那套 Makefile 系统相对复杂一点。我给你找了个相对简单的 example。
也是网上下的。你自己看着改吧。



本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2017-2-10 15:49:55 | 显示全部楼层
boboo 发表于 2017-2-9 12:41
stm32就这点好   整个系列通用  不像其他的  多少都有点区别  唉

还是有点区别的,我的 swd 代码要识别一下 MCU, 有些外设的地址不一样。
通过一个表查找。但是代码是可以共享的。

其实我比较幸运,我是从 F0 开始的,F0 的 thumb 代码在 F4 也可以用。
但是如果从 F4 开始,用了 thumb2 代码在 F0 上就没有办法用了。
那个从 CPU 内部刷 flash 的汇编代码其实用 thumb 和 thumb2 性能没有
区别的。我就偷懒都用了 F0 的 thumb 代码。

我看好多 swd 刷机似乎针对不同 CPU 装入不同的汇编代码的。

出0入0汤圆

发表于 2017-2-10 16:09:54 | 显示全部楼层
helislayer 发表于 2017-2-10 15:49
还是有点区别的,我的 swd 代码要识别一下 MCU, 有些外设的地址不一样。
通过一个表查找。但是代码是可 ...

是的  我后来也发现这点   也就是说 segger的 Flasher 包含了所有的算法。 搞定它就基本搞定了所有

出0入0汤圆

发表于 2017-2-10 16:27:14 | 显示全部楼层
helislayer 发表于 2017-2-10 15:44
stm32 一般都不太自己简单用,一般都要和 stlib, cubemx, libopencm3 这类的
系统库来连接。

编译有报错,你看是什么问题

"/opt/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-as" -mcpu=cortex-m3 -mthumb -Wall -g -O0 -c  -o lib/src/cortexm3_macro.o lib/src/cortexm3_macro.s
/opt/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-as: unrecognized option '-O0'
<builtin>: recipe for target 'lib/src/cortexm3_macro.o' failed
make: *** [lib/src/cortexm3_macro.o] Error 1

出0入0汤圆

 楼主| 发表于 2017-2-10 21:18:02 | 显示全部楼层
本帖最后由 helislayer 于 2017-2-10 21:19 编辑
sanger 发表于 2017-2-10 16:27
编译有报错,你看是什么问题

"/opt/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-as" -mcpu=cortex- ...


我编译没有错啊。有几个 warning 但是不影响生成最后的结果。
你 arm-none-eabi-gcc 是直接执行就可以了吗?

原来 makefile 里面都没有提到 -as, 你自己改过 makefile 吗?


STM32F103VHB6_RevZ_Demo1]$ make
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o main.o main.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o stm32f10x_it.o stm32f10x_it.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_adc.o lib/src/stm32f10x_adc.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_bkp.o lib/src/stm32f10x_bkp.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_can.o lib/src/stm32f10x_can.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_dma.o lib/src/stm32f10x_dma.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_exti.o lib/src/stm32f10x_exti.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_flash.o lib/src/stm32f10x_flash.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_gpio.o lib/src/stm32f10x_gpio.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_i2c.o lib/src/stm32f10x_i2c.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_iwdg.o lib/src/stm32f10x_iwdg.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_lib.o lib/src/stm32f10x_lib.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_nvic.o lib/src/stm32f10x_nvic.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_pwr.o lib/src/stm32f10x_pwr.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_rcc.o lib/src/stm32f10x_rcc.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_rtc.o lib/src/stm32f10x_rtc.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_spi.o lib/src/stm32f10x_spi.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_systick.o lib/src/stm32f10x_systick.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_tim.o lib/src/stm32f10x_tim.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_tim1.o lib/src/stm32f10x_tim1.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_usart.o lib/src/stm32f10x_usart.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_wwdg.o lib/src/stm32f10x_wwdg.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -c  -o lib/src/cortexm3_macro.o lib/src/cortexm3_macro.s
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -g -O0 -I . -I lib/inc   -c -o lib/src/stm32f10x_vector.o lib/src/stm32f10x_vector.c
lib/src/stm32f10x_vector.c:111:3: warning: taking address of expression of type 'void'
   &_estack,            // The initial stack pointer
   ^
lib/src/stm32f10x_vector.c:174:3: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
   (unsigned short)0xF108F85F //this is a workaround for boot in RAM mode.
   ^
lib/src/stm32f10x_vector.c:174:3: note: (near initialization for 'g_pfnVectors[66]')
arm-none-eabi-ar cr lib/libstm32.a lib/src/stm32f10x_adc.o lib/src/stm32f10x_bkp.o lib/src/stm32f10x_can.o lib/src/stm32f10x_dma.o lib/src/stm32f10x_exti.o lib/src/stm32f10x_flash.o lib/src/stm32f10x_gpio.o lib/src/stm32f10x_i2c.o lib/src/stm32f10x_iwdg.o lib/src/stm32f10x_lib.o lib/src/stm32f10x_nvic.o lib/src/stm32f10x_pwr.o lib/src/stm32f10x_rcc.o lib/src/stm32f10x_rtc.o lib/src/stm32f10x_spi.o lib/src/stm32f10x_systick.o lib/src/stm32f10x_tim.o lib/src/stm32f10x_tim1.o lib/src/stm32f10x_usart.o lib/src/stm32f10x_wwdg.o lib/src/cortexm3_macro.o lib/src/stm32f10x_vector.o
arm-none-eabi-gcc -Wl,--gc-sections,-Map=main.elf.map,-cref,-u,Reset_Handler -I . -I lib/inc -L lib -T stm32.ld main.o stm32f10x_it.o lib/libstm32.a --output main.elf
arm-none-eabi-objcopy -O binary main.elf main.bin
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 09:22

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

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