STM32F302R8T6的FLASH为64K,地址从0x0800 0000~0x0800 FFFF,分成32页,每页2K字节。 第00页 0x0800 0000~0x0800 07FF 2KB' S" B ?5 C& k" `+ _0 ~ 第01页 0x0800 0800~0x0800 0FFF 2KB, Q6 O1 R5 I* d' |6 i, A3 p 第02页 0x0800 1000~0x0800 17FF 2KB# ?1 q6 o6 d# `+ P4 a* Y7 C. O 第03页 0x0800 1800~0x0800 1FFF 2KB- g, d1 ]# ^5 @ 第04页 0x0800 2000~0x0800 27FF 2KB 第05页 0x0800 2800~0x0800 2FFF 2KB' ]1 `, t/ m" e( l B 第06页 0x0800 3000~0x0800 37FF 2KB 第07页 0x0800 3800~0x0800 3FFF 2KB8 _) r9 e" t/ x& v- f 第08页 0x0800 4000~0x0800 47FF 2KB 第09页 0x0800 4800~0x0800 4FFF 2KB 第10页 0x0800 5000~0x0800 57FF 2KB; H7 f: p1 [# C4 Y. t2 q6 _ 第11页 0x0800 5800~0x0800 5FFF 2KB 第12页 0x0800 6000~0x0800 67FF 2KB 第13页 0x0800 6800~0x0800 6FFF 2KB 第14页 0x0800 7000~0x0800 77FF 2KB 第15页 0x0800 7800~0x0800 7FFF 2KB 第16页 0x0800 8000~0x0800 87FF 2KB5 j/ O `$ H7 q9 Z1 q- c$ H 第17页 0x0800 8800~0x0800 8FFF 2KB! N! ?& Q! J, [/ K5 j 第18页 0x0800 9000~0x0800 97FF 2KB 第19页 0x0800 9800~0x0800 9FFF 2KB 第20页 0x0800 A000~0x0800 A7FF 2KB 第21页 0x0800 A800~0x0800 AFFF 2KB 第22页 0x0800 B000~0x0800 B7FF 2KB8 ?; a$ [6 a/ A) m3 }" r/ p% v' ]0 N 第23页 0x0800 B800~0x0800 BFFF 2KB 第24页 0x0800 C000~0x0800 C7FF 2KB 第25页 0x0800 C800~0x0800 CFFF 2KB- Z5 D& @: n; J$ ?( N, |2 ] 第26页 0x0800 D000~0x0800 D7FF 2KB: w, C2 ~7 ]/ F 第27页 0x0800 D800~0x0800 DFFF 2KB 第28页 0x0800 E000~0x0800 E7FF 2KB 第29页 0x0800 E800~0x0800 EFFF 2KB 第30页 0x0800 F000~0x0800 F7FF 2KB 第31页 0x0800 F800~0x0800 FFFF 2KB 对FLASH块进行写操作之前必须先擦除,对应位置只能1->0改写而不能0->1改写,所以必须先擦除,擦除后所有单元值为0xFF。: D, {4 A. l' K( U& t 这里只给出FLASH写操作的代码5 ^ q: Y( B- h; o6 u. s #define IAP_ADDR 0x0800F000 //写起始地址 进入debug,打开内存窗口,可以看到FLASH的情况。& [8 a5 M5 t/ j 读操作很简单,这里就不描述了。 |
RE:【Nucleo板开发日志】+ FLASH写测试
* º¯ÊýÃû³Æ£ºFlash_Test
* º¯Êý¹¦ÄÜ£ºFLASH IAPд²âÊÔ+ l0 T9 H) ^1 E! n1 d. w1 f
* Èë¿Ú²ÎÊý£ºÎÞ' Q/ ?0 g, G, V: V
* ³ö¿Ú²ÎÊý£ºÎÞ
* ÐÞ¸Äʱ¼ä£º2014-08-31
******************************************************************************/
void Flash_Test (void)
{
uint32_t i = 0;/ U. B( a9 `3 `3 n4 V# C: W) Q
//uint8_t Read_Buff[256];
uint8_t Write_Buff[256]; //дÊý¾Ý»º³åÇø
uint32_t dat;7 _3 j3 r- u* Z3 b4 ~1 u+ d& l
FLASH_Status Status = FLASH_COMPLETE; //״̬λ
for (i = 0; i < 256; i ++) //»º³åÇø³õʼ»¯& c$ | X3 P1 D4 l- M: x
{
Write_Buff = i;: v- j9 _( C& }5 Y
}
FLASH_SetLatency (FLASH_Latency_1); //ÉèÖòÙ×÷µÈ´ýÖÜÆÚ
FLASH_HalfCycleAccessCmd (ENABLE); //ʹÄÜFLASH°ëÖÜÆÚ·ÃÎÊ
FLASH_PrefetchBufferCmd (ENABLE); //ʹÄÜԤȡָ»º³åÇø
8 E4 h) }* e1 Y1 }" f% Z
FLASH_Unlock (); //½âËø
Status = FLASH_ErasePage (IAP_ADDR); //²Á³ýÒ³
for (i = 0; i < 256; i += 4)
{# \' B: w6 \" b8 f- t, i
//dat = Write_Buff
RE:【Nucleo板开发日志】+ FLASH写测试
RE:【Nucleo板开发日志】+ FLASH写测试
* 函数名称:Flash_Test- _0 D3 ?5 h; R7 ^, s4 Z, t2 X! S
* 函数功能:FLASH IAP写测试
* 入口参数:无) H f: p' a" m T7 k6 q' r4 L2 i7 U
* 出口参数:无
* 修改时间:2014-08-31
******************************************************************************/
void Flash_Test (void)* i9 Y* P6 R9 [; ]
{
uint32_t i = 0;/ Z, N3 u( H6 A3 T
//uint8_t Read_Buff[256];& J# ?& I- ^; L
uint8_t Write_Buff[256]; //写数据缓冲区; T- v* z6 f4 l
uint32_t dat;
FLASH_Status Status = FLASH_COMPLETE; //状态位$ i+ F D$ s& g/ ?
for (i = 0; i < 256; i ++) //缓冲区初始化
{; h$ H# H, Y H5 S# l# ~2 B/ K \
Write_Buff = i;" T5 f% y+ P' O- `, _
}
1 o& v5 Q# v+ k8 Y
FLASH_SetLatency (FLASH_Latency_1); //设置操作等待周期/ n, s6 a8 u+ G! t0 K; o
FLASH_HalfCycleAccessCmd (ENABLE); //使能FLASH半周期访问- K/ p) Q8 ]# E1 m% A7 Y7 X: \
FLASH_PrefetchBufferCmd (ENABLE); //使能预取指缓冲区5 l0 y. `& q$ a: a
FLASH_Unlock (); //解锁
Status = FLASH_ErasePage (IAP_ADDR); //擦除页2 p, m p% N# q- K+ z8 c; D& ^
for (i = 0; i < 256; i += 4)
{
//dat = Write_Buff
RE:【Nucleo板开发日志】+ FLASH写测试