| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- #include "includes.h"
- #include "update.h"
- #include "Flash.h"
- typedef void (*otafun)(void); //定义一个函数类型的参数.
- otafun jump2app;
- //擦除app
- int erase_app(u8 app_num)
- {
- u32 FlashAddress = 0;
- int Size = OTA_UPDATE_APP_FLASH_SIZE;
- switch(app_num) {
- case UPDATE_ENUM_APP1:
- FlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP2:
- FlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP3:
- FlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
- break;
- default:
- return -1;
- }
- Flash_RangeErase(FlashAddress, Size);
-
- return 0;
- }
- //复制,
- int copy_app(u8 from, u8 to)
- {
- u32 FromFlashAddress = 0;
- int Size = OTA_UPDATE_APP_FLASH_SIZE;
- u32 ToFlashAddress = 0;
- u8 buffer[1024];
- switch(from) {
- case UPDATE_ENUM_APP1:
- FromFlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP2:
- FromFlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP3:
- FromFlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
- break;
- default:
- return -1;
- }
- switch(to) {
- case UPDATE_ENUM_APP1:
- ToFlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP2:
- ToFlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP3:
- ToFlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
- break;
- default:
- return -1;
- }
- Size = Flash_DatalenRead(FromFlashAddress,OTA_UPDATE_APP_FLASH_SIZE);
- while(Size > 0) {
- Flash_BufferRead(FromFlashAddress, buffer, 1024);
- Flash_BufferWrite(ToFlashAddress, (u32 *)buffer, 1024);
- FromFlashAddress += 1024;
- ToFlashAddress += 1024;
- Size -= 1024;
- }
-
- return -1;
- }
- int read_app(u8 app_num)
- {
- u32 FlashAddress = 0;
- int Size = OTA_UPDATE_APP_FLASH_SIZE;
- u8 buffer[1024];
- switch(app_num) {
- case UPDATE_ENUM_APP1:
- FlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP2:
- FlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP3:
- FlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
- break;
- default:
- return -1;
- }
- while(Size > 0) {
- Flash_BufferRead(FlashAddress, buffer, 1024);
- Size -= 1024;
- // data_dump("Flash Data READ", buffer, 1024);
- }
-
- return 0;
- }
- //复制,
- int reset_app(u8 app_num, u8 value)
- {
- u32 FlashAddress = 0;
- int Size = OTA_UPDATE_APP_FLASH_SIZE;
- u8 buffer[1024];
- memset(buffer, value, 1024);
- switch(app_num) {
- case UPDATE_ENUM_APP1:
- FlashAddress = OTA_UPDATE_APP1_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP2:
- FlashAddress = OTA_UPDATE_APP2_FLASH_START_ADDR;
- break;
- case UPDATE_ENUM_APP3:
- FlashAddress = OTA_UPDATE_APP3_FLASH_START_ADDR;
- break;
- default:
- return -1;
- }
-
- while(Size > 0) {
- Flash_BufferWrite(FlashAddress, (u32 *)buffer, 1024);
- FlashAddress += 1024;
- Size -= 1024;
- }
-
- return 0;
- }
- //设置栈顶地址
- __asm void MSR_MSP(u32 addr)
- {
- MSR MSP, r0 //set Main Stack value
- MSR PSP, r0 //set Main Stack value
- BX r14
- }
- typedef void (*usercode)(void);
- usercode EnterApp;
- ////运行app1
- //u32 run_app1(void)
- //{
- // u32 appxaddr = OTA_UPDATE_APP1_FLASH_START_ADDR;
- // if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) {//检查栈顶地址是否合法.
- // printf("appxaddr:%08x",((*(vu32*)appxaddr)&0x2FFE0000));
- //// __ASM volatile ("cpsid i");
- //// EnterApp = (usercode)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
- //// __set_PSP(*(vu32*)appxaddr);
- //// __set_CONTROL(0);
- //// __set_MSP(*(vu32*)appxaddr);
- //// EnterApp(); //跳转到APP.
- //// while(1);
- // } else {
- // printf("addr 0x%x is not legal \r\n", (*(vu32*)appxaddr));
- // }
- //
- // return 0;
- //}
- //运行app1
- uint32_t run_app1(void)
- {
- // IRQn_Type irq;
- uint32_t appxaddr=OTA_UPDATE_APP1_FLASH_START_ADDR;
-
- printf("jump to 0x%08X.\r\n",appxaddr);
-
- if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
- {
-
-
- // for (irq = SysTick_IRQn; irq <= DMA2_Channel4_5_IRQn; irq++)
- // {
- // NVIC_DisableIRQ(irq);
- // NVIC_ClearPendingIRQ(irq);
- // }
- // __disable_irq();
-
- INTX_DISABLE();
- //TIM3_Int_Deinit();
- jump2app=(otafun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
- MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
- jump2app(); //跳转到APP.
- while(1);
- }
- else
- {
- printf("栈顶地址不合法\r\n");
- }
- return 0;
- }
|