您好!
我正在尝试在程序中写入闪存。 我指的是 CAN 引导加载程序示例。 我可以发现数据被编程到组1的最后一个扇区中。 但是、我发现该扇区只能编程一次。 我不能把新的项目编入这个部门。 这是我的参考代码。 是否有人可以就这个问题提供一些指导? 谢谢。
/*初始化闪存组并激活扇区*/
uint32_t fapi_Init (uint32_t ucStartBank、uint32_t ucEndBank)
{
uint32_t i;
/*SYS_CLK_FREQ 在 bl_config.h 中定义*/
如果((Fapi_initiatalizeFlashBanks ((uint32_t) SYS_CLK_FREQ)= Fapi_Status_Success)
{
对于(i = ucStartBank;i <(ucEndBank + 1);i++)
{
(空) Fapi_setActiveFlashBank ((Fapi_FlashBankType) i);
(空) Fapi_enableMainBankSectors (0xFFFF); //用于 API 2.01*/
while (fapi_check_FSM_ready_busy!= fapi_Status_FsmReady);
while (fapi_get_FSM_status!= fapi_Status_Success);//不必包含此项*/
}
G_ulBankInitialized = 1;
}
其他
{
返回(1);
}
返回(0);//成功
}
/* ulAddr 必须是一个闪存扇区的起始地址*/
uint32_t fapi_BlockErase (uint32_t ulAddr、uint32_t size)
{
uint8_t i=0、ucStartSector、ucEndSector;
uint32_t EndAddr、status;
EndAddr = ulAddr + Size;
对于(I = 0;I < NUMBEROFSECTORS;I++)
{
if (ulAddr <=(uint32_t)(flash_sector[i].start))
{
G_ucStartBank = flash_sector[i].bankNumber;
ucStartSector = i;
中断;
}
}
对于(i = ucStartSector;i < NUMBEROFSECTORS;i++)
{
if (EndAddr <=(((uint32_t) flash_sector[i].start)+ flash_sector[i].length))
{
G_ucEndBank = flash_sector[i].bankNumber;
EnducSector = i;
中断;
}
}
状态= Fapi_Init (g_ucStartBank、g_ucEndBank);
如果(status =0) //初始化成功
{
对于(i = ucStartSector;i <(ucEndSector + 1);i++){
Fapi_issue19 CommandWithAddress (Fapi_EraseSector、flash_sector[i].start);
while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
while (fapi_get_FSM_status!= fapi_Status_Success);
}
}
返回(状态);
}
//此处的组未使用。 我们根据闪存-启动- addr 计算函数中的组
uint32_t Fapi_BlockProgram (uint32_t Flash_Address、uint32_t Data_Address、uint32_t SizeInBytes)
{
寄存器 uint32_t src =数据地址;
寄存器 uint32_t dst = Flash_Address;
uint32_t 字节;
IF (SizeInBytes < 16U)
字节= SizeInBytes;
其他
字节= 16;
/*闪存组已在闪存擦除函数中初始化*/
if (g_ulBankInitialized |= 1)
{
Fapi_Init (g_ucStartBank、g_ucEndBank);
}
while (SizeInBytes >0)
{
fapi_issueProgrammingCommand ((uint32_t *) dst、
(uint8_t *) src、
(uint32_t)字节、
0、
0、
Fapi_AutoEccGeneration);
while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
while (fapi_get_FSM_status!= fapi_Status_Success);
fapi_flushPipeline();
src +=字节;
dst +=字节;
SizeInBytes --=字节;
if (SizeInBytes < 32){
字节= SizeInBytes;
}
}
返回(0);
}
空 Flash_Write_Test (空)
{
静态 uint8 seqFlashWrite = 1;
uint32 dbIdx=0;
uint32 dbCnt = FLASH_TEST_SECURE_SIZE / FLASH_WRITE_BLOCK_SIZE;
uint32 retCode = Fapi_BlockErase (flash_test_sect_sector_base_address、flash_test_sect_sect_size);
uint8 校验和[校验和_冗余_大小]={0};
uint8 u8PotStringBuf[128];
uint8数据块[flash_write_block_size];
UINT8种子=(seqFlashWrite)% FLASH_WRITE_BLOCK_SIZE;
uint8 i = 0;
//如果发生访问冲突,则返回错误。
if (retCode)
{
sprintf (u8PotStringBuf、"[失败]-[seq#%d]-闪存写入测试:16KB 擦除\r\n、seqFlashWrite);
sciDisplayText (UART_Msg、u8PotStringBuf);
#ifdef debug_on
sciDisplayText (UART_Debug、u8PotStringBuf);
#endif
seqFlashWrite++;
返回;
}
其他
{
sprintf (u8PotStringBuf、"[通过]-[SEQ#%d]-闪存写入测试:16KB 擦除\r\n、seqFlashWrite);
sciDisplayText (UART_Msg、u8PotStringBuf);
#ifdef debug_on
sciDisplayText (UART_Debug、u8PotStringBuf);
#endif
}
retCode = 0;
//生成用于闪存写入的数据
对于(I = 0;I < FLASH_WRITE_BLOCK_SIZE;I++)
dataBlock[i]= seed++;
for (i = 0;i < CHECKSUM_RELEASE_SIZE;i++)
校验和[i]= checksum8_2_apy (dataBlock、flash_write_block_size);
for (dbIdx = 0;dbIdx < dbCnt;dbIdx++)
{
//将 SEED 设置为数据块索引+执行序列号
uint32地址= FLASH_TEST_SECURE_BASE_ADDRESS + dbIdx * FLASH_WRITE_BLOCK_SIZE;
//使用数据块对闪存进行编程
retCode = Fapi_BlockProgram (address、(uint32_t)&dataBlock[0]、flash_write_block_size);
if (retCode)
{
中断;
}
}
if (retCode)
{
sprintf (u8PotStringBuf、"[失败]-[SEQ#%d]-闪存写入测试:16KB 程序\r\n、seqFlashWrite);
sciDisplayText (UART_Msg、u8PotStringBuf);
#ifdef debug_on
sciDisplayText (UART_Debug、u8PotStringBuf);
#endif
}
其他
{
uint8 i = 0;
sprintf (u8PotStringBuf、"[通过]-[SEQ#%d]-Flash 写入测试:16KB 程序。 校验和为:["、seqFlashWrite);
sciDisplayText (UART_Msg、u8PotStringBuf);
#ifdef debug_on
sciDisplayText (UART_Debug、u8PotStringBuf);
#endif
//将校验和存储到冗余数据数组中
for (i=0;<CHECKSUM_REDUNDANT_SIZE; i++)
{
FLASH_Checksum [i]=校验和[i];
sprintf (u8PotStringBuf、"0x%0x"、校验和[i]);
sciDisplayText (UART_Msg、u8PotStringBuf);
#ifdef debug_on
sciDisplayText (UART_Debug、u8PotStringBuf);
#endif
}
sciDisplayText (UART_Msg、"]\r\n");
#ifdef debug_on
sciDisplayText (UART_Debug、"]\r\n");
#endif
}
seqFlashWrite++;
}
// main.c
//初始化闪存数据以进行读取
Flash_Write_Test ();
//初始化 RAM 数据以进行读取
RAM_Write_Test ();
Flash_read_Test ();
Flash_Write_Test ();
Flash_read_Test ();
Flash_Write_Test ();
Flash_read_Test ();
while (1)
{
}
