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

STM32F0系列中断向量映射问题

[复制链接]
STMCU小助手 发布时间:2023-2-2 17:00
最近用Cortex-M0内核的STM32F030K6T6做个东西,需要做IAP升级,发现它的中断向量与M3、M4等内核的单片机不太一样,这里分享给大家。

9 j7 Q$ u9 j$ e4 ~! E
IAP升级需要一个BootLoader程序,一个应用程序。BootLoader程序直接烧写到flash起始地址就行,中断向量也不用改。但是应用程序需要烧写到BootLoader程序后面,且中断向量必须重新映射。4 o: g; B5 Y5 a: F: _/ ]
M3、M4等内核的单片机,直接修改中断向量的偏移地址(VECT_TAB_OFFSET)就行。但在M0内核的库中,根本就没有这个定义。查阅相关资料发现,M0内核的中断向量需要用户自己从Flash映射到RAM中,即0x20000000地址。4 R" f, d8 x$ K2 S+ ^2 r% R( s; C
实际操作也很简单,在程序开始加上这两句话:
  1. #define IAP_ADDR                 ((uint32_t)0x08002800)
    3 e. ]. O* x: P

  2. 8 }- L( D- P! |0 G
  3. memcpy((void*)0x20000000,(void*)IAP_ADDR,0xB4);
    8 ~) b+ T+ Z( N) ~5 a- W* `
  4. __HAL_SYSCFG_REMAPMEMORY_SRAM();
复制代码

" u, a" x5 p4 ]& @; ]1 r& c/ x, ?/ ?* }5 A: w, l9 y, G
其中0x20000000是SRAM的地址,IAP_ADDR是应用程序的起始地址,0xB4是中断向量表的大小。具体多大可以在startup.s文件里计算得到。以下以startup_stm32f030.s为例作说明:1 r$ _, {& j$ u- X) g, e9 [

, i8 ^; P3 q- U! T; E
微信图片_20230202170038.png
* p$ v5 G5 D, r3 {3 ?4 {* I( J' ^9 B3 F
可以看到,中断向量从29行开始到75行结束(中间空2行),一共45个,每个占4字节,一共180字节,即0xB4。3 N" |: U# w% v. ?
3 j+ X+ m2 o7 L& s: y# [% h
由于SRAM开始的180字节被用作中断向量映射了,所以用户程序就不能在使用这里了,需要在编译器中把这部分空出来,设置如下。空出大于0xB4的空间就行,这里设置的是0xC0。# i: d( N) X7 w4 C

& a; H! ^" ^6 j) g1 H* `6 w
微信图片_20230202170041.png
& N- I2 `, P' t1 t8 ?$ U8 e: n% q7 @* c+ \
    这样,STM32F0系列Cortex-M0内核芯片中断向量表重映射的问题就解决了。
) F$ O# Q  ^+ ?4 \
# _% J" |- N% [3 j
来源:嵌入式技术开发' l( O, \5 t* Q6 `8 k! V
+ `# Z; g$ y* P% {- t! K: W7 A0 H
& R: J; s; p6 f( X- E. g

& }/ y, s; n: T6 f
收藏 评论0 发布时间:2023-2-2 17:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版