如题,有一个项目的stm32的bootloader出现了问题,芯片使用stm32f103cbt6程序第一次可以正常升级,但一旦app文件发生改变,便无法升级。根据已知条件可知,第一次可正常升级,APP程序发生改变便无法升级。说明数据从上位机到板子这个过程的通讯是没有问题的,那就是数据在写入flash的过程中出现了问题。
在程序中将flash强制写0XFF,之后使用j-link将flash中的数据读出发现:
0x400位置的数据非0xff,猜测擦除flash出现问题。
通过观察擦除函数:
if(Internal_Flash_AddrPageOffset(addr) == true)
{
if(Internal_Flash_Erase_Page(addr) == false)
{
//goto end;
flasherr_cnt++;
}
}
Internal_Flash_AddrPageOffset函数原型如下:
bool Internal_Flash_AddrPageOffset(uint32 addr)
{
if(addr < INTERNAL_FLASH_START_ADDR || addr > INTERNAL_FLASH_END_ADDR)
{
return false;
}
if((addr - INTERNAL_FLASH_START_ADDR) % PAGE_SIZE == 0) //整除页大小,返回true
{
return true;
}
return false;
}
bool Internal_Flash_Erase_Page(uint32 pageaddr)
{
bool ret = false;
__disable_irq();
//必须关中断
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPTERR | FLASH_FLAG_WRPRTERR |
FLASH_FLAG_PGERR );
if(FLASH_ErasePage(pageaddr) == FLASH_COMPLETE)
{
ret = true;
}
else
{
ret = false;
}
FLASH_Lock();
__enable_irq();
return ret;
}
程序很简单,如果能整除页大小,则执行擦除操作。
但是为什么前1K的数据能擦除,后1K数据没有擦除?
猜测cbt6页大小为1K。
修改页大小
/* 定义存储器页的个数,大小及表示页大小所需的位数 */
#define PAGE_NUMS 128
#define PAGE_SIZE 1024 //2048
#define PAGE_SIZE_BITS 11
问题的以解决,之后查询官方手册后发现。
中等容量stm32页大小为1K.