|
发表于 2022-12-15 11:53:16
|
显示全部楼层
以前做的V7 IAR下载算法,,我用的FL2,用的时候注意看门狗.在我这边是可用的.
[C] 纯文本查看 复制代码 /***********************************************************************************************
** Author : DengXiaoJun(邓小俊)
** Date : 2022-09-07 12:02:13 +0800
** Description : When I Has Time ,I Will Write Description Below:
** ModifyRecord1 :
** ModifyRecord2 :
** LastEditors : DengXiaoJun(邓小俊)
** LastEditTime : 2022-09-08 10:34:57 +0800
************************************************************************************************/
#include "BoardDrvHeader.h"
#include "flash_loader.h"
#include "flash_loader_extra.h"
extern void CoreClockInit();
#if USE_ARGC_ARGV
static const char* FlFindOption(char* option, int with_value, int argc, char const* argv[]);
#endif
//看门狗,部分脚本会在烧录时候打开看门狗
__no_init IWDG_HandleTypeDef IWDG1Handle;
//Flash初始化
#if USE_ARGC_ARGV
uint32_t FlashInit(void *base_of_flash, uint32_t image_size,uint32_t link_address, uint32_t flags,int argc, char const *argv[])
#else
uint32_t FlashInit(void *base_of_flash, uint32_t image_size,uint32_t link_address, uint32_t flags)
#endif /* USE_ARGC_ARGV */
{
/* Check if hardware IWDG1 is enabled */
if (0 == (FLASH->OPTSR_CUR & FLASH_OPTSR_IWDG1_SW))
{
IWDG1Handle.Instance = IWDG1;
/* IWDG1 is already initialized by the flashloader macro script */
}
else
{
IWDG1Handle.Instance = 0;
}
__iar_data_init3(); // Required to initialize .bss
//系统初始化
SystemInit();
//时钟初始化
CoreClockInit();
//延时初始化
CoreDelayInit();
//MPU初始化
MCU_MPU_ConfigInit();
//Cache使能
MCU_MPU_CacheEnable();
//串口初始化
MCU_UART1_Init(115200,MCU_UART_LENGTH_8B,MCU_UART_STOPBIT1,MCU_UART_CHECK_MODE_NONE,
MCU_UART_HARD_CONTROL_NONE);
uint8_t ret = 0;
//初始化
ret = BoardW25Q256JV_Init();
if(ret != 0)
{
//串口数据打印
MCU_UART1_Printf("FlashInit BoardW25Q256JV_Init Failed\r\n");
strcpy(ERROR_MESSAGE_BUFFER, "BoardW25Q256JV_Init Failed");
return RESULT_ERROR_WITH_MSG;
}
//FLASH检查
ret = BoardW25Q256JV_Check();
if(ret != 0)
{
//串口数据打印
MCU_UART1_Printf("FlashInit BoardW25Q256JV_Check Failed\r\n");
strcpy(ERROR_MESSAGE_BUFFER, "BoardW25Q256JV_Check Failed");
return RESULT_ERROR_WITH_MSG;
}
return RESULT_OK;
}
//Flash写入
uint32_t FlashWrite(void *block_start,uint32_t offset_into_block,uint32_t count,char const *buffer)
{
uint32_t size = 0;
/* Set destination address */
uint32_t dest = (uint32_t)block_start + offset_into_block;
/* Set source address */
uint8_t * src = (uint8_t*)buffer;
uint32_t result;
/* Feed the watchdogs */
if (IWDG1Handle.Instance) HAL_IWDG_Refresh(&IWDG1Handle);
while(size < count)
{
/* Write one page */
result = BoardW25Q256JV_WriteNoCheck(src,dest, W25Q256JV_PAGE_SIZE);
if(result != 0)
{
//串口数据打印
MCU_UART1_Printf("FlashWrite,BoardW25Q256JV_WriteNoCheck Failed,Addr: 0X%08X,Length: %d\r\n",dest,W25Q256JV_PAGE_SIZE);
strcpy(ERROR_MESSAGE_BUFFER, "BoardW25Q256JV_WriteBufferSafe Failed");
return RESULT_ERROR_WITH_MSG;
}
size += W25Q256JV_PAGE_SIZE;
dest += W25Q256JV_PAGE_SIZE;
src += W25Q256JV_PAGE_SIZE;
}
return RESULT_OK;
}
//Flash擦除
uint32_t FlashErase(void *block_start,uint32_t block_size)
{
uint32_t result;
/* Feed the watchdogs */
if (IWDG1Handle.Instance) HAL_IWDG_Refresh(&IWDG1Handle);
uint32_t addr = (uint32_t)block_start;
//执行擦除
result = BoardW25Q256JV_EraseSector((uint32_t)(addr/W25Q256JV_SECTOR_SIZE));
if(result != 0)
{
//串口数据打印
MCU_UART1_Printf("FlashErase,BoardW25Q256JV_EraseSector Failed,Addr: 0X%08X,BlockSize: %d\r\n",addr,block_size);
strcpy(ERROR_MESSAGE_BUFFER, "BoardW25Q256JV_EraseSector Failed");
return RESULT_ERROR_WITH_MSG;
}
return RESULT_OK;
}
/** private functions **/
#if USE_ARGC_ARGV
/** private functions **/
static const char* FlFindOption(char* option, int with_value, int argc, char const* argv[])
{
int i;
for (i = 0; i < argc; i++)
{
if (strcmp(option, argv[i]) == 0)
{
if (with_value)
{
if (i + 1 < argc)
return argv[i + 1]; // The next argument is the value.
else
return 0; // The option was found but there is no value to return.
}
else
{
return argv[i]; // Return the flag argument itself just to get a non-zero pointer.
}
}
}
return 0;
}
#endif
//
//#if CODE_ADDR_AS_VOID_PTR
//uint32_t FlashChecksum(void const *begin, uint32_t count)
//#else
//uint32_t FlashChecksum(uint32_t begin, uint32_t count)
//#endif
//{
// uint32_t startAddr = (uint32_t)begin;
// /* Feed the watchdogs */
// if (IWDG1Handle.Instance) HAL_IWDG_Refresh(&IWDG1Handle);
// //开启内存映射模式
// BoardW25Q256JV_MemoryMapped();
// //串口数据打印
// MCU_UART1_Printf("FlashChecksum,Addr: 0X%08X,Length: %d\r\n",startAddr,count);
// //计算CRC
// uint32_t crcResult = Crc16((uint8_t const*)startAddr,count);
// return crcResult;
//} |
|