我用c,配置如下:
boot配置
地址分配
**
* @brief 擦除FLASH对应内容
*
@note 检查包头和校验值
* @param startAddr:擦除的起始地址
* @param flashSize:要擦除的大小
* @retval 擦除结果
* SUCCEED,FAIL
*/
uint8_t erash_flash(uint32_t startAddr,uint32_t flashSize)
{
uint8_t page_num,i;
//如果擦除的地址在APP存储地址前面
if(startAddr<APP_ADDRESS)
{
return FAIL;
}
//如果擦除的地址和EEPROM地址冲突
if(startAddr+flashSize>INFOAREA_START_ADDRESS)
{
return FAIL;
}
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);
page_num=flashSize/FLASH_PAGE_SIZE;
for(i=0;i<page_num;i++)
{
if(FLASH_ErasePage(startAddr+i*FLASH_PAGE_SIZE)!=FLASH_COMPLETE)
{
break;
}
}
FLASH_Lock();
if(i==page_num)
{
return SUCCEED;
}
else
{
return FAIL;
}
}
/**
* @brief 在指定地址写书指定长度的数据
* @param addr:写入的起始地址
* @param buf:写入的数据指针
* @param length:写入数据的长度
* @note length必须为偶数,否则返回失败
* @retval 写入结果
* SUCCEED,FAIL
*/
uint16_t write_flash(uint32_t addr,uint8_t *buf,uint16_t length)
{
uint16_t data=0;
uint16_t i=0;
if(length%2)
return FAIL;
if((addr+length)>(APP_ADDRESS+APP_FLASH_SIZE))
return FAIL;
if(addr%2)
return FAIL;
FLASH_Unlock();
__disable_irq();
for(i=0;i<length/2;i++)
{
data=buf[i*2]+(buf[i*2+1]<<8);
if(FLASH_COMPLETE != FLASH_ProgramHalfWord(addr+i*2,data))
{
FLASH_Lock();
__enable_irq();
return FAIL;
}
}
FLASH_Lock();
__enable_irq();
return SUCCEED;
}
上面是相关的写,擦除函数,
校验如下:
最后程序下载成功,但是校验不通过,请高手帮看看,我哪里弄错了。
一周热门 更多>