页擦除
闪存的任何一页都可以通过FPEC的页擦除功能擦除;擦除一页应遵守下述过程:
检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
设置FLASH_CR寄存器的PER位为’1’;
用FLASH_AR寄存器选择要擦除的页;
设置FLASH_CR寄存器的STRT位为’1’;
等待BSY位变为’0’;
读出被擦除的页并做验证。
--------------
在FLASH_AR设置的地址需页对齐吗?
这个地址是指擦除时以这个地址为开始的后一页大小,还是以这个地址到当前页页尾,还是这个地址所在的页?
如,对于高密度器件,page 0为0x0800 0000 - 0x0800 07FF
当在FLASH_AR中设置0x0800 070F时,擦除的是以下哪种情况?
1.0x0800 070F~0x0800 07FF
2.0x0800 070F~(0x0800 070F+2KB)
3.0x0800 0000 ~ 0x0800 07FF
感觉编程手册里没有讲清楚
给出的地址是这个地址所在的页。
编程手册里讲清楚了,请看手册中擦除过程的框图描述:
-
-
STM32_Flash_Page_Erase.GIF
(10.75 KB)
谢谢版主!
意思就是只要这个地址落在某一页内,则对包含这个地址的页进行擦除是吧!
这么重要的信息只在图中的一个框中说明有点欠妥.尤其是在中文版里翻译为
"置FLASH_CR的PER = 1;
在FLASH_AR中选择要擦除的页
置FLASH_CR的STRT = 1"
我就纳闷他所谓的"选择要擦除的页"是怎么个选法了,填某一页的首地址吧,可我看到程序中使用这个函数时参数是任意地址,既然是任意地址那这个"页"的范围咋确定呢,有我以上三种理解.
中文版翻译确实没有真实反映原意,这个需要改正。
正是因为中文版翻译可能会有错误,所以在中文版里才会提醒读者,“本译文仅供参考,如有翻译错误,请以英文原稿为准”。
最后一个问题:程序设计中,指定一个实体时都是以这个实体的起始地址为准,比如说一个数组的地址,肯定是数组的首地址,一个结构体的地址就是它的首地址;因此一般人也会把一个页的地址理解为是它的首地址;所以我不认为你说的这个事情是重要的,也许对于你的多虑却是重要的,
一个页理解是首地址没错,我也是这么理解,如果按照这种理解,那这个FLASH_AR就应该填某一页的首地址了.
英文手册上这么说:
Page Erase
A page of the Flash memory can be erased using the Page Erase feature of the FPEC. To
erase a page, the procedure below should be followed:
● Check that no Flash memory operation is ongoing by checking the BSY bit in the
FLASH_CR register
● Set the PER bit in the FLASH_CR register
● Program the FLASH_AR register to select a page to erase
● Set the STRT bit in the FLASH_CR register
● Wait for the BSY bit to be reset
● Read the erased page and verify
Program the FLASH_AR register to select a page to erase其实中文翻译的也是准确的,如果光看这句话我想还真不知道究竟填什么值能够select a page,以及填入某一特定地址后select的page的范围是多少.如果明确的说,填入你所要擦除的页内的任意地址,那就相当好了.虽然框图中有说明,我觉得还是写在如上红色区域比较好.
楼主是不是认为手册中的框图不重要呢?“重要的信息”不能放在框图中?“重要的信息”要重复地书写?
一个页理解是首地址没错,我也是这么理解,如果按照这种理解,那这个FLASH_AR就应该填某一页的首地址了.
英文手册上这么说:
......
其实中文翻译的也是准确的,如果光看这句话我想还真不知道究竟填什么值能够select a page,以及填入某一特定地址后select的page的范围是多少.如果明确的说,填入你所要擦除的页内的任意地址,那就相当好了.虽然框图中有说明,我觉得还是写在如上红色区域比较好.
其实这里最根本的问题是楼主不知道一个事实,Flash的页起始地址和范围是物理上固定死的,不是你
填入某一特定地址后能够选择的,你输入的参数只是用来指定某个页,而不是用来定义某个页。
对于楼主的疑问,即使手册中没有说清楚,经过简单的分析,使用排除法也能够得出正确的结论:
1)这个地址是指擦除时以这个地址为开始的后一页大小
上面已经说了,Flash的页起始地址和范围是物理上固定死的,物理上页擦除是不能跨页的,也不可能只擦除某一部分。所以这个问题的答案是否定的!
2)还是以这个地址到当前页页尾
同样道理:物理上页擦除是不能跨页的,也不可能只擦除某一部分。所以这个问题的答案也是否定的!
3)还是这个地址所在的页?
只剩下这个答案了!
呵呵 版主很热情的给我回复了这么,感动!
关键的是没有理解好,只能页擦除的意思是只能以页的大小为单位擦除还是只能擦除物理上的一个页.....所以由此衍生出这些疑问.
说实话我并没有注意到框里面写的,而是把重点放在了文字描述.
当然有丰富FLASH经验的人的可能这些都不成问题,不过如果新手的话可能会有点理解问题..
对呀,你的问题是没有这个基本常识:物理上页擦除是不能跨页的,也不可能只擦除某一部分;怎么能怪ST的手册没有写清楚呢?