新手上路
- 积分
- 27
- 金钱
- 27
- 注册时间
- 2012-7-17
- 在线时间
- 0 小时
|
第一个区域用来放引导程序,第二个区域用来放IAP更新程序,第三个区域用来执行用户程序
第一个区域0x08000000-0x08003000
第二个区域0x08003000-0x08013305
第三个区域0x08013360-0x0801 FFFF
第一、第二个区都可以到了第三写数据的时老是跑到 硬件错误发生的中断处理函数 这是为什么啊
#include "common.h"
#include "stm32f10x_flash.h"
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
/* 变量声明 -----------------------------------------------------------------*/
uint8_t file_name[FILE_NAME_LENGTH];
//用户程序Flash偏移
uint32_t FlashDestination = ApplicationAddress;
uint32_t Flash2 = Address;
uint32_t ENDAddress = 0x0801FFFF;
uint16_t PageSize = PAGE_SIZE;
uint32_t EraseCounter = 0x0;
uint32_t Erase_Counter = 0x0;
uint32_t NbrOfPage = 0, Add = 0x00;
uint32_t NbrO_fPage = 0;
FLASH_Status FLASHStatus = FLASH_COMPLETE;
uint32_t RamSource;
extern uint8_t tab_1024[1024];
uint32_t dat=0x00021212;
uint32_t dat1;
volatile TestStatus MemoryProgramStatus;
void flsh_dat(void)
{ //int32_t i;
NbrO_fPage= ( ENDAddress - Flash2) / PAGE_SIZE;
for(Erase_Counter = 0x0800a87f; (Erase_Counter < NbrO_fPage) && (FLASHStatus == FLASH_COMPLETE); Erase_Counter++)
{
FLASHStatus = FLASH_ErasePage(Flash2 + (PAGE_SIZE * EraseCounter));
}
dat1 = *(__IO uint32_t*)Address;
Flash2 = Address;
while((Flash2< ENDAddress) && (FLASHStatus == FLASH_COMPLETE))
{
if(dat1==0xffffffff)
{
FLASH_Unlock();
FLASH_ProgramWord(Flash2, dat);
FLASH_Lock();
}
Flash2= Flash2 + 4;
}
Flash2 = Address;
while((Flash2 < ENDAddress) && (MemoryProgramStatus != FAILED))
{
if((*(vu32*) Flash2) != dat)
{
MemoryProgramStatus = FAILED;
}
Flash2 += 4;
}
} |
|