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

求助,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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版