标签: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 的結果。
标签:readwrite 如何使用 size nal info add medium read erase
原文地址:https://www.cnblogs.com/ollie-lin/p/14406545.html