请选择 进入手机版 | 继续访问电脑版

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

STM32H7B0的OTP地址0x08fff000写入不了

[复制链接]
黎辉辉15574841153 提问时间:2022-12-31 09:49 / 未解决
如题,用HAL代码和STM32CubeProgrammer都写入不成功,一直是fffffff
收藏 评论13 发布时间:2022-12-31 09:49

举报

13个回答
xmshao 回答时间:2023-1-3 10:14:38
注意OTP区域只能写一次。


另外,你做OTP写操作是否按照手册上的 写序列 进行的。


1. Unlock FLASH_OPTCR and set PG_OTP bit in the FLASH_OPTCR register.
其中,解锁FLASH_OPTCR可以通过调用库函数AL_FLASH_OB_Unlock(void)来完成。


2. Check the protection status of the target OTP word (see Table 17). The corresponding LOCKBi bit must be cleared to 0.


3. Write two OTP words (32 bits) corresponding to the 4-byte aligned address . Alternatively, the application software
can program separately the 16-bit MSB or 16-bit LSB. In this case the first 16-bit write operation starts immediately
without waiting for the second one.


4. Check that QW1 bit in FLASH_SR1 has been raised and wait until it is reset to 0.
黎辉辉15574841153 回答时间:2023-1-4 15:22:52
xmshao 发表于 2023-1-3 10:14
注意OTP区域只能写一次。

用STM32CubeProgrammer不能直接写成功吗?我试了F429就可以了
废鱼 回答时间:2023-1-4 16:23:23
从手册中描述这个空间属于一次性写入,并且不能被擦除和重写。建议仔细阅读一下相关FLASH这章(4.3.13 FLASH one-time programmable area)对于该空间的解释。正常FLASH最高的地址是0x081F FFFF


It cannot be erased and can be written only once.

黎辉辉15574841153 回答时间:2023-1-4 16:27:12
废鱼 发表于 2023-1-4 16:23
从手册中描述这个空间属于一次性写入,并且不能被擦除和重写。建议仔细阅读一下相关FLASH这章(4.3.13 FLASH ...

现在一次也没写进去,是按这个步骤来写的
废鱼 回答时间:2023-1-4 16:35:38
黎辉辉15574841153 发表于 2023-1-4 16:27
现在一次也没写进去,是按这个步骤来写的

你用的是HAL库是吗?
黎辉辉15574841153 回答时间:2023-1-4 16:43:51
废鱼 发表于 2023-1-4 16:35
你用的是HAL库是吗?

FLASH_OBProgramInitTypeDef OBInit;
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
HAL_FLASHEx_OBGetConfig( &OBInit );
OBInit.OptionType = OPTIONBYTE_OTP_LOCK;   
OBInit.OTPBlockLock = FLASH_OTP_BLOCK_0;
HAL_FLASHEx_OBProgram( &OBInit );
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_OTPWORD, FLASH_OTP_BASE, 0x12345678)== HAL_OK)
{       
        HAL_FLASH_OB_Launch();
        HAL_FLASH_OB_Lock();
        HAL_FLASH_Lock();               
}

黎辉辉15574841153 回答时间:2023-1-4 16:44:11
废鱼 发表于 2023-1-4 16:35
你用的是HAL库是吗?

是的,麻烦看一下使用是否有问题
废鱼 回答时间:2023-1-4 19:58:55
我看了一下库,我这没有板子帮忙测试。HAL_FLASH_Program的时候,第一个参数用LASH_TYPEPROGRAM_OTPWORD这个就可以写入了。你看一下你的代码是怎么操作的。其他的和普通的FLASH操作过程一样的,先解锁,再进行OTP的写入。再加锁。
黎辉辉15574841153 回答时间:2023-1-5 11:37:24
废鱼 发表于 2023-1-4 19:58
我看了一下库,我这没有板子帮忙测试。HAL_FLASH_Program的时候,第一个参数用LASH_TYPEPROGRAM_OTPWORD这 ...

麻烦看一下是这么用的吧?


FLASH_OBProgramInitTypeDef OBInit;

HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
HAL_FLASHEx_OBGetConfig( &OBInit );
OBInit.OptionType = OPTIONBYTE_OTP_LOCK;   
OBInit.OTPBlockLock = FLASH_OTP_BLOCK_0;
HAL_FLASHEx_OBProgram( &OBInit );
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_OTPWORD, FLASH_OTP_BASE, 0x12345678)== HAL_OK)
{      
        HAL_FLASH_OB_Launch();
        HAL_FLASH_OB_Lock();
        HAL_FLASH_Lock();               
}
黎辉辉15574841153 回答时间:2023-1-5 11:45:33
黎辉辉15574841153 发表于 2023-1-5 11:37
麻烦看一下是这么用的吧?

debug模式是这里会进硬中断HardFault_Handler。
#if defined (FLASH_OPTCR_PG_OTP)
    if (TypeProgram == FLASH_TYPEPROGRAM_OTPWORD)
    {
      /* Program an OTP word (16 bits) */
      *(__IO uint16_t *)FlashAddress = *(__IO uint16_t*)DataAddress;
    }

废鱼 回答时间:2023-1-5 14:32:10
黎辉辉15574841153 发表于 2023-1-5 11:45
debug模式是这里会进硬中断HardFault_Handler。
#if defined (FLASH_OPTCR_PG_OTP)
    if (TypeProgram  ...

是不是因为之前写过了报错,你换个地址是不是就正常了。
黎辉辉15574841153 回答时间:2023-1-12 14:36:52
废鱼 发表于 2023-1-5 14:32
是不是因为之前写过了报错,你换个地址是不是就正常了。

换了地址和其他板子还是没成功
Her_a 回答时间:2023-3-31 12:28:46
我也遇到了同样的问题,请问楼主是否解决了?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版