[求助]STM32F030C8T6 BootLoader 烧录完APP后校验不对

2019-07-20 23:25发布

我用c,配置如下:
boot配置 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;
}

上面是相关的写,擦除函数,
校验如下:
2.png 3.png
最后程序下载成功,但是校验不通过,请高手帮看看,我哪里弄错了。
5.png

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。