[STM32L0] STM32L051可以向内部FLASH一次写入16-bit的数据吗?

[复制链接]
5988|15
 楼主| songchenping 发表于 2015-7-3 17:15 | 显示全部楼层 |阅读模式
如题。能否在一个32位地址开始连续写入若干个16位的数据。
void FlashHalfWord16Prog(uint32_t flash_addr, uint16_t data)
{   
  /* (1) Perform the data write (32-bit word) at the desired address */
  /* (2) Wait until the BSY bit is reset in the FLASH_SR register */
  /* (3) Check the EOP flag in the FLASH_SR register */
  /* (4) clear it by software by writing it at 1 */
  *(__IO uint32_t*)(flash_addr) = data; /* (1) */
  while ((FLASH->SR & FLASH_SR_BSY) != 0) /* (2) */
  {
    /* For robust implementation, add here time-out management */
  }  
  if ((FLASH->SR & FLASH_SR_EOP) != 0)  /* (3) */
  {
    FLASH->SR |= FLASH_SR_EOP; /* (4) */
  }
}

mmuuss586 发表于 2015-7-3 19:28 | 显示全部楼层
自己写段函数,地址累加,写数据就可以了;
 楼主| songchenping 发表于 2015-7-4 14:03 | 显示全部楼层
mmuuss586 发表于 2015-7-3 19:28
自己写段函数,地址累加,写数据就可以了;

因为我们的数据是16-bit的(共16384个数据),想存入到内部flash的固定地址中。
但是我看STM32L051的手册中提及了写入只能按32-bit写入。如果是这样的话我每次必须先将2个数据合并(通过左移)。再写入。
而且我也写了一段函数试验了一下。看是否可以写入16-bit数据。
第一次写入: 地址0x0800fff0, 数据0x1234;
第二次写入: 地址0x0800fff2, 数据0x1234;
执行后,第一次正常。在相应地址空间可以看到数据,执行第二次时,进入hardfault.
相反,我将第二次写入改成: 地址0x0800fff4, 执行时写入正常,可以看到相应数据。
所以,我就以此来判断每次地址累加必须为32-bit数据。
myxiaonia 发表于 2015-7-4 14:24 | 显示全部楼层
songchenping 发表于 2015-7-4 14:03
因为我们的数据是16-bit的(共16384个数据),想存入到内部flash的固定地址中。
但是我看STM32L051的手册 ...

如果你的数据地址是连续的  直接按照页写的方式就行了  数据区域就是个字节流嘛
 楼主| songchenping 发表于 2015-7-4 14:39 | 显示全部楼层
myxiaonia 发表于 2015-7-4 14:24
如果你的数据地址是连续的  直接按照页写的方式就行了  数据区域就是个字节流嘛 ...

是连续的。
换句话说,我就是想在从地址空间中划出一块地址,分别存放从0到16383数据(32k byte)。现在就是在想地址累加是+2还是+4啊?
我还得再写段函数试验一下。
myxiaonia 发表于 2015-7-6 09:20 | 显示全部楼层
songchenping 发表于 2015-7-4 14:39
是连续的。
换句话说,我就是想在从地址空间中划出一块地址,分别存放从0到16383数据(32k byte)。现在 ...

这个st应该提供了库函数的。。。如果是自己写闪存编程函数集,按你说就是可以按字编程,当然是地址+4了
diweo 发表于 2015-7-6 10:47 | 显示全部楼层
本帖最后由 diweo 于 2015-7-6 11:04 编辑

按照手册,确实不能一次写16位。我还以为和F1系列一样呢。
 楼主| songchenping 发表于 2015-7-6 11:14 | 显示全部楼层
diweo 发表于 2015-7-6 10:47
按照手册,确实不能一次写16位。我还以为和F1系列一样呢。

是的。我已经用代码测试过了。不能写入16位,地址必须按32位累加。
amanda_s 发表于 2015-7-6 11:25 | 显示全部楼层
手册里写的只能按word或者half-page进行写操作呢。
 楼主| songchenping 发表于 2015-7-6 12:22 | 显示全部楼层
amanda_s 发表于 2015-7-6 11:25
手册里写的只能按word或者half-page进行写操作呢。

是的。已经测试i过了。
xiaogui46 发表于 2015-10-28 17:42 | 显示全部楼层
Read interface organized by word, half-word or byte in every area
• Programming in the Flash memory performed by word or half-page
• Programming in the Option bytes area performed by word
• Programming in the data EEPROM performed by word, half-word or byte
• Erase operation performed by page (in Flash memory, data EEPROM and Option
bytes)
 楼主| songchenping 发表于 2015-10-28 18:12 | 显示全部楼层
本帖最后由 songchenping 于 2015-10-28 18:14 编辑
xiaogui46 发表于 2015-10-28 17:42
Read interface organized by word, half-word or byte in every area
• Programming in the Flash memory ...

已经解决了。写入必须32bit。可以读取16bit.
xiaogui46 发表于 2015-10-29 10:35 | 显示全部楼层
songchenping 发表于 2015-10-28 18:12
已经解决了。写入必须32bit。可以读取16bit.

我也遇到这个问题,本来以为可以8位16位都可以操作呢,捣鼓了一天,差点儿哭了
309030106 发表于 2015-10-29 20:45 | 显示全部楼层
应该不能写入16位,地址是按32位累加的
hjwal 发表于 2016-4-13 16:02 | 显示全部楼层
手册不都写了,写必须字,读 字节、半字、字都支持。
山狼啸月 发表于 2016-9-2 10:09 | 显示全部楼层
擦除有没有page以外的方法啊?比如word half_word byte
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:技术合作可以通过以下方式: QQ:745995275 非技术合作恕不回复。

318

主题

12007

帖子

80

粉丝
快速回复 在线客服 返回列表 返回顶部