(STM32) Internal Flash Access

Introdution

STM32Fxxx 系列的MCU, 似乎有分類成 low-, medium-, high-, XL-density 4種不同Flash大小的產品。

個人是常常忘記所以在此筆記。

Flash : 通常放置程式碼, const常數變數, 掉電資料不消失。 存取速度較慢

RAM : 可以理解成記憶體, 在程式執行時需要快速存取的變數, 掉電資料消失。 存取速度較快

用 High density table 和 程式碼來筆記。

Main memory : 都是我們可以拿來存放資料的地方, 在IDE的配置下。 我們的程式碼通常配置在 Page0的位置 (0x0800_0000)

而RAM的位置在 User Manual有寫說在 0x2000_0000 的位置開始 96KB的大小

 

 所以說給IDE定義完, Program size, 剩餘的 空間 我們都可以拿來因應需求上的配置。

知道這些基本知識後, 再來就是如何使用程式碼去操作 memory。

以上提的 Flash, Main memory, memory 都是指 Page 0 ~ 255

讀寫流程 : Flash unlock → Erash Page → Write Data (Word or Half Word) → Flash lock → Read Data

 1 #define     ADDR_FLASH_PAGE_255     ((uint32_t)0x0807F800)
 2 #define     BufferSize         6
 3 #define      TEST_ERROR                -1
 4 #define      TEST_SUCCESS      0
 5 #define      TEST_FAILED          1
 6 
 7 uint16_t     usFlashWriteBuf[BufferSize] = {0x0201,0x0403,0x0605,0x0807,0x0A09,0x0C0B};
 8 uint16_t     usFlashReadBuf[BufferSize] = {0};
 9 
10 static int FlashReadWriteTest(void)
11 {
12     uint32_t ucStartAddr;
13     int i = 0;
14     FLASH_Unlock(); 
15     
16     ucStartAddr = ADDR_FLASH_PAGE_255;
17     if (FLASH_COMPLETE != FLASH_ErasePage(ucStartAddr))
18     {
19         printf("Erase Error!\n");
20         return TEST_ERROR;
21     }
22     else
23     {
24         ucStartAddr = ADDR_FLASH_PAGE_255;
25         printf("Eease success flash data = \n");
26         for (i = 0; i < BufferSize; i++)
27         {
28             usFlashReadBuf[i] = *(uint32_t*)ucStartAddr;
29             printf("ucFlashReadBuf[%d] = 0x%.4x\n", i, usFlashReadBuf[i]);
30             ucStartAddr += 2;
31         }
32     }
33     
34     
35     ucStartAddr = ADDR_FLASH_PAGE_255;
36     printf("\ninto flash data : \n");
37     for (i = 0; i < BufferSize; i++)
38     {
39         if (FLASH_COMPLETE != FLASH_ProgramHalfWord(ucStartAddr, usFlashWriteBuf[i]))
40         {
41             printf("Write Error!\n");
42             return TEST_ERROR;
43         }
44         printf("ucFlashWriteBuf[%d] = 0x%.4x\n", i, usFlashWriteBuf[i]);
45         ucStartAddr += 2;
46     }
47     
48     
49     FLASH_Lock();
50     
51     
52     ucStartAddr = ADDR_FLASH_PAGE_255;
53     printf("\nRead Flash data : \n");
54     for (i = 0; i < BufferSize; i++)
55     {
56         usFlashReadBuf[i] = *(__IO uint16_t*)ucStartAddr;
57         printf("ucFlashReadBuf[%d] = 0x%.4x\n", i, usFlashReadBuf[i]);
58         ucStartAddr += 2;
59     }
60     
61     
62     for (i = 0; i < BufferSize; i++)
63     {
64         if (usFlashReadBuf[i] != usFlashWriteBuf[i])
65         {
66             return TEST_FAILED;
67         }
68     }
69     
70     return TEST_SUCCESS;
71 }

最後再利用 STM32 ST-LINK Utility 和 UART Comport 去觀察 Memory 的結果。

 

 

posted on 2021-02-16 13:42  OO程式猿  阅读(316)  评论(0编辑  收藏  举报

导航