1.5wuling_zhuanjietou/UDS/bootloader.c

191 lines
3.4 KiB
C
Raw Normal View History

2024-10-17 01:06:51 +00:00
#include "bootloader.h"
#if BOOTLOADER_CODE_FLAG
#include "stm32f10x_flash.h"
const uint8_t BootloaderSwVersion[] = BOOTLOADER_SOFTWARE_VERSION;
#endif
uint8_t updataflag = false;
uint8_t Checksum(uint32_t address, uint32_t length)
{
//uint32_t checksum = 0;
return 1;
}
typedef void (*pFunction)(void);
static pFunction Jump_To_Application;
static uint32_t JumpAddress = 0;
void BootloaderInit(void)
{
}
void JumpToApplicationSW(void)
{
#if BOOTLOADER_CODE_FLAG
__disable_irq();//<2F><>ȫ<EFBFBD><C8AB><EFBFBD>ж<EFBFBD>
if (IsExternProgrammingRequestValid()) {
updataflag = true;
ClearExternProgrammingRequest();
} else if (((*(__IO uint32_t *)APP_FlashBaseAddress) & 0x2FFE0000) == MCU_RAM_StartAddress) {
SetBootloaderSwVersionAddress();
JumpAddress = *(__IO uint32_t *)(APP_FlashBaseAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t *) APP_FlashBaseAddress);
Jump_To_Application();
}
__enable_irq();
#endif
}
#if BOOTLOADER_CODE_FLAG
void RAMFLASHInit(void)
{
}
status_t EraseApplicationSoftwareCode(uint32_t address, uint32_t length)
{
status_t ret = STATUS_SUCCESS;
uint32_t page_address = 0;
if (address % FMC_PAGE_SIZE) {
return STATUS_ERROR;
}
FLASH_Unlock();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>־λ */
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
page_address = address;
while(page_address < address+length)
{
if(FLASH_COMPLETE != FLASH_ErasePage(page_address))
{
ret = STATUS_ERROR;
break;
}
page_address += FMC_PAGE_SIZE;
}
FLASH_Lock();
return ret;
}
status_t ProgramApplicationSoftware(uint32_t address, uint8_t *pdata, uint32_t length)
{
status_t ret = STATUS_SUCCESS;
uint32_t program_address = 0;
FLASH_Unlock();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>־λ */
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
/* Program Flash Bank1 */
program_address = address;
while(program_address < (address + length))
{
FLASH_ProgramWord(program_address, *(uint32_t *)pdata);
if (*(uint32_t*)program_address != *(uint32_t*)pdata)
{
ret = STATUS_ERROR; // <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
break;
}
program_address += 4;
pdata += 4;
}
FLASH_Lock();
return ret;
}
#endif
uint8_t GetUdsUpdataFlag(void)
{
if (updataflag) {
updataflag = 0;
return 1;
}
return 0;
}
void ClearExternProgrammingRequest(void)
{
BKP->DR39 = 0x00;
BKP->DR40 = 0x00;
}
void SetExternProgrammingRequest(void)
{
BKP->DR39 = (uint16_t)(BOOTLOADER_PROGRAMMING_FLAG >> 0);
BKP->DR40 = (uint16_t)(BOOTLOADER_PROGRAMMING_FLAG >> 16);
}
bool IsExternProgrammingRequestValid(void)
{
bool status = false;
uint32_t flag;
flag = BKP->DR40;
flag = (flag << 16) | BKP->DR39;
if (flag == BOOTLOADER_PROGRAMMING_FLAG) {
status = true;
}
return status;
}
#if BOOTLOADER_CODE_FLAG
void SetBootloaderSwVersionAddress(void)
{
BKP->DR41 = (uint16_t)((uint32_t)BootloaderSwVersion >> 0);
BKP->DR42 = (uint16_t)((uint32_t)BootloaderSwVersion >> 16);
}
#endif
uint32_t GetBootloaderSwVersionAddress(void)
{
static uint32_t bl_sw_addr;
bl_sw_addr = BKP->DR42;
bl_sw_addr = (bl_sw_addr << 16) | BKP->DR41;
return bl_sw_addr;
}