[经验] 探索STM32的OTP

cl17726   2017-5-22 21:09 楼主
这是一个几乎没人探索的地方啊.就是STM32的OTP.而且OTP是不支持擦除,支持按BIT编程,区别于FLASH. OTP = One-time programmable bytes 但是实际上也不是1一次性的,只能从1写成0,不能从0写成1.每个bit都是独立的.编程OTP也很简单,但是暂时好像不能通过HAL库什么的.
  1. #define FLASH_PSIZE_BYTE ((uint32_t)0x00000000U)
  2. #define CR_PSIZE_MASK ((uint32_t)0xFFFFFCFFU)
  3. void OTP_Test(void)
  4. {
  5. /* Unlock Flash */
  6. FLASH->KEYR = 0x45670123U;
  7. FLASH->KEYR = 0xCDEF89ABU;
  8. /* If the previous operation is completed, proceed to program the new data */
  9. FLASH->CR &= CR_PSIZE_MASK;
  10. FLASH->CR |= FLASH_PSIZE_BYTE;
  11. FLASH->CR |= FLASH_CR_PG;
  12. *(__IO uint8_t *)0x1FF0F000 = 0xFF;
  13. /* Data synchronous Barrier (DSB) Just after the write operation
  14. This will force the CPU to respect the sequence of instruction (no optimization).*/
  15. __DSB();
  16. /* Lock Flash */
  17. FLASH->CR |= FLASH_CR_LOCK;
  18. }
比如以上程序就是写0x1FF0F000到0xFF,等于没写哈,因为我之前已经操作过OTP了,所以第一第二个Byte就不能操作了. 微信截图_20170522210436.png 比如我现在给第二字节写0xEF,如图.就是BIT4为0. 微信截图_20170522210436.png 确实编程为0xEF了. 微信截图_20170522210436.png 如果他真的只能编程一次,那么我现在写成F7应该是不行的吧.验证. 微信截图_20170522210436.png 变成了0xE7,既不是F7也不是EF. 微信截图_20170522210436.png 看计算器结果. 微信截图_20170522210436.png 每一BIT独立OTP,只能为写0不能写1! 本帖最后由 cl17726 于 2017-5-23 09:15 编辑

回复评论 (25)

只能从1写成0,不能从0写成1,这个是flash特性吧
training
点赞  2017-5-22 22:13
这有啥用?编程一次就没了
点赞  2017-5-22 22:27
引用: 白丁 发表于 2017-5-22 22:13
只能从1写成0,不能从0写成1,这个是flash特性吧

这是OTP,不支持擦除
点赞  2017-5-23 08:57
引用: dql2016 发表于 2017-5-22 22:27
这有啥用?编程一次就没了

OTP,可以写MAC,序列号什么的.
点赞  2017-5-23 08:57
引用: cl17726 发表于 2017-5-23 08:57
这是OTP,不支持擦除

你看看flash特性吧,flash擦除之后全是1,写1等于没写,只能写0,写之前必须先擦除
training
点赞  2017-5-23 09:11
引用: 白丁 发表于 2017-5-23 09:11
你看看flash特性吧,flash擦除之后全是1,写1等于没写,只能写0,写之前必须先擦除

这个是不支持擦除,跟FLASH相反,FLASH编程1byte后该byte不给编程了,除非擦除,这个编程该byte后还能继续编程,因为每一bit独立.
点赞  2017-5-23 09:14
引用: 白丁 发表于 2017-5-23 09:11
你看看flash特性吧,flash擦除之后全是1,写1等于没写,只能写0,写之前必须先擦除

举例说明先给flash写0x55,再写0xaa,结果为0x55,因为0xaa被忽略,如果给otp写0x55再写0xaa,结果0x00,因为每bit都被写0了,可以自己试验试试,我前几天试过了.
点赞  2017-5-23 09:18
这个好像我记得只能写一次,然后不能擦除的吧。。。。、
点赞  2017-5-23 09:41
引用: huaiqiao 发表于 2017-5-23 09:41
这个好像我记得只能写一次,然后不能擦除的吧。。。。、

不能擦,可以继续写没为0的bit
点赞  2017-5-23 09:46
引用: cl17726 发表于 2017-5-23 09:46
不能擦,可以继续写没为0的bit

你的意思是,可以在原来的基础上,写不是0的bit位?
点赞  2017-5-23 09:48
引用: huaiqiao 发表于 2017-5-23 09:48 你的意思是,可以在原来的基础上,写不是0的bit位?
是的,具体来说ST还带个LOCK熔丝,如果写了LOCK后,不管是1还是0,都从此固定了.因为我已经没剩下的OTP扇区就没演示了 可以做个开机自动减次数,拿64个bit出来,然后设备开机64次后就让东西报废,是不是很机智. 本帖最后由 cl17726 于 2017-5-23 10:16 编辑
点赞  2017-5-23 10:14
引用: cl17726 发表于 2017-5-23 10:14
是的,具体来说ST还带个LOCK熔丝,如果写了LOCK后,不管是1还是0,都从此固定了.因为我已经没剩下的OTP扇区就 ...

对对,这样也是一种方法。

不过,是否还可以比如用在项目上,检测仿真器引脚。如果有人坏心思想通过仿真器读flash的数据。
是不是也可以用OTP来做个卡关。不过说实话,我们也用32,但是还是没有这么用过。O(∩_∩)O哈哈~
点赞  2017-5-23 10:55
这个还真没研究过  
点赞  2017-5-23 11:16
引用: huaiqiao 发表于 2017-5-23 10:55
对对,这样也是一种方法。

不过,是否还可以比如用在项目上,检测仿真器引脚。如果有人坏心思想通过仿 ...

高端后面才有OTP,貌似
点赞  2017-5-23 11:23
引用: cl17726 发表于 2017-5-23 11:23
高端后面才有OTP,貌似

我印象中都有,F1的也有的。我记得我之前看过它的用户手册中flash相关章节的。还有flash编程手册
点赞  2017-5-23 11:25
引用: huaiqiao 发表于 2017-5-23 11:25
我印象中都有,F1的也有的。我记得我之前看过它的用户手册中flash相关章节的。还有flash编程手册

没有,只有flash和op byte,F7和F4部分有.
点赞  2017-5-23 11:26
引用: cl17726 发表于 2017-5-23 11:26
没有,只有flash和op byte,F7和F4部分有.

我回去看看,我现在f0,f1,f4的,细节上有点混淆了。O(∩_∩)O哈哈~
点赞  2017-5-23 11:29
引用: huaiqiao 发表于 2017-5-23 11:29
我回去看看,我现在f0,f1,f4的,细节上有点混淆了。O(∩_∩)O哈哈~

OTP的实际应用场合我还说不准,如果说MAC地址什么用唯一序列号不就可以了...
点赞  2017-5-23 12:45
引用: cl17726 发表于 2017-5-23 12:45
OTP的实际应用场合我还说不准,如果说MAC地址什么用唯一序列号不就可以了...

嗯嗯,后面真有时间的话,我研究下哈。
点赞  2017-5-23 14:27
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复