OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5094|回复: 2

STM32G0B1RE芯片解锁FLASH时总是编程顺序和编程对齐

[复制链接]

3

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2017-7-4
在线时间
14 小时
发表于 2021-7-7 19:44:32 | 显示全部楼层 |阅读模式
10金钱
使用STM32G0B1写内部的Flash时出现问题,代码:
#pragma arm section code = "RAMCODE"
uint32_t NorFlash_Write_ttu(uint16_t operateCmd, uint32_t startAddr, uint32_t * pPageDatas, uint16_t datasLen)
{
    uint16_t writeCount = datasLen / 8; //因为datasLen传入的长度是固定1024(按byte算的),而实际写Flash是按64字节写入的,所以这里转换为uint64_t类型时的长度
    uint16_t i;
    uint8_t retry = 3;
    HAL_StatusTypeDef status = HAL_OK;
   
    // 清除Flash待处理标识
    //__HAL_FLASH_CLEAR_FLAG(HAL_FLASH_GetError());
    // 解锁Flash写
    HAL_FLASH_Unlock();
    // 检查BUSY状态
    do
    {
            status = FLASH_WaitForLastOperation(10);
            if((HAL_ERROR == status) || (--retry == 0))
            {
                //HAL_FLASH_Lock();
                return HAL_FLASH_GetError();
            }
        }while(HAL_TIMEOUT == status);
        
    // 擦除将要写入的地址页
    if(operateCmd & 0x0002) //设标志判断是否需要擦除
    {
        FLASH_PageErase(FLASH_BANK_1, (startAddr - NORFLASH_START_ADDRESS) / NORFLASH_PAGE_SIZE);
        retry = 3;
        do
        {
            status = FLASH_WaitForLastOperation(10);
            if((HAL_ERROR == status) || (--retry == 0))
            {
                //HAL_FLASH_Lock();
                return HAL_FLASH_GetError();
            }
        }while(HAL_TIMEOUT == status);
        // 注:擦除完成后控制寄存器(CR寄存器)的擦除使能位(PER位)不会自动清除,需要手动清除
        CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
    }
    // 写入数据
    for(i = 0; i < writeCount; ++i)
    {
        // 写入Flash,注意写入时是64位写入,i*2是因为pPageDatas是uint32_t类型(为了代码兼容)
        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, startAddr + i * 8, *(uint64_t *)(pPageDatas+i*2)) != HAL_OK)
        {
            //HAL_FLASH_Lock();
            return HAL_FLASH_GetError();
        }
    }
    // 加锁FLASH
    HAL_FLASH_Lock();
   
    // 判断写入结果
    return HAL_OK;
}
#pragma arm section
遇到的问题是,基于nucleo-g0b1re开发板,新建的工程实现这个写flash操作和一个串口输出log,每次起来后在HAL_FLASH_Unlock()之后,状态寄存器(SR)都会置位0x000000A0,即PGA编程对齐错误和PGSERR编程顺序错误;另外unlock()之后的FLASH_WaitForLastOperation()中清除SR寄存器语句之后,会置位成0x00040000,即CFGBSY 编程或擦除配置繁忙位置1,所以把HAL_FLASH_Lock()屏蔽了,执行这个会导致程序hard_fault
有在HAL_Init()和SystemClock_Config()处加断点查看SR寄存器,此时就已经是0x000400A0。有怀疑芯片坏了,但换芯片后仍旧有问题。

求教如何解决,或相关的代码

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-7-8 01:37:18 | 显示全部楼层
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-7-8 09:39:27 | 显示全部楼层
帮顶  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 15:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表