你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l151 在线FLASH擦除,烧写出错,请帮忙看下,谢谢

[复制链接]
cityrip 提问时间:2017-12-29 10:47 /
我想做个stm32l151在线升级的程序,用的是STM32CubeMX生成的库函数,在进入主程序之前,我进行的FLASH的擦除,烧写,都正常,但是进入主循环后,在收到串口发送的数据后,再对其进行FLASH的擦除,烧写,就不正常了,首先是擦除,它会返回错误,我再读取数据,发现没有檫掉,强行写,也不对。
void EraseFlash(void)
{
static FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t SectorError[1];
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[0])!= HAL_OK)
{
  //while(1);
}
HAL_FLASH_Lock();
Flash_EEPROM_Read(APPSAVE_FLASH_ADR, &temp[0], 500);
}


oid WrtieFlash(uint32_t  startAddress, uint32_t  WordCnt, uint32_t  *Data)
{
uint32_t SectorError[1],i = 0,DataValue, endAddress;
HAL_FLASH_Unlock();
endAddress = startAddress + 4*WordCnt;
DataValue = Data[i++];
while (startAddress < endAddress)
  {
  if (HAL_FLASH_Program(TYPEPROGRAM_WORD, startAddress, DataValue) == HAL_OK)
    {
      startAddress = startAddress + 4;
   DataValue = Data[i++];
    }
  }
HAL_FLASH_Lock();
}

请帮我分析下,谢谢大侠们

收藏 1 评论6 发布时间:2017-12-29 10:47

举报

6个回答
cityrip 回答时间:2017-12-29 10:55:15
         EraseFlash();
        WrtieFlash(APPSAVE_FLASH_ADR, 130, &flash_buffer[0]);
        Flash_EEPROM_Read(APPSAVE_FLASH_ADR, &temp[0], 500);
这是我在进入主循环前的操作,是正常的,

if(Varialbe.FlashDataLen > 0)
{
        for(i = 0; i <(Varialbe.FlashDataLen/4); i++)
        {
        flash_buffer[i] = (uint32_t)Varialbe.FlashBuffer[i+0] + (uint32_t)(Varialbe.FlashBuffer[i+1]<<8) +  (uint32_t)(Varialbe.FlashBuffer[i+2]<<16) + (uint32_t)(Varialbe.FlashBuffer[i+3]<<24);
        }
        EraseFlash();
        WrtieFlash(APPSAVE_FLASH_ADR, i, &flash_buffer[0]);
        Varialbe.FlashDataLen = 0;
}
cityrip 回答时间:2017-12-29 10:57:12
cityrip 发表于 2017-12-29 10:55
EraseFlash();
        WrtieFlash(APPSAVE_FLASH_ADR, 130, &flash_buffer[0]);
        Flash_EEPROM_Read(APP ...

上面的是进入主循环后执行的,当收到串口的数据后,再对其进行擦除,写,就不对了,
maxtch 回答时间:2017-12-29 15:23:16
1 Cube 里面开了调试口了没?如果没开……
2 调试口复位线接了没?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

cityrip 回答时间:2018-1-2 16:17:17
1。在SYS--〉debug--> Serial Wire
里已经选了啊,

2。调试口复位线没接,只用了4根线,VCC,SWCLK, SWDIO, GND

是可以正常的仿真和烧写程序,但是就像我上面说的那样,在主循环里不能正常的擦除,烧写FLASH,很郁闷
埃斯提爱慕 回答时间:2018-3-21 13:09:26
提示: 作者被禁止或删除 内容自动屏蔽
lixinle072 回答时间:2018-6-19 11:21:37
本帖最后由 lixinle072 于 2018-6-19 11:23 编辑
dsjsjf 发表于 2018-3-21 13:09
读出这个函数的返回值看看是什么?HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError[0]);以及这个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;
}

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版