int main(void)
{
int k;
int cnt;
unsigned int counter;
unsigned long int ncounter = 0;
unsigned char buffer[1024];
FIL fil;
static FRESULT res;
unsigned long int *p;
/* MCU 配置 */
/* 重置所有外设,初始化Flash接口和Systick. */
HAL_Init();
/* 系统时钟配置 */
SystemClock_Config();
/* 初始化所有已配置的外设 */
MX_GPIO_Init();
if(ARM_KEY_STATE == KEY_UP){
goto start;
}
LED_BLUE_ON;
//SD卡初始化
if(BSP_SD_Init() != MSD_OK){
led_trade();
}
//解锁内存,擦除扇区
HAL_FLASH_Unlock();
for(cnt = FLASH_SECTOR_2;cnt < FLASH_SECTOR_11;cnt ++){
FLASH_Erase_Sector(cnt,OB_BOR_LEVEL3);
}
LED_BLUE_OFF;
LED_RED_ON;
//f_mount
res = f_mount(&fatfs,"0:",1); //给磁盘分配盘符
if(res != RES_OK){
LED_RED_OFF;
led_trade();
}
//f_open
res = f_open(&fil,"0:/app.bin",FA_READ); //打开app.bin文件
if(res != RES_OK){
LED_RED_OFF;
led_trade();
}
//f_lseek
res = f_lseek(&fil,0); //将指针移动到第一个位置
if(res != RES_OK){
LED_RED_OFF;
led_trade();
}
//写Flash
while(ncounter < fil.fsize)
{
res = f_read(&fil,buffer,1024,&counter); //读文件
if(res != RES_OK){
LED_RED_OFF;
led_trade();
}
p = (unsigned long int *)buffer;
for(k = 0; k < counter / 4; k++)
{
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,APPLICATION_ADDRESS + ncounter,*(p + k));
ncounter += 4;
}
}
HAL_FLASH_Lock();
//ARM更新升级成功,绿色LED灯点亮
LED_BLUE_OFF;
LED_RED_OFF;
LED_GREEN_ON;
while (1)
{
}
start:
//测试用户代码是否从APPLICATION_ADDRESS被编程
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000){
//跳转至用户程序
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction) JumpAddress;
//初始化用户程序的堆栈指针
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
//跳转至应用程序
Jump_To_Application();
}else{
led_trade();
}
}
void led_trade(void)
{
//蓝绿LED灯循环点亮
while(1){
LED_GREEN_ON;
LED_BLUE_OFF;
HAL_Delay(500);
LED_GREEN_OFF;
LED_BLUE_ON;
HAL_Delay(500);
}