打印

有关STM32F10xxx闪存编程的一个疑问

[复制链接]
4170|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
john_light|  楼主 | 2009-1-21 15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在文档
http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM32F10xxx_Flash_Programming_Manual_Rev4.pdf
第6页,有这样的叙述:
“在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
进行闪存编程操作时(写或擦除),必须打开内部的RC振荡器(HSI)。
闪存存储器可以用ICP或IAP方式编程。”


抛开错别字“既”不讨论。

上面提到的“不能进行代码或数据的读取操作”是否包括片上代码的运行(毫无疑问需要先取代码后解码并执行)?
沙发
john_light|  楼主 | 2009-1-21 15:05 | 只看该作者

最主要考虑的是片上程序对芯片进行擦除及编程操作的情况

如更新固件。

使用特权

评论回复
板凳
computer00| | 2009-1-21 15:47 | 只看该作者

没问题的,代码执行应该会自动停下,等写完成后继续往下

使用特权

评论回复
地板
香水城| | 2009-1-21 16:16 | 只看该作者

代码可以照常运行,只要不从Flash中取指

如果要从Flash中读取代码,程序的运行才会被停止。

如果不从Flash中取指,指令可以从内部SRAM或外部存储器得到。

使用特权

评论回复
5
john_light|  楼主 | 2009-1-21 16:26 | 只看该作者

也就是说

对Flash进行写操作的代码必须运行在内部SRAM或外部存储器中是吗?

但是,我粗粗浏览了AN2557 "STM32F10xxx in-application programming using the USART (IAP)"例子代码,暂时没有找到把Flash操作代码链接定位到SRAM的特殊设置,是我理解有误还是漏掉了什么细节?

使用特权

评论回复
6
香水城| | 2009-1-21 16:32 | 只看该作者

对Flash进行写操作的代码不必运行在内部SRAM或外部存储器中

使用特权

评论回复
7
computer00| | 2009-1-21 16:36 | 只看该作者

你让它开始写,你的FLASH中运行的程序就自动挂起了嘛...

所以没关系的,就是慢了点。

使用特权

评论回复
8
香水城| | 2009-1-21 16:42 | 只看该作者

在Flash中运行程序对Flash进行烧写,不会对烧写速度产生影响

一般而言,烧写Flash有系列3个步骤:
1)取2个字节
2)写入要烧写的地址
3)等待烧写成功

重复执行上述3个步骤,即可完成整块Flash区的写入。

在第3)步“等待烧写成功”,即使程序不是在Flash中运行,它也不会做其它事情;如果程序在Flash中运行,因为圈圈说的自动挂起,这个循环等待的次数也许只有1~2次而已。

使用特权

评论回复
9
john_light|  楼主 | 2009-1-21 16:42 | 只看该作者

难道还有流水线?

比如说我启动了Flash擦除操作,然后循环检查BSY标志等待擦除完成。

/*******************************************************************************
* Function Name  : FLASH_WaitForLastOperation
* Description    : Waits for a Flash operation to complete or a TIMEOUT to occur.
* Input          : - Timeout: FLASH progamming Timeout
* Output         : None
* Return         : FLASH Status: The returned value can be: FLASH_BUSY, 
*                  FLASH_ERROR_PG, FLASH_ERROR_WRP, FLASH_COMPLETE or 
*                  FLASH_TIMEOUT.
*******************************************************************************/
FLASH_Status FLASH_WaitForLastOperation(u32 Timeout)

  FLASH_Status status = FLASH_COMPLETE;
   
  /* Check for the Flash Status */
  status = FLASH_GetStatus();

  /* Wait for a Flash operation to complete or a TIMEOUT to occur */
  while((status == FLASH_BUSY) && (Timeout != 0x00))
  {
    delay();
    status = FLASH_GetStatus();
    Timeout--;
  }

  if(Timeout == 0x00 )
  {
    status = FLASH_TIMEOUT;
  }

  /* Return the operation status */
  return status;
}

我想,这个函数在流水线中装不下吧,那还是要取指令啊,也就是访问Flash了。

回复得慢了,两位已经回复。

使用特权

评论回复
10
john_light|  楼主 | 2009-1-21 16:45 | 只看该作者

自动挂起是什么机理

我还以为会取指异常呐。

使用特权

评论回复
11
computer00| | 2009-1-21 16:49 | 只看该作者

数据手册中的锁住了总线,就是CPU自动挂起的意思吧...

就是说CPU访问总线时忙……所以它就挂起了,一直在那取指。

我所说的慢点,意思是程序运行慢了下来,而不是说编程慢了。

使用特权

评论回复
12
香水城| | 2009-1-21 16:55 | 只看该作者

圈圈的理解正确

英文中这里用的是Halt the bus,我把它译成了“锁住总线”,基本就是圈圈说的意思。

使用特权

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

本版积分规则

34

主题

1094

帖子

2

粉丝