stm32l151 在线FLASH擦除,烧写出错,请帮忙看下,谢谢
我想做个stm32l151在线升级的程序,用的是STM32CubeMX生成的库函数,在进入主程序之前,我进行的FLASH的擦除,烧写,都正常,但是进入主循环后,在收到串口发送的数据后,再对其进行FLASH的擦除,烧写,就不正常了,首先是擦除,它会返回错误,我再读取数据,发现没有檫掉,强行写,也不对。void EraseFlash(void)
{
static FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t SectorError;
HAL_FLASH_Unlock();
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct .PageAddress =APPSAVE_FLASH_ADR ;
HAL_Delay(5);
EraseInitStruct.NbPages = 2 ;
if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError)!= HAL_OK)
{
//while(1);
}
HAL_FLASH_Lock();
Flash_EEPROM_Read(APPSAVE_FLASH_ADR, &temp, 500);
}
oid WrtieFlash(uint32_tstartAddress, uint32_tWordCnt, uint32_t*Data)
{
uint32_t SectorError,i = 0,DataValue, endAddress;
HAL_FLASH_Unlock();
endAddress = startAddress + 4*WordCnt;
DataValue = Data;
while (startAddress < endAddress)
{
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, startAddress, DataValue) == HAL_OK)
{
startAddress = startAddress + 4;
DataValue = Data;
}
}
HAL_FLASH_Lock();
}
请帮我分析下,谢谢大侠们
EraseFlash();
WrtieFlash(APPSAVE_FLASH_ADR, 130, &flash_buffer);
Flash_EEPROM_Read(APPSAVE_FLASH_ADR, &temp, 500);
这是我在进入主循环前的操作,是正常的,
if(Varialbe.FlashDataLen > 0)
{
for(i = 0; i <(Varialbe.FlashDataLen/4); i++)
{
flash_buffer = (uint32_t)Varialbe.FlashBuffer + (uint32_t)(Varialbe.FlashBuffer<<8) +(uint32_t)(Varialbe.FlashBuffer<<16) + (uint32_t)(Varialbe.FlashBuffer<<24);
}
EraseFlash();
WrtieFlash(APPSAVE_FLASH_ADR, i, &flash_buffer);
Varialbe.FlashDataLen = 0;
} cityrip 发表于 2017-12-29 10:55
EraseFlash();
WrtieFlash(APPSAVE_FLASH_ADR, 130, &flash_buffer);
Flash_EEPROM_Read(APP ...
上面的是进入主循环后执行的,当收到串口的数据后,再对其进行擦除,写,就不对了, 1 Cube 里面开了调试口了没?如果没开……
2 调试口复位线接了没? 1。在SYS--〉debug--> Serial Wire
里已经选了啊,
2。调试口复位线没接,只用了4根线,VCC,SWCLK, SWDIO, GND
是可以正常的仿真和烧写程序,但是就像我上面说的那样,在主循环里不能正常的擦除,烧写FLASH,很郁闷
读出这个函数的返回值看看是什么?HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);以及这个SectorError的值。可以判断一个大概错误原因。
你所操作的区域是否处于写保护状态。 本帖最后由 lixinle072 于 2018-6-19 11:23 编辑
dsjsjf 发表于 2018-3-21 13:09
读出这个函数的返回值看看是什么?HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError);以及这个Sector ...
你好,我的也是擦除就失败。错误代码是FLASH_ERROR_PROGRAM,以下是我擦除的函数,麻烦帮我看看是什么问题。擦除的地址是0x0801FC00;用的是4.0的库STM32_USB-FS-Device_Lib_V4.0.0
uint8_t flashErasePage(uint32_t addr) {
uint8_t status = 1;
if (addr < FLASH_BASE || (addr >= (FLASH_BASE + 1024 * FLASH_SIZE))) return 1;//非法地址
//确保是页地址
addr = addr & 0xFFFFFF00;
FLASH_Unlock();
status = FLASH_ErasePage(addr);
if (status == FLASH_COMPLETE) {
status = 0;
}
FLASH_Lock();
return status;
}
页:
[1]