引导加载程序是存储在内部引导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被归为大容量产品。
用户377235 2012-10-28 22:53