# STM32 (VS Code + Cmake) RAM µð¹ö±ë ȯ°æ ¼³Á¤ °¡À̵å
**Àû¿ë º¸µå:** Nucleo-F767ZI (Ÿ Ĩ¼Âµµ ÁÖ¼Ò¿Í ¸Þ¸ð¸® Å©±â¸¸ º¯°æÇÏ¿© µ¿ÀÏ Àû¿ë °¡´É)
**°³¹ß ȯ°æ:** STM32CubeMX, VS Code, Cmake, Cortex-Debug (OpenOCD)
**¸ñÀû:** Äڵ带 Flash ¸Þ¸ð¸®°¡ ¾Æ´Ñ RAM¿¡ ´Ù¿î·ÎµåÇÏ°í ½ÇÇàÇÏ¿© **1) Flash ¸Þ¸ð¸® ¼ö¸í º¸È£** ¹× **2) ¾ÐµµÀûÀ¸·Î ºü¸¥ ´Ù¿î·Îµå/µð¹ö±ë ¼Óµµ** È®º¸
---
## 1. RAM Àü¿ë ¸µÄ¿ ½ºÅ©¸³Æ®(.ld) »ý¼º
MCU°¡ Äڵ带 Flash(`0x08000000`)°¡ ¾Æ´Ñ RAM(`0x20000000`)¿¡ ¹èÄ¡Çϵµ·Ï ¸µÄ¿ ½ºÅ©¸³Æ®¸¦ ¼öÁ¤ÇÕ´Ï´Ù.
1. ÇÁ·ÎÁ§Æ® ·çÆ® °æ·ÎÀÇ `STM32F767ZITx_FLASH.ld` (¶Ç´Â `STM32F767xx_FLASH.ld`) ÆÄÀÏÀ» º¹»çÇÕ´Ï´Ù.
2. º¹»çÇÑ ÆÄÀÏÀÇ À̸§À» **`STM32F767xx_RAM.ld`**·Î º¯°æÇÕ´Ï´Ù.
3. »õ·Î ¸¸µç `_RAM.ld` ÆÄÀÏÀ» ¿°í, ÃÖ»ó´ÜÀÇ `MEMORY` ºí·ÏÀ» ¾Æ·¡¿Í °°ÀÌ ¼öÁ¤ÇÏ¿© RAM(ÃÑ 512KB)À» ÄÚµå¿ë 256KB, µ¥ÀÌÅÍ¿ë 256KB·Î ¹Ý¹Ý ³ª´¯´Ï´Ù.
```ld
/* STM32F767xx_RAM.ld */
MEMORY
{
/* RAMÀÇ ¾Õ 256KB¸¦ Äڵ尡 ¿Ã¶ó°¡´Â FLASH ¿µ¿ªÃ³·³ ¼Ó¿©¼ ¸ÅÇÎ */
FLASH (rx) : ORIGIN = 0x20000000, LENGTH = 256K
/* ³ª¸ÓÁö 256KB¸¦ ½ÇÁ¦ º¯¼ö/µ¥ÀÌÅͰ¡ ¿Ã¶ó°¡´Â RAM °ø°£À¸·Î »ç¿ë */
RAM (xrw) : ORIGIN = 0x20040000, LENGTH = 256K
}
```
## 2. ÀÎÅÍ·´Æ® º¤ÅÍ Å×À̺í À§Ä¡ º¯°æ
Äڵ尡 RAM¿¡¼ ½ÇÇàµÇ¹Ç·Î, ÀÎÅÍ·´Æ® ¹ß»ý ½Ã ÂüÁ¶ÇÏ´Â º¤ÅÍ Å×À̺íÀÇ ±âÁØ ÁÖ¼Òµµ RAMÀ¸·Î º¯°æÇØ¾ß ÇÕ´Ï´Ù.
1. `Core/Src/system_stm32f7xx.c` ÆÄÀÏÀ» ¿±´Ï´Ù.
2. »ó´ÜÀÇ `USER_VECT_TAB_ADDRESS` ÁÖ¼®À» ÇØÁ¦Çϰí, `VECT_TAB_BASE_ADDRESS`¸¦ `0x20000000U`·Î º¯°æÇÕ´Ï´Ù.
```c
/* system_stm32f7xx.c */
#define USER_VECT_TAB_ADDRESS /* ÁÖ¼® ÇØÁ¦ (Ȱ¼ºÈ) */
#if defined(USER_VECT_TAB_ADDRESS)
/* FLASH_BASE ´ë½Å RAMÀÇ ½ÃÀÛ ÁÖ¼Ò ÀÔ·Â */
#define VECT_TAB_BASE_ADDRESS 0x20000000U
#define VECT_TAB_OFFSET 0x00000000U
#endif
```
## 3. CMakeLists.txt ¸µÄ¿ ½ºÅ©¸³Æ® ±³Ã¼
ºôµå ½Ã ±âÁ¸ FLASH ¸µÄ¿ ½ºÅ©¸³Æ® ´ë½Å ¿ì¸®°¡ ¸¸µç RAM ¸µÄ¿ ½ºÅ©¸³Æ®¸¦ »ç¿ëÇϵµ·Ï ÁöÁ¤ÇÕ´Ï´Ù.
1. ÃÖ»ó´Ü `CMakeLists.txt` ÆÄÀÏÀ» ¿±´Ï´Ù.
2. `STM32F767xx_FLASH.ld` ºÎºÐÀ» ã¾Æ **`STM32F767xx_RAM.ld`**·Î º¯°æÇÕ´Ï´Ù.
3. **[ÁÖÀÇ]** ÆÄÀÏ ³»¿¡ `-T` ¸µÄ¿ ¿É¼ÇÀÌ Áߺ¹À¸·Î µé¾î°¡Áö ¾Êµµ·Ï À¯ÀÇÇÕ´Ï´Ù. (¸µÄ¿ ½ºÅ©¸³Æ® Áߺ¹ ¿¡·¯ ¹æÁö)
```cmake
/* CMakeLists.txt ¿¹½Ã */
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
-T${CMAKE_CURRENT_SOURCE_DIR}/STM32F767xx_RAM.ld
# ... ±âŸ ¿É¼Ç ...
)
```
## 4. VS Code ÀÚµ¿ ºôµå ÀÛ¾÷ ¼³Á¤ (`tasks.json`)
`F5`(µð¹ö±ë)¸¦ ´·¶À» ¶§, ÀÌÀü Äڵ尡 ½ÇÇàµÇ´Â °ÍÀ» ¹æÁöÇϰí **ÀÚµ¿À¸·Î ÃֽŠÄڵ带 ºôµå**Çϵµ·Ï Task¸¦ »ý¼ºÇÕ´Ï´Ù.
1. `.vscode` Æú´õ ¾È¿¡ **`tasks.json`** ÆÄÀÏÀ» »ý¼ºÇÕ´Ï´Ù.
2. ¾Æ·¡ÀÇ Cmake Àü¿ë ºôµå Äڵ带 ºÙ¿©³Ö½À´Ï´Ù.
```json
{
"version": "2.0.0",
"tasks": [
{
"type": "cmake",
"label": "Cmake Build Task",
"command": "build",
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
```
## 5. VS Code µð¹ö°Å ¼³Á¤ (`launch.json`)
ºôµåµÈ `.elf` ÆÄÀÏÀ» RAM¿¡ ¿Ã¸®°í, º¸µå ¸®¼Â ½Ã ¾û¶×ÇÏ°Ô Flash¸¦ ÀÐÁö ¾Ê°í **°Á¦·Î RAMÀ¸·Î Á¡ÇÁ**Çϵµ·Ï ¼³Á¤ÇÕ´Ï´Ù.
1. `.vscode` Æú´õ ¾È¿¡ **`launch.json`** ÆÄÀÏÀ» »ý¼º(¶Ç´Â ¼öÁ¤)ÇÕ´Ï´Ù.
2. ¾Æ·¡ Äڵ带 ºÙ¿©³Ö½À´Ï´Ù.
```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug in RAM",
"cwd": "${workspaceFolder}",
"executable": "${workspaceFolder}/build/${workspaceFolderBasename}.elf",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"device": "STM32F767ZI",
"configFiles": [
"board/st_nucleo_f7.cfg"
],
"runToEntryPoint": "main",
"showDevDebugOutput": "none",
"preLaunchTask": "Cmake Build Task",
"postLaunchCommands": [
"set $sp = *(unsigned int*)0x20000000",
"set $pc = *(unsigned int*)0x20000004"
],
"postRestartCommands": [
"set $sp = *(unsigned int*)0x20000000",
"set $pc = *(unsigned int*)0x20000004"
]
}
]
}
```
* **`preLaunchTask`**: µð¹ö±ë Á÷Àü `tasks.json`À» È£ÃâÇÏ¿© ÀÚµ¿ ºôµå ¼öÇà
* **`postLaunchCommands` / `postRestartCommands`**: ¸®¼Â Á÷ÈÄ MCUÀÇ ¸è»ìÀ» Àâ°í PC(Program Counter)¿Í SP(Stack Pointer)¸¦ °Á¦·Î RAM ÁÖ¼Ò·Î °íÁ¤ÇÏ¿© ½ÇÇà
## 6. Àû¿ë ¹× ½ÇÇà (°¡Àå Áß¿ä)
±âÁ¸ Flash ºôµå ij½Ã°¡ ³²¾ÆÀÖÀ¸¸é ¿¡·¯°¡ ¹ß»ýÇϹǷÎ, **¹Ýµå½Ã ij½Ã¸¦ Áö¿ì°í »õ·Î ºôµå**ÇØ¾ß ÇÕ´Ï´Ù.
1. ´ÜÃàŰ `Ctrl + Shift + P` -> **`Cmake: Delete Cache and Reconfigure`** ½ÇÇà (ij½Ã ÃʱâÈ)
2. Äڵ带 ¼öÁ¤Çϰí **`F5`** Ű ´©¸£±â
3. ÇÏ´Ü Å͹̳ο¡¼ ÀÚµ¿À¸·Î ºôµå°¡ ¿Ï·áµÈ ÈÄ µð¹ö°Å°¡ ½ÇÇàµÇ¸ç `main()` ÇÔ¼ö ù ÁÙ¿¡¼ Á¤ÁöÇÔ.
> **✅ ÃÖÁ¾ È®ÀÎ ¹æ¹ý**
> µð¹ö±ë ¸ðµå ÁøÀÔ ½Ã ÁÂÃø **'È£Ãâ ½ºÅÃ(Call Stack)'** ¶Ç´Â **'·¹Áö½ºÅÍ(Registers) -> Core -> pc'** °ªÀÌ **`0x2000...`** ´ë¿ªÀ¸·Î ½ÃÀÛÇÏ¸é ¿Ïº®ÇÏ°Ô RAM¿¡¼ µ¿ÀÛ ÁßÀÎ °ÍÀÔ´Ï´Ù!
|