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

STM32F030 IAP升级完美解决  

[复制链接]
时光虫子 发布时间:2016-5-17 11:17
/***************
IAP程序跳转APP程序
#define APPLICATION_ADDRESS     (uint32_t)0x08003000
typedef  void (*pFunction)(void);

把用户程序写入FLASH地址后执行以下代码
//跳转APP //
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();   

6.png
编译器默认
***************/



/**************
APP程序
#define  APPLICATION_ADDRESS    ((uint32_t)0x08004400)
void IAP_Set(void)
{
   uint32_t i = 0;
/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  
  /* Copy the vector table from the Flash (mapped at the base of the application
     load address 0x08003000) to the base address of the SRAM at 0x20000000. */      
  for(i = 0; i < 48; i++)
  {
    *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
  /* Enable the SYSCFG peripheral clock*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Remap SRAM at 0x00000000 */
  SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

}
7.png
**************/
收藏 14 评论51 发布时间:2016-5-17 11:17

举报

51个回答
ssssss 回答时间:2018-8-24 16:54:07
本帖最后由 wwwheihei 于 2018-8-24 17:22 编辑
时光虫子 发表于 2018-8-24 13:30
这个问题我没有办法一两句话给你解释清楚,M0的中断向量表由48个有序字组是32bit 48x4 = 192,十六进制0x ...

对是的,这些我也懂,但是map文件里面_Vectors_Size                           0x000000b4   Number         0  startup_stm32f030.o ABSOLUTE
    __Vectors                                0x08002000   Data           4  startup_stm32f030.o(RESET)
    __Vectors_End                            0x080020b4   Data           0  startup_stm32f030.o(RESET)
应该和型号也有关系吧,是不是按map文件_Vectors_Size    大小来判断更准确呢?


你看看你map文件里面是多少?
ssssss 回答时间:2018-8-24 08:36:44
本帖最后由 wwwheihei 于 2018-8-24 08:38 编辑
时光虫子 发表于 2018-8-23 11:15
跳转要这么久,不可以把,正常1秒左右,一分钟你仿真看一下执行那个位置的代码要这么久 ...

我搞错了 不好意思大神,我想问一下stm32f030 iap中配置ram起始地址为ox200000c0是怎么算出来的?
但是我在map里面查看却不是c0
__Vectors_Size                           0x000000b4   Number         0  startup_stm32f030.o ABSOLUTE
    __Vectors                                0x08002000   Data           4  startup_stm32f030.o(RESET)
    __Vectors_End                            0x080020b4   Data           0  startup_stm32f030.o(RESET)
xmshao 回答时间:2016-5-23 21:33:22
按照楼主说的应该差不多了。
注意在APP开始地方放那一段代码:
uint32_t i = 0;
/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  
   /* Copy the vector table from the Flash (mapped at the base of the application
      load address 0x08003000) to the base address of the SRAM at 0x20000000. */      
   for(i = 0; i < 48; i++)
   {
     *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
   /* Enable the SYSCFG peripheral clock*/
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Remap SRAM at 0x00000000 */
   SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

一个STM32F0 的IAP 应用话题
c_lass 回答时间:2016-5-20 09:57:21
楼主你好,可以共享一下你的bootload代码看看么,或者是你的参考资料
c_lass 回答时间:2016-5-23 19:42:21
楼主你好,我根据技术手册写的bootload,应用程序能跑起来,但是一进中断程序就死了,请问你有没有相关的经验指点下呢
时光虫子 回答时间:2016-5-24 21:23:10
c_lass 发表于 2016-5-20 09:57
楼主你好,可以共享一下你的bootload代码看看么,或者是你的参考资料

我是用官方的IAP,我明天去公司上传分享
时光虫子 回答时间:2016-5-25 09:20:45
链接:https://pan.baidu.com/s/1nv8dAwp 密码:fc25

IAP升级DEMO

点评

赞!  发表于 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
我也把我的IAP程序贡献出来给大家参考:我的bootload是上电五秒内检查是否有串口数据发送,有就更新应用程 ...

我当时搞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
我的问题解决了,就是没有在SRAM这里设置起始地址为0x200000c0,楼主给力

呵呵呵
1234下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版