打印
[STM32L0]

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

[复制链接]
5185|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的手册 ...

如果你的数据地址是连续的  直接按照页写的方式就行了  数据区域就是个字节流嘛

使用特权

评论回复
5
songchenping|  楼主 | 2015-7-4 14:39 | 只看该作者
myxiaonia 发表于 2015-7-4 14:24
如果你的数据地址是连续的  直接按照页写的方式就行了  数据区域就是个字节流嘛 ...

是连续的。
换句话说,我就是想在从地址空间中划出一块地址,分别存放从0到16383数据(32k byte)。现在就是在想地址累加是+2还是+4啊?
我还得再写段函数试验一下。

使用特权

评论回复
6
myxiaonia| | 2015-7-6 09:20 | 只看该作者
songchenping 发表于 2015-7-4 14:39
是连续的。
换句话说,我就是想在从地址空间中划出一块地址,分别存放从0到16383数据(32k byte)。现在 ...

这个st应该提供了库函数的。。。如果是自己写闪存编程函数集,按你说就是可以按字编程,当然是地址+4了

使用特权

评论回复
7
diweo| | 2015-7-6 10:47 | 只看该作者
本帖最后由 diweo 于 2015-7-6 11:04 编辑

按照手册,确实不能一次写16位。我还以为和F1系列一样呢。

使用特权

评论回复
8
songchenping|  楼主 | 2015-7-6 11:14 | 只看该作者
diweo 发表于 2015-7-6 10:47
按照手册,确实不能一次写16位。我还以为和F1系列一样呢。

是的。我已经用代码测试过了。不能写入16位,地址必须按32位累加。

使用特权

评论回复
9
amanda_s| | 2015-7-6 11:25 | 只看该作者
手册里写的只能按word或者half-page进行写操作呢。

使用特权

评论回复
10
songchenping|  楼主 | 2015-7-6 12:22 | 只看该作者
amanda_s 发表于 2015-7-6 11:25
手册里写的只能按word或者half-page进行写操作呢。

是的。已经测试i过了。

使用特权

评论回复
11
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)

使用特权

评论回复
12
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.

使用特权

评论回复
13
xiaogui46| | 2015-10-29 10:35 | 只看该作者
songchenping 发表于 2015-10-28 18:12
已经解决了。写入必须32bit。可以读取16bit.

我也遇到这个问题,本来以为可以8位16位都可以操作呢,捣鼓了一天,差点儿哭了

使用特权

评论回复
14
309030106| | 2015-10-29 20:45 | 只看该作者
应该不能写入16位,地址是按32位累加的

使用特权

评论回复
15
hjwal| | 2016-4-13 16:02 | 只看该作者
手册不都写了,写必须字,读 字节、半字、字都支持。

使用特权

评论回复
16
山狼啸月| | 2016-9-2 10:09 | 只看该作者
擦除有没有page以外的方法啊?比如word half_word byte

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

317

主题

11997

帖子

78

粉丝