打印
[STM32F0]

一个STM32F0 的IAP 应用话题

[复制链接]
1094|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shashaa|  楼主 | 2016-8-25 21:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Stm32f0系列MCU中断矢量表的定位跟STM32其它系列相比有点差异,即M0系列没有像其它M3/M4/M0+系列所具备的中断矢量表重定位寄存器,其中断矢量表不能借助矢量重定位寄存器简单修改实现。所以Stm32f0 IAP的过程会跟其它系列的STM32芯片的IAP动作有所不同。
我们知道,做IAP往往需要两部分代码,一部分是用来升级的IAP程序,一部分用来运行用户实际应用功能的应用程序APP代码。
IAP程序及自身的中断向量表放在内部FLASH的低端地址区。对于STM32 MCU而言,就是从0X0800 0000处开始放IAP代码。APP程序代码及自身中断矢量表存放在离0X0800 0000某个地址偏移量【offset】的地方,即从0x0800 0000+offset的地址开始存放APP代码及中断矢量。显然那个【offset】要大于IAP的程序空间。假设这里OFFSET为0x3000,即APP程序的起始地址为0x08003000。为了APP程序能正常相应中断,这里需要做2个步骤:
1、将APP的中断向量表拷贝到SRAM里面去。M0的中断向量表由48个有序字组成,把它们从flash区0x08003000开始的中断向量表拷贝到0x2000 0000的SRAM区。
2、做存储地址的映射,即把SRAM映射到代码执行区的地址0X00处。
整个IAP操作的大致流程如下:

经过上述操作步骤后,当APP里发生中断时,内核就从地址0x00处的向量表取相应中断的入口地址,即相当于从0x2000 0000处的向量表取中断入口地址,当然也相当于从0x08003000处的向量表取中断入口地址,然后去执行相应中断程序。
关于STM32F0的IAP,ST官方有套参考代码,即STM32F0xx_AN4065_FW_V1.0.0例程。其中关于上面提到的2个步骤的程序代码,有个地方是有点问题的。
当使用相关参考代码做完IAP后,发现APP无法响应外部中断,或者有的GPIO口能响应,有的不能;有些虽然EXTI不能响应,而TIMER/USART中断又能响应。可以说,症状有些诡异。相关代码摘录如下:
/************************************************************/
//1、做中断向量表的拷贝
for(i = 0; i < 48; i++)
{
VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
//2、存储地址的映射,即把SRAM映射到代码执行区的地址0X00处。
/* Enable the SYSCFG peripheral clock*/
RCC_APB2PeriphReset(RCC_APB2Periph_SYSCFG, ENABLE) ;
/* Remap SRAM at 0x00000000 */
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
/***************** 以下是你的应用程序代码 (略) ***************************/
问题就出在上面红色标注出来的那个函数,那个函数本意是要打开系统配置控制器【SYSCFG】的时钟,结果它执行的是对系统配置控制器时钟的复位操作,这个操作的后果是关闭了SYSCFG的时钟。这里有必要看看这个SYSCFG到底管些什么事。

沙发
xia00| | 2016-8-25 22:07 | 只看该作者
管理程序代码区起始地址重映射的操作问题也是值得注意的。

使用特权

评论回复
板凳
hfdy01| | 2016-8-25 22:08 | 只看该作者
做IAP往往需要两部分代码,一部分是用来升级的IAP程序,一部分用来运行用户实际应用功能的应用程序APP代码。

使用特权

评论回复
地板
CallReceiver| | 2016-8-25 22:13 | 只看该作者
我在做APP程序时虽然使用上述例程代码,但后来配置EXTI时已经打开了SYSCFG外设的时钟,为什么仍然不行,还得去修改那红色语句的函数代码呢?

使用特权

评论回复
5
boy1990| | 2016-8-25 22:14 | 只看该作者
CallReceiver 发表于 2016-8-25 22:13
我在做APP程序时虽然使用上述例程代码,但后来配置EXTI时已经打开了SYSCFG外设的时钟,为什么仍然不行,还 ...

尽管打开了SYSCFG的时钟,但之前的那句SYSCFG_MemoryRemapConfig( ) 还是没有实质执行呀

使用特权

评论回复
6
shashaa|  楼主 | 2016-8-25 22:23 | 只看该作者
xia00 发表于 2016-8-25 22:07
管理程序代码区起始地址重映射的操作问题也是值得注意的。

Stm32f0 IAP的过程会跟其它系列的STM32芯片的IAP动作有所不同。

使用特权

评论回复
7
sourceInsight| | 2016-8-25 22:29 | 只看该作者
代码起始执行地址重映射的事没完成,即中断矢量表的重映射就没法完成,另外,有关GPIO外部中断的操作也无**常响应。

使用特权

评论回复
8
zhuotuzi| | 2016-8-25 23:11 | 只看该作者
无非就是通过指针来实现跳转,区块保护,与擦写。

使用特权

评论回复
9
在路上的程序猿| | 2016-8-28 18:19 | 只看该作者
一直想要玩一次IAP,总是望而止步,支持下楼主。

使用特权

评论回复
10
CallReceiver| | 2016-9-6 20:14 | 只看该作者
boy1990 发表于 2016-8-25 22:14
尽管打开了SYSCFG的时钟,但之前的那句SYSCFG_MemoryRemapConfig( ) 还是没有实质执行呀 ...

恩 这点到时想的比较少了。

使用特权

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

本版积分规则

142

主题

1494

帖子

6

粉丝