打印

【快乐分享】献丑之STM32F单片机IAP方法

[复制链接]
楼主: gbchang
手机看帖
扫描二维码
随时随地手机跟帖
21
果断MARK

使用特权

评论回复
22
laserpic| | 2013-8-14 09:20 | 只看该作者
没什么看懂,太多了,支持先。

使用特权

评论回复
23
hlhw1989| | 2013-8-14 19:50 | 只看该作者
都是高手啊

使用特权

评论回复
24
gbchang|  楼主 | 2013-8-15 11:02 | 只看该作者
本帖最后由 gbchang 于 2013-8-16 10:50 编辑

为了保持源汁原味,我将保留原贴,贴中和源码中的错误,作为反面教材,留着弊大于利。
本楼持续更新,贴中描述不当或源码中的问题。

1。错误,在IAP程序中,通过 DBGMCU_IDCODE 来识别芯片类型,通过小、中、大容量类型来确定 页大小。(小中容量1K/页,大和互联型2K/页)
结果,在仿真环境下,可以读,脱机后的用户模式下,读不到这个 ID 的,参《STM32F10xx8_B局限性列表(2009年2月第6版).pdf》2.3章节。期待芯片下次改版时解决此问题。
解决方法,通过 FLASH 容量确定小中大容量产品,互联型产品再通过其它特有标识来确定。

2。错误,IAP源码错误,真的献丑了:u32 *p; *(p+4)会被编译为第4个元素,而非字节地址加4。我记得以前在什么编译器下,是按字节地址加4来的。
解决方法,*( (u32*)( (u32)p + 4 ) ),这样才是p+4字节的地址。

3。改进,误入下载状态的恢复,如果用户在探索产品过程中误入下载状态,但未启动上位机升级程序,应该可以恢复原程序。
解决方法,得益于“一边一边一边”的设计,在未收到下载数据时,原程序并未擦除,所以有机会中止升级。
每次进入下载态时,下载标志减1,计次消失后,下载标志失效,此时由于用户代码仍完整,可以正常运行。

4。详细描述,读保护状态下。从 FLASH 正常启动,然后跳入 RAM 中执行,是可以进行读、擦除、编程操作的,即本文方法。
再对照闪存编程手册,仔细看那些“禁止”的描述,会发现与上面这句有点冲突,也许是翻译的不好,E文我也不**。

总结,“启动”方式是重点。就是说,芯片可能是在启动时,根据启动方式决定是否锁定 FPEC,而非在运行过程中,发现读闪存时来判断PC指针在哪里(术语描述为访问来自于哪个总线)。(废话,让咱们来设计,也不会这么笨,那还不把芯片累死啊)

5。详细描述,关于二次编程,未擦除状态下,无法编程,但写 0x0000 例外。
这句是针对主存储区说的。对信息块的选项字节等不适用,选项字节无论写什么,都要先擦除(写全0xFFFF例外,哈哈:lol)

6。改进,上位机,二进行加密程序。通过用户程序的map文件,找到编译日期/时间,硬件/固件版本在bin文件中的地址,读出来它。
供上位机的下载程序使用。前面上传的源码中,是从编译日志文件.htm里取的编译日期/时间,不很准确。
当然,这些东西的前提是在用户程序源码中要有相应的定义。

STM32F10xx8_B局限性列表(2009年2月第6版).pdf

287.34 KB

使用特权

评论回复
25
stupidboy456| | 2013-8-15 11:14 | 只看该作者
谢谢了楼主,,

使用特权

评论回复
26
lz80650904| | 2013-8-15 11:49 | 只看该作者
顶楼主,留个脚印

使用特权

评论回复
27
lanchong1980| | 2013-8-15 16:13 | 只看该作者
真复杂啊 ,,

使用特权

评论回复
28
fcuu| | 2013-8-15 20:00 | 只看该作者
感谢分享 支持!

使用特权

评论回复
29
tang221986| | 2013-8-15 21:33 | 只看该作者
必须顶

使用特权

评论回复
30
lanchong1980| | 2013-8-19 14:34 | 只看该作者
大家这么喜欢 STM32F103C8X8芯片,要是有需要其他该片子的资料,可以来易购IC来看看啊

使用特权

评论回复
31
max_v| | 2013-11-26 20:43 | 只看该作者
写的很好啊楼主

使用特权

评论回复
32
faryounger| | 2013-12-2 21:16 | 只看该作者
好东西,正准备弄这一块啊

使用特权

评论回复
33
yuangt| | 2014-1-21 19:42 | 只看该作者
我把那个IAP程序下载进去后,就再进下不进程序了,是什么问题呢?显示
flash timeout,Reset the target and try it again

使用特权

评论回复
评论
gbchang 2014-4-30 16:14 回复TA
下载后,程序会设置读保护的。再用仿真器编程时,要反复加锁解锁才能擦除信息块,解除保护。 
34
saddam| | 2014-2-26 23:33 | 只看该作者
楼主很厉害,赞一个,可惜我水平太低有一个地方看不懂,麻烦楼主给解释一下,就是从Flash跳到RAM中的实现方法,
//跳入RAM区继续执行本程序,即PC值由0x0800xxxx 变为 0x2000xxxx
__asm void JMP_RamCode_asm( void )
{  
        ADD                LR, #0x18000000
        BX                LR
}
程序跳转不是应该修改PC值吗,上面这个函数是修改LR的值,LR是连接寄存器,作用是当跳入一个子程序时,LR存储这个子程序执行完后要返回的地址。
修改LR就能跳转到RAM中去执行,这一点我不太明白,应该是有地方我没理解到位,望楼主能给解释一下。
再一个就是我用IAR编译器写的,编译时这个跳转函数报错,"Error[403]: Illegal register, 'LR' is not allowed 。貌似是不让修改这个寄存器。是不是修改这个寄存器还需要什么特殊的设置那,希望楼主指点一下。非常感谢!

使用特权

评论回复
35
lhchen922| | 2014-2-27 08:47 | 只看该作者
正在写IAP ,参考下。

使用特权

评论回复
36
香水城主| | 2014-2-27 09:37 | 只看该作者
哈哈,最最关键的是“读保护“位。

使用特权

评论回复
37
ljc16888888| | 2014-4-3 10:21 | 只看该作者
Thank you for sharing!

使用特权

评论回复
38
hnrenyongqiang| | 2014-4-4 13:32 | 只看该作者
谢谢分享

使用特权

评论回复
39
leinou| | 2014-4-28 12:28 | 只看该作者
请问楼主。。。这个BinEncrypt.exe工具在哪里的啊??我一直找不到。。。

使用特权

评论回复
40
gbchang|  楼主 | 2014-4-30 15:44 | 只看该作者
leinou 发表于 2014-4-28 12:28
请问楼主。。。这个BinEncrypt.exe工具在哪里的啊??我一直找不到。。。

在“【快乐分享】献丑之STM32F单片机IAP方法 --源码.rar”里呢,用VC6.0写的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则