电子产业一站式赋能平台

PCB联盟网

搜索
查看: 292|回复: 0
收起左侧

STM32F0系列中断向量映射问题

[复制链接]

452

主题

452

帖子

2714

积分

三级会员

Rank: 3Rank: 3

积分
2714
发表于 2023-1-31 08:00:00 | 显示全部楼层 |阅读模式

v1m5uvblte06402720035.jpg

v1m5uvblte06402720035.jpg

最近用Cortex-M0内核的STM32F030K6T6做个东西,需要做IAP升级,发现它的中断向量与M3、M4等内核的单片机不太一样,这里分享给大家。IAP升级需要一个BootLoader程序,一个应用程序。BootLoader程序直接烧写到flash起始地址就行,中断向量也不用改。但是应用程序需要烧写到BootLoader程序后面,且中断向量必须重新映射。M3、M4等内核的单片机,直接修改中断向量的偏移地址(VECT_TAB_OFFSET)就行。但在M0内核的库中,根本就没有这个定义。查阅相关资料发现,M0内核的中断向量需要用户自己从Flash映射到RAM中,即0x20000000地址。实际操作也很简单,在程序开始加上这两句话:
  • #define IAP_ADDR                 ((uint32_t)0x08002800)
    memcpy((void*)0x20000000,(void*)IAP_ADDR,0xB4);__HAL_SYSCFG_REMAPMEMORY_SRAM();其中0x20000000是SRAM的地址,IAP_ADDR是应用程序的起始地址,0xB4是中断向量表的大小。具体多大可以在startup.s文件里计算得到。以下以startup_stm32f030.s为例作说明:

    qqhcgsdbrcx6402720135.png

    qqhcgsdbrcx6402720135.png

    可以看到,中断向量从29行开始到75行结束(中间空2行),一共45个,每个占4字节,一共180字节,即0xB4。由于SRAM开始的180字节被用作中断向量映射了,所以用户程序就不能在使用这里了,需要在编译器中把这部分空出来,设置如下。空出大于0xB4的空间就行,这里设置的是0xC0。

    mihwbcj4uug6402720236.png

    mihwbcj4uug6402720236.png

        这样,STM32F0系列Cortex-M0内核芯片中断向量表重映射的问题就解决了。
    推荐阅读:
    【干货】STM32通过ADC模拟看门狗实现掉电保存
    单片机通过WIFI模块(ESP8266)获取网络时间与天气预报
    串口接收不定长数据的几种方法
    盘点一些国产“有特点”的单片机
    不会写Bootloader?看这里,现成的!

       欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表