码迷,mamicode.com
首页 > 数据库 > 详细

(STM32) Internal Flash Access

时间:2021-02-18 13:22:05      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:readwrite   如何使用   size   nal   info   add   medium   read   erase   

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 的結果。

 技术图片

 

(STM32) Internal Flash Access

标签:readwrite   如何使用   size   nal   info   add   medium   read   erase   

原文地址:https://www.cnblogs.com/ollie-lin/p/14406545.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!