STM32F302R8T6的FLASH为64K,地址从0x0800 0000~0x0800 FFFF,分成32页,每页2K字节。 第00页 0x0800 0000~0x0800 07FF 2KB. N5 ~5 D0 Q- n8 J+ {% m 第01页 0x0800 0800~0x0800 0FFF 2KB2 r4 K( a" [6 x+ H' ~6 q( G 第02页 0x0800 1000~0x0800 17FF 2KB: C M! O8 v& V 第03页 0x0800 1800~0x0800 1FFF 2KB( `+ O4 Y* v- q8 ^: x! t3 v2 u9 V- F3 |, U1 M 第04页 0x0800 2000~0x0800 27FF 2KB* Y1 c, g) K& z 第05页 0x0800 2800~0x0800 2FFF 2KB5 H# I- U. u5 S! H 第06页 0x0800 3000~0x0800 37FF 2KB 第07页 0x0800 3800~0x0800 3FFF 2KB 第08页 0x0800 4000~0x0800 47FF 2KB 第09页 0x0800 4800~0x0800 4FFF 2KB 第10页 0x0800 5000~0x0800 57FF 2KB 第11页 0x0800 5800~0x0800 5FFF 2KB* h- ~" ?/ O# `" G 第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 2KB 第17页 0x0800 8800~0x0800 8FFF 2KB" {9 o! k3 k# p5 [9 a. ^% E 第18页 0x0800 9000~0x0800 97FF 2KB 第19页 0x0800 9800~0x0800 9FFF 2KB 第20页 0x0800 A000~0x0800 A7FF 2KB 第21页 0x0800 A800~0x0800 AFFF 2KB4 o3 h1 A; i- C6 N6 H2 S/ u 第22页 0x0800 B000~0x0800 B7FF 2KB 第23页 0x0800 B800~0x0800 BFFF 2KB, w3 z7 u1 _1 [. p 第24页 0x0800 C000~0x0800 C7FF 2KB+ C5 B& Z0 l* P+ M2 Y5 D6 c 第25页 0x0800 C800~0x0800 CFFF 2KB 第26页 0x0800 D000~0x0800 D7FF 2KB' g$ M5 F9 V2 J: C7 b 第27页 0x0800 D800~0x0800 DFFF 2KB 第28页 0x0800 E000~0x0800 E7FF 2KB" b: I: \8 C/ C. F9 z! p 第29页 0x0800 E800~0x0800 EFFF 2KB" i; ]0 H) J$ ^ 第30页 0x0800 F000~0x0800 F7FF 2KB 第31页 0x0800 F800~0x0800 FFFF 2KB 对FLASH块进行写操作之前必须先擦除,对应位置只能1->0改写而不能0->1改写,所以必须先擦除,擦除后所有单元值为0xFF。5 X! |, Z7 n4 |: e% H 7 |! o1 t3 u0 } U 这里只给出FLASH写操作的代码1 N$ X$ r+ [- C; M #define IAP_ADDR 0x0800F000 //写起始地址" z: i; c7 Y7 y+ [: {& o' [ 进入debug,打开内存窗口,可以看到FLASH的情况。0 y# q. w' ~: Y7 V 读操作很简单,这里就不描述了。 |
RE:【Nucleo板开发日志】+ FLASH写测试
* º¯ÊýÃû³Æ£ºFlash_Test
* º¯Êý¹¦ÄÜ£ºFLASH IAPд²âÊÔ
* Èë¿Ú²ÎÊý£ºÎÞ# p3 ~3 I" g8 c, g/ ]+ L
* ³ö¿Ú²ÎÊý£ºÎÞ
* ÐÞ¸Äʱ¼ä£º2014-08-318 c& o% m3 S' h4 e9 M5 U. |, q e
******************************************************************************/
void Flash_Test (void)8 ]3 @) i" E: ^ B/ h; x
{
uint32_t i = 0;
//uint8_t Read_Buff[256];' i9 M/ k1 @2 [6 q/ _
uint8_t Write_Buff[256]; //дÊý¾Ý»º³åÇø
uint32_t dat;
FLASH_Status Status = FLASH_COMPLETE; //״̬λ& U o% f" I; |
for (i = 0; i < 256; i ++) //»º³åÇø³õʼ»¯
{
Write_Buff = i;( }* y; j$ H, n( o) D
}
FLASH_SetLatency (FLASH_Latency_1); //ÉèÖòÙ×÷µÈ´ýÖÜÆÚ# C- d& H7 h* s3 v/ L8 p
FLASH_HalfCycleAccessCmd (ENABLE); //ʹÄÜFLASH°ëÖÜÆÚ·ÃÎÊ
FLASH_PrefetchBufferCmd (ENABLE); //ʹÄÜԤȡָ»º³åÇø8 j8 \$ P ` y4 H$ i# Y
$ n4 k0 a2 a4 J9 R
FLASH_Unlock (); //½âËø
Status = FLASH_ErasePage (IAP_ADDR); //²Á³ýÒ³
for (i = 0; i < 256; i += 4)
{
//dat = Write_Buff
RE:【Nucleo板开发日志】+ FLASH写测试
RE:【Nucleo板开发日志】+ FLASH写测试
* 函数名称:Flash_Test% e' g' @! X* Q! i( ?$ p
* 函数功能:FLASH IAP写测试
* 入口参数:无* [" Y( T- y! x' o* {) D N! f. e
* 出口参数:无$ V! E1 v! ]! o. Q8 Y3 ^- U
* 修改时间:2014-08-31' \/ c& ]. U6 C& F
******************************************************************************/
void Flash_Test (void)
{
uint32_t i = 0;3 s, U8 n! `9 s' c
//uint8_t Read_Buff[256];
uint8_t Write_Buff[256]; //写数据缓冲区
uint32_t dat;
FLASH_Status Status = FLASH_COMPLETE; //状态位8 b) s- a) w; v- T9 b0 M+ Z
for (i = 0; i < 256; i ++) //缓冲区初始化
{
Write_Buff = i;
}
FLASH_SetLatency (FLASH_Latency_1); //设置操作等待周期9 g' ^9 O, U3 L) g6 G
FLASH_HalfCycleAccessCmd (ENABLE); //使能FLASH半周期访问4 C0 J, v" @) E, O% C
FLASH_PrefetchBufferCmd (ENABLE); //使能预取指缓冲区
FLASH_Unlock (); //解锁
Status = FLASH_ErasePage (IAP_ADDR); //擦除页! X/ M5 y4 p. \8 @1 ] Q
for (i = 0; i < 256; i += 4)8 j& Y$ \' ^$ ?& c! c
{
//dat = Write_Buff
RE:【Nucleo板开发日志】+ FLASH写测试