原创 STM32 IAP

2011-5-4 10:11 7466 7 8 分类: 模拟

引导加载程序是存储在内部引导ROM存储器(系统内存),其主要任务是通过下载应用程序到内部FLASH通过USART1的通信接口.

从系统内存启动bootloader然后通过USART1接口外设下载应用程序并编程到用户flash区
那么,怎么启动这个bootloader呢?看下面:

BOOT1     BOOT0

X                     0                  用户FLASH做为引导空间
0                     1                  系统内存做为引导空间
1                     1                  嵌入式SRAM做为引导空间

说的很清楚,当boot1=0 boot0=1的时候从系统存储区启动,也就是启动bootloader,当启动后就可以通过ST的一个官方工具,或者其他的辅助工具烧写代码进flash了

下面来看看stm32的内存映射


 

这只是部分截图,stm32存储系统采用统一编址的方式,程序存储器、数据存储器、寄存器被组织在4 GB的线性地址空间内  启动时CPU从地址0处读取代码并执行,在0x1FFFF000-0x1FFFF7FF这段系统存储器,这个地方是不允许用户操作的,因为这里存放的就是ST所谓的bootloader程序,就是ISP,在ourdev上有个帖子,帖子名字不记得了,只记得内容这样说:让stm32挥刀自宫,正常运行的时候通过指令让cpu复位,通过外部电路让两个启动引脚boot1=0 boot0=1,这样就会执行isp程序,这固然是个好办法,可是这里还有个更好的办法,既然程序执行时按照循序的,且能修改PC指针,那么我们可不可以直接修改PC指针到系统存储区呢?
经过验证,此法可行,下面是部分代码(代码未经严格验证,使用后果自负):
#define SystemAddress    0x1FFFF000
pFunction Jump_To_Application;
uint32_t JumpAddress;
  

{
  JumpAddress = *(__IO uint32_t*) ( SystemAddress + 4);
  Jump_To_Application = (pFunction) JumpAddress;
  /* Initialize Stack Pointer */
  __set_MSP(*(__IO uint32_t*) SystemAddress);
  Jump_To_Application();
}
还有一点需要提醒,当在你的程序中开启了看门狗的话就会有问题,因为当跳到system memory后控制权全在内置的isp程序了,你就没有办法喂狗了,就会引起芯片的复位。。。

 IAP驱动必须编程到FLASH内存基址通过JTAG接口,通过用户选

择的工具链。此驱动用USART下载一个二进制文件通一个超级终

端到STM32F内部FLASH并执行它。

IAP驱动说明
IAP驱动包含以下源文件的设置
1.main.c: UART初始化和RCC配置.然后从common.c执行主菜单。
2.common.c: 包含显示功能和主菜单程序。主菜单给出了一系列的操作:加载二进制文件,执行载入的二进制文件,禁止用户载入自己二进制文件页的写保护。

3.ymodem.c and download.c: 他们是用来接收从超级终端来的数据(使用YMODEM协议)然后将它们加入到STM32F10xxx’s内部RAM,当接收发生故障时,将会显示“Failed to receive the file”的错误

如果接收成功时它会被编程到适当的内部FLASH地址,会比较内部SRAM和FLASH之间的数据来检测完整性,如果有任何数据的差异,显示错误信息"Verificatior failed",其它情况如镜像文件大于内存空间和用户中断也会被显示。
4.STM32F10xxx固件库。

platform_config.h :指定设备(高密度,中密度)
  //#define USE_STM3210B_EVAL
  //#define USE_STM3210E_EVAL

用户应用程序的位置地址是定义在common.h中的文件为:#定

义ApplicationAddress 0x8002000,更改默认值所需的一个。

用户编程条件
IAP必须编程在FLASH地址0X0800 0000处,用户应用程序必须在

0X0800 2000处开始的,用户应用程序中断矢量表必须位于地址
0x8002000。
SysTick产生时基等于1MS

STM32F103x4和STM32F103x6被归为小容量产品,STM32F103x8和STM32F103xB被归
为中等容量产品,STM32F103xC、STM32F103xD和STM32F103xE被归为大容量产品。 
 

 
小容量和大容量产品是中等容量产品(STM32F103x8/B)的延伸,分别在对应的数据手册中介绍:
STM32F103x4/6数据手册和STM32F103xC/D/E数据手册。小容量产品具有较小的闪存存储器、 RAM
空间和较少的定时器和外设。而大容量的产品则具有较大的闪存存储器、RAM空间和更多的片上外
设,如SDIO、FSMC、I2S和DAC等,同时保持与其它同系列的产品兼容。
STM32F103x4、STM32F103x6、 STM32F103xC、STM32F103xD和STM32F103xE可直接替换中
等容量的STM32F103x8/B产品,为用户在产品开发中尝试使用不同的存储容量提供了更大的自由
度。
同时, STM32F103xx增强型产品与现有的STM32F101xx基本型和STM32F102xx USB基本型产品全
兼容。
 
 
中断向量表偏移:NVIC_SetVectorTable
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-10-28 22:53

请问在iap中加看门狗怎么实现呢?有没有好的建议?谢谢
相关推荐阅读
用户1314788 2012-02-03 15:20
评论:@jjldc(九九)的电子博客 博客中提到的“转一篇比较详细介绍FatFs文件系统移植的文章”
11...
用户1314788 2011-04-11 09:31
基于AVR单片机队列的UART通信模块
对于堆栈来说,插入、删除操作是固定在一端进行的,这一端称为“栈顶”,另一端称为“栈底”。 堆栈指针(Stack  Pointer)用于指示栈顶位置(地址),在有些单片机中,堆栈指针可以通过程序去设置。...
用户1314788 2011-04-08 11:03
assert_param STM32的固件库 使用须知
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义...
用户1314788 2011-03-30 16:50
单片机的非OS的事件驱动思考1
很多单片机项目恐怕都是没有操作系统的前后台结构,就是main函数里用while无限循环各种任务,中断处理紧急任务。这种结构最简单,上手很容易,可是当项目比较大时,这种结构就不那么适合了,编写代码前你...
用户1314788 2011-03-24 14:41
C
要从逻辑上删除一段C代码,更好的办法是用#if指令。 #if  0   statements#endif int *a;*a = 12;  //我们声明了这个指针变量,但从未对它进行过初始化,所以我们...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条