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

求助,stm32L151 cubemx写内部FLASH不正常

[复制链接]
cityrip 提问时间:2018-8-2 17:35 /
    HAL_StatusTypeDef statu;
    FLASH_EraseInitTypeDef f;
    uint32_t  Address=0x08010000;
    uint32_t  data=0x12345678;
    uint32_t PageError = 0;//set page error

    HAL_FLASH_Unlock();//解锁
  
    //erase flash
   f.TypeErase = FLASH_TYPEERASE_PAGES;
   f.PageAddress = Address;
    f.NbPages = 1;
    HAL_FLASHEx_Erase(&f, &PageError);
  HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, data);

    HAL_FLASH_Lock();//锁

这个程序放在初始化里,是可以写成功的,如果放在主循环或者是外部触发的情况去写,就不成功,请大侠们帮我看看,是怎么回事?还是其它的设置不对?谢谢!!
收藏 评论9 发布时间:2018-8-2 17:35

举报

9个回答
feixiang20 回答时间:2018-8-2 22:02:45
看看循环里是不是有改变了初始化参数的现象

评分

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

查看全部评分

toofree 回答时间:2018-8-3 00:05:35
看上去没毛病呀!
主程序中用中断了吗?
听说开了中断后,在擦写Flash时,可能会出有意想不到问题。只是听说,没找到根据

评分

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

查看全部评分

奏奏奏 回答时间:2018-8-3 07:24:47
楼主要尝试去读取HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, data)这个函数的返回值是什么,靠这个进一步去判断。

评分

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

查看全部评分

wudianjun2001 回答时间:2018-8-3 08:50:14
程序看不出啥问题,单步调试能通过吗

评分

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

查看全部评分

cityrip 回答时间:2018-8-3 09:53:35
谢谢各位的帮助
zhao.zhao 回答时间:2018-8-3 10:02:11
// 在某页面地址中写一个页面的数据,按字(uint32_t)写入
HAL_StatusTypeDef  Flash_Write_aPage_Words(uint32_t pageaddr, uint32_t *words)
{
    uint32_t                i, addrbuf, page_no, page_start_addr;
    uint32_t                PageError = 0;
    FLASH_EraseInitTypeDef  EraseInitStruct;
    HAL_StatusTypeDef       retvalue;
     
    page_no          = pageaddr / FLASH_PAGE_SIZE;   // 计算该地址处于哪个页面
    page_start_addr  = page_no  * FLASH_PAGE_SIZE;   // 页面开始地址,按字节计算
   
    HAL_FLASH_Unlock();
   
    // 擦除该页面
    /* Fill EraseInit structure*/
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.PageAddress = page_start_addr;
    EraseInitStruct.NbPages     = 1;
    PageError = 0;
    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
    {
        retvalue = HAL_ERROR;      // 页面擦除失败 ,退出
    }
    else
    {   // 页面擦除成功,写入该页面的数据     
        retvalue = HAL_OK;
        addrbuf  = page_start_addr;
        for(i=0;i<FLASH_PAGE_SIZE_IN_WORD;i++)          // 一个页面按字节算为64个单元
        {
            if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addrbuf, words[i]) == HAL_OK)
            {
                addrbuf += 4;
            }
            else
            {
                retvalue = HAL_ERROR;
                i        = FLASH_PAGE_SIZE_IN_WORD;
            }
        }
    }

    HAL_FLASH_Lock();
   
    return  retvalue;
}

评分

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

查看全部评分

cityrip 回答时间:2018-8-3 10:07:55
初始化的时候没有问题,在没有进入主循环之前我尝试多次进行读写,都没问题,但是一旦进入主循环,就不行了,在各位大牛的帮助提示下,发现是擦除出现问题了,FLASH_FLAG_WRPERR,提示为写保护标志出错,我所有中断都关掉,还是会出现这个问题,干脆忽略这个错误,强行擦除,又正常,
status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE);
cityrip 回答时间:2018-8-3 10:09:02
应该是哪儿没有配置对?
butterflyspring 回答时间:2018-8-3 16:51:32
说明你的flash有在被操作.其实最大可能就是systick.flash是独占式的,如果timeout,那就是有可能被占了,建议调试看看

评分

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

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版