你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030 IAP升级完美解决  

[复制链接]
时光虫子 发布时间:2016-5-17 11:17
/***************( D0 h/ }! {2 U$ f6 N0 u7 G
IAP程序跳转APP程序# o+ r: ^: e4 i' K
#define APPLICATION_ADDRESS     (uint32_t)0x080030007 R2 b* t! _" ]- I/ p
typedef  void (*pFunction)(void);; E# r$ u* M2 C7 e
' v, U" ?$ x5 y
把用户程序写入FLASH地址后执行以下代码
  A, G0 F% t' ]4 F0 m( |4 N//跳转APP //9 Q! C$ s  g5 c, `( v/ _
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);: s0 u6 `2 F* ]2 ?( H
Jump_To_Application = (pFunction) JumpAddress;, Q. b5 T7 o! r% |& G# f; J) A
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);% L# M' K& H+ s5 p
Jump_To_Application();   - v/ r% c' y# _. v" h

3 s. l5 J' V6 a 6.png + A/ A$ V: ]# {* @, t5 f: L* R
编译器默认
$ e" ^. k8 V& A$ p% ]. E% G***************/- M) _3 ^3 F+ f4 @' r+ d! z
( W) a/ r7 d1 F

5 K( ~* j* c: O9 B: ]
5 V9 e; W! f7 M8 i6 ~. R/**************6 r9 n; H' I3 s" b  {: G; Y! L
APP程序. J$ [% c) U; N3 G1 s. D
#define  APPLICATION_ADDRESS    ((uint32_t)0x08004400)- t( g; G: O0 }9 K+ ]
void IAP_Set(void)
: v2 ~3 j7 F; O{& |* \+ J3 ?8 y/ u8 Q: d7 `) v! C
   uint32_t i = 0;
4 t, t9 ?7 x$ A3 _( q9 ]2 }; Y4 g/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  
+ n! c6 O$ _& |" u# z  /* Copy the vector table from the Flash (mapped at the base of the application" c  R3 W* Z2 E1 P& ^
     load address 0x08003000) to the base address of the SRAM at 0x20000000. */      
" U' k" h$ M/ L' e6 w, H: \  for(i = 0; i < 48; i++)
& N& _, d& A$ H" ^& [  {
4 p7 e) B/ T" V3 F7 E4 r    *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));  y3 K- w$ o7 ]2 |5 ?
}; n4 w1 I3 E( d# T& G
  /* Enable the SYSCFG peripheral clock*/
9 k! c. ~5 L: U/ h' c/ s  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 0 b4 k: \% [: f# A4 k; w- Y3 |

! ]; w# T: a$ m, J& h /* Remap SRAM at 0x00000000 */
; q2 j, b# v) ~  SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
, S; ?- s; X! B% Y/ N; i2 x: A % f4 i* M* |4 \+ k- o
}
% b( _; m8 O9 r7 o& F 7.png
  q* t; \6 t0 Z5 R, N**************/
/ |3 ?  k+ T% }& W3 l# r
赞 收藏 14 评论51 发布时间:2016-5-17 11:17

举报

51个回答
ssssss 回答时间:2018-8-24 16:54:07
本帖最后由 wwwheihei 于 2018-8-24 17:22 编辑 2 Y( ~7 S9 E. Q# N
时光虫子 发表于 2018-8-24 13:30, a7 g+ N) `' G0 t( y
这个问题我没有办法一两句话给你解释清楚,M0的中断向量表由48个有序字组是32bit 48x4 = 192,十六进制0x ...
/ V8 A1 N! x+ o; a. @" C
对是的,这些我也懂,但是map文件里面_Vectors_Size                           0x000000b4   Number         0  startup_stm32f030.o ABSOLUTE1 v% V7 U- b! T9 N
    __Vectors                                0x08002000   Data           4  startup_stm32f030.o(RESET)9 @$ {; ^& O- y' }
    __Vectors_End                            0x080020b4   Data           0  startup_stm32f030.o(RESET)
; }& Q8 G2 J0 }# n( }0 w应该和型号也有关系吧,是不是按map文件_Vectors_Size    大小来判断更准确呢?
# d3 Z5 Y' Q* R% \7 u0 E+ ~+ o) [5 r& |
7 j" T. K9 k0 c  D5 Q; x& _6 Z% p( q
你看看你map文件里面是多少?, Q: g1 o9 @( t" a" x6 A
ssssss 回答时间:2018-8-24 08:36:44
本帖最后由 wwwheihei 于 2018-8-24 08:38 编辑 , y! H+ _# W0 B" B- z
时光虫子 发表于 2018-8-23 11:15' `' ]/ D+ U3 b' G5 J
跳转要这么久,不可以把,正常1秒左右,一分钟你仿真看一下执行那个位置的代码要这么久 ...
/ X9 n) Y+ U+ N5 q5 ^% @
我搞错了 不好意思大神,我想问一下stm32f030 iap中配置ram起始地址为ox200000c0是怎么算出来的?
% `" N  r* Z, c' B% y但是我在map里面查看却不是c0- S* {2 f0 W$ L. f$ w
__Vectors_Size                           0x000000b4   Number         0  startup_stm32f030.o ABSOLUTE
; D3 X0 b+ F# @    __Vectors                                0x08002000   Data           4  startup_stm32f030.o(RESET)* f; s0 \" A! L# f5 Z
    __Vectors_End                            0x080020b4   Data           0  startup_stm32f030.o(RESET)
) R$ g: v1 H% r7 y
xmshao 回答时间:2016-5-23 21:33:22
按照楼主说的应该差不多了。
$ W/ ~5 s' c  Y$ U/ N$ S0 R注意在APP开始地方放那一段代码:
2 N- A/ S) v: w: z" Suint32_t i = 0;4 g5 z0 f7 b6 q
/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  # S- U1 I1 `3 f: C3 n& ]
   /* Copy the vector table from the Flash (mapped at the base of the application
- j' g" \6 i3 s. A0 ~: [8 S: I      load address 0x08003000) to the base address of the SRAM at 0x20000000. */      
- O6 O8 D; \) F& D9 |* E* t# a  q   for(i = 0; i < 48; i++)
1 x7 L6 D! H( f3 G8 i- o" m   {# E) a* S+ E  h' n% k
     *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
1 f/ t0 F- q0 V' J& Z }
$ C7 F- ^4 @+ x9 y* \0 O   /* Enable the SYSCFG peripheral clock*/
7 A8 D; k% s5 }6 z2 ]& m   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 7 y& O/ L3 y1 Z3 Y, o6 K3 R6 [0 y

6 c. Q# y9 [; l; T. a2 P /* Remap SRAM at 0x00000000 */$ x8 y5 e; g2 ^
   SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);# K6 u/ r  K- l& n' J
# _& W* Q8 p) {" [& U. ^* q
一个STM32F0 的IAP 应用话题
c_lass 回答时间:2016-5-20 09:57:21
楼主你好,可以共享一下你的bootload代码看看么,或者是你的参考资料
c_lass 回答时间:2016-5-23 19:42:21
楼主你好,我根据技术手册写的bootload,应用程序能跑起来,但是一进中断程序就死了,请问你有没有相关的经验指点下呢
' w/ j5 N, C+ F# w2 \: ?
时光虫子 回答时间:2016-5-24 21:23:10
c_lass 发表于 2016-5-20 09:57; @! P- y4 J2 w0 w
楼主你好,可以共享一下你的bootload代码看看么,或者是你的参考资料

! z* \. A! U6 \5 I) S7 W我是用官方的IAP,我明天去公司上传分享
时光虫子 回答时间:2016-5-25 09:20:45
链接:https://pan.baidu.com/s/1nv8dAwp 密码:fc25* d+ d- T0 M( K9 u5 O5 j7 R4 Y
8 _* X5 Q. j" [; {- v; `. ?3 h
IAP升级DEMO
$ e2 ?" L/ _1 X' d4 {2 Y

点评

赞!  发表于 2018-11-21 15:28
c_lass 回答时间:2016-5-25 11:41:06
楼主你好,我参考技术手册,那你的iap  和原子的iap对比,发现M0内核的芯片SCB寄存器组里没有中断向量表偏移寄存器,不能设置中断向量表偏移,,然后我写的BOOTLOAD 下进去,APP程序不进中断就能运行下去,一旦进了中断,PC就跳不回来了,程序死了,,,,  我根据你的代码,在app程序一开始就把存储在FLASH的app程序前48*4个字节复制到SRAM,把SRAM重映射到0x0000000, 应用程序没反应,好多问题啊,,,
c_lass 回答时间:2016-5-25 11:50:26
好像发现问题了,你app程序的SRAM起始地址是0x200000c0,0X20000000-0X200000BF是存储中断向量表,然后映射到0x00000000 里去吧,0x200000c0之后的空间作为应用程序的堆栈吧
c_lass 回答时间:2016-5-25 12:41:03
我的问题解决了,就是没有在SRAM这里设置起始地址为0x200000c0,楼主给力
c_lass 回答时间:2016-5-25 19:02:06
我也把我的IAP程序贡献出来给大家参考:我的bootload是上电五秒内检查是否有串口数据发送,有就更新应用程序,没有就闪烁LED  PB0 PB1,应用程序是闪烁LED PF7,如果usart发送0x05 那么PB0 PB1 也一起闪烁。应用程序要注意不能大于4K (我设置前4Ksram给bootload用)Bootload不能大于8K(自己在程序中定义的),Flash烧录这部分还有较大的优化空间,半字编程的时候要注意大小端,
时光虫子 回答时间:2016-6-1 13:53:13
c_lass 发表于 2016-5-25 19:02
0 S- n) ~3 ~: w' _" v& G. m$ _我也把我的IAP程序贡献出来给大家参考:我的bootload是上电五秒内检查是否有串口数据发送,有就更新应用程 ...
! M2 P6 P9 S& D/ H
我当时搞IAP也是费了点周折,最后还是搞定,谢谢分享!
zhao.zhao 回答时间:2017-2-9 10:29:07
楼主真是个好人哪,顶一下是必须的
zbber 回答时间:2017-2-9 17:39:41
我的问题解决了,就是没有在SRAM这里设置起始地址为0x200000c0,楼主给力
时光虫子 回答时间:2017-5-15 10:12:14
zbber 发表于 2017-2-9 17:39& O1 I& B+ P9 s9 H/ B# d' ^
我的问题解决了,就是没有在SRAM这里设置起始地址为0x200000c0,楼主给力
7 l6 C0 j  `, \5 u4 H8 L
呵呵呵
1234下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版