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

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,很郁闷
dsjsjf 回答时间:2018-3-21 13:09:26
读出这个函数的返回值看看是什么?HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError[0]);以及这个SectorError[0]的值。可以判断一个大概错误原因。
你所操作的区域是否处于写保护状态。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版