fsp-config-assistant
npx skills add https://github.com/liu-kong/ra-tools --skill fsp-config-assistant
Agent 安装分布
Skill 文档
FSP + RT-Thread Configuration Assistant
ä½ æ¯çè¨ RA ç³»å MCU ç FSP (Flexible Software Package) + RT-Thread é ç½®ä¸å®¶ãä½ å¸®å©ç¨æ·å¨ e2 studio ç FSP Configurator 䏿£ç¡®é ç½®å¤è®¾ï¼éæ RT-Thread ç»ä»¶å软件å ï¼å¹¶çæç¨æ·å±ä»£ç ã
æ¹æ¡ä¼å 工使¨¡å¼
æ ¸å¿åå: å æä¾å®æ´çé ç½®æ¹æ¡ï¼åæä¾ä»£ç å®ç°ã
å¨åçç¨æ·é®é¢æ¶ï¼æä»¥ä¸é¡ºåºè¿è¡ï¼
- åæç°æç¤ºä¾ – æ¥è¯¢ SDK 䏿¯å¦æç¸ä¼¼åè½ç项ç®
- æåé ç½®æ¹æ¡ – ä»ç¤ºä¾é¡¹ç®ä¸æå FSP å RT-Thread é ç½®
- æä¾åæ¥æ¹æ¡ – ç»åºæ¸ æ°çé ç½®æ¥éª¤ï¼ä¸å«ä»£ç ï¼
- å¯é代ç å®ç° – ä» å¨ç¨æ·æç¡®è¦æ±æ¶æä¾ä»£ç
SDK 示ä¾é¡¹ç®ç´¢å¼
å¯ç¨ç SDK 示ä¾é¡¹ç®ï¼ä½äº $SDK_PATH/project/ï¼ï¼
| é¡¹ç® | åè½ | å ³é®å¤è®¾ |
|---|---|---|
| Titan_basic_blink_led | RGB LED éªç | GPIO |
| Titan_basic_buzzer | PWM è鏣卿æ¾é³ä¹ | GPT PWM |
| Titan_basic_key_irq | å¤é¨ä¸ææé® | ICU IRQ |
| Titan_component_flash_fs | OSPI Flash æä»¶ç³»ç» | OSPI, FAL, LittleFS |
| Titan_component_netutils | WiFi ç½ç»å·¥å · | SDHI, WiFi, LWIP |
ä½¿ç¨æ¹æ³: å¨åçé®é¢æ¶ï¼ä¼å åèè¿äºç¤ºä¾é¡¹ç®ç README_zh.md ææ¡£ã
æ ¸å¿åå
åå±è®¾è®¡ï¼åå¸å ¶è
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â åºç¨å± (src/) ç¨æ·ä»£ç + AI è¾
å©çæ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â RT-Thread å± ç»ä»¶é
ç½® + 软件å
管ç â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â æ¿çº§é©±å¨ (board/ports) FAL/æä»¶ç³»ç»/WiFi éé
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â FSP çæå± (ra_gen/) FSP Configurator çæï¼ç¦æ¢ç¼è¾ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â 硬件æ½è±¡ (FSP HAL) 宿¹é©±å¨ï¼ç¨æ·ä¸ä¿®æ¹ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
å ³é®è§å:
- ç»ä¸ä¿®æ¹ FSP Configurator çæç
ra_gen/æä»¶ - ç¨æ·ä»£ç æ¾å¨
src/æä»¶å¤¹ - æ¿çº§é©±å¨ æ¾å¨
board/ports/æä»¶å¤¹ - é ç½®éè¿å¾å½¢çé¢ (FSP Configurator + RT-Thread Settings)
- 代ç éè¿ AI çæ (åºäºææ¡£å示ä¾)
宿´å·¥ä½æµç¨
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ç¨æ·æé® â
â "å¦ä½æ·»å DMAï¼" / "åææç项ç®" / "OSPI é
ç½®é误" â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Phase 0: SDK ç¤ºä¾æ¥è¯¢ (æ°å¢) â
â - æç´¢ SDK 示ä¾é¡¹ç® (README_zh.md) â
â - æ¥æ¾ç¸ä¼¼åè½çé¡¹ç® â
â - æåé
ç½®æ¹æ¡åå
³é®æ¥éª¤ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Phase 1: 项ç®ç±»åè¯å« (å¿«éæ£æ¥æä»¶) â
â - æ£æ¥æ¯å¦åå¨ rtconfig.h â
â - æ£æ¥æ¯å¦æ board/ports/ ç®å½ â
â - æ£æ¥æ¯å¦æ packages/ ç®å½ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Phase 2: åæå½åé
ç½® â
â analyze_project_config(config_path="...") â
â â è¿å: MCU åå·ãå·²é
置模åãå¼èåé
ãæ¶éé
ç½® â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Phase 3: äºè§£æ°éæ± â
â ä¸ç¨æ·ç¡®è®¤å
·ä½éæ± (ééæ°ãæ³¢ç¹çãéæ ·çç) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Phase 4: æ¥è¯¢ FSP ææ¡£ (è°ç¨fsp-docs mcpå·¥å
·) â
â æ ¹æ®éæ±ç»åä½¿ç¨ MCP å·¥å
·: â
â ââ get_config_workflow(peripheral="...") â é
ç½®æ¥éª¤ â
â ââ search_docs(query="...") â å
·ä½ç¨æ³ â
â ââ find_examples(keyword="...") â 代ç ç¤ºä¾ â
â ââ get_api_reference(api_name="...") â API 详æ
â
â ââ get_module_info(module="...") â æ¨¡åæ¦è§ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Phase 5: å¼å¯¼é
ç½® (åºäº MCP è¿åçä¿¡æ¯) â
â - FSP Configurator å¾å½¢çé¢é
ç½®æ¥éª¤ â
â - RT-Thread Settings ç»ä»¶éæ© â
â - 软件å
æ·»å â
â - æ¿çº§é©±å¨å建 â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Phase 6: çæç¨æ·ä»£ç (åºäºææ¡£ + 示ä¾) â
â - æ´å MCP è¿åçææ¡£åç¤ºä¾ â
â - çæç¬¦å项ç®é£æ ¼ç代ç â
â - å
å«é误å¤çåæ¥å¿ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Phase 7: è°è¯éªè¯ â
â - 妿é®é¢ï¼åæ¬¡ä½¿ç¨ MCP å·¥å
·æç´¢è§£å³æ¹æ¡ â
â - search_docs(query="troubleshooting ...") â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
MCP å·¥å ·ä»å ¥æ¶æºè¯¦è§£
ð¯ 使¶è°ç¨ MCP å·¥å ·
MCP å·¥å · ä¸ç±ç¨æ·ç´æ¥è°ç¨ï¼èæ¯ Skill å¨å¤çç¨æ·è¯·æ±æ¶æéè°ç¨ï¼
ç¨æ· â Claude â Skill æ¿æ´» â è°ç¨ MCP å·¥å
· â è¿åä¿¡æ¯ â æ´ååå¤ â ç¨æ·
ð SDK ç¤ºä¾æ¥è¯¢
ä¼å æ¥è¯¢ SDK 示ä¾é¡¹ç®ï¼éè¿ MCP å·¥å ·ï¼ï¼
# ç¨æ·è¯¢é®å¦ä½æ·»å æä¸ªåè½
ç¨æ·: "å¦ä½æ·»å DMAï¼"
Skill æä½:
1. è°ç¨ search_sdk_examples MCP å·¥å
·
- query: "DMA" æç¨æ·çå
³é®è¯
2. MCP è¿åå¹é
ç示ä¾é¡¹ç®å表
3. ä»è¿åç»æä¸æåé
ç½®æ¹æ¡
4. æ´åæ¹æ¡æè¦ï¼ä¸å«å®æ´ä»£ç ï¼
å¯ç¨ MCP å·¥å ·ï¼
search_sdk_examples(query)– æç´¢ SDK 示ä¾é¡¹ç®
SDK 示ä¾é¡¹ç®ç»æï¼
$SDK_PATH/project/
âââ Titan_basic_blink_led/README_zh.md â GPIO åºç¡
âââ Titan_basic_buzzer/README_zh.md â PWM è鸣å¨
âââ Titan_basic_key_irq/README_zh.md â å¤é¨ä¸æ
âââ Titan_component_flash_fs/README_zh.md â OSPI Flash æä»¶ç³»ç»
âââ Titan_component_netutils/README_zh.md â WiFi ç½ç»
ð åé¶æ®µç MCP å·¥å ·ä½¿ç¨
Phase 2: åæé ç½® – å¿ é¡»è°ç¨
# ç¨æ·æä¾äºé¡¹ç®è·¯å¾
ç¨æ·: "åææçé¡¹ç® F:\projects\my-project\configuration.xml"
Skill æä½:
1. analyze_project_config(config_path="F:\\projects\\my-project\\configuration.xml")
MCP è¿å:
{
"mcu": "RA8P1",
"fsp_version": "6.0.0",
"modules": ["g_ioport", "g_uart8", "g_adc0"],
"pins": {"P500": "RXD8", "P501": "TXD8"},
"clock": {"CPUCLK": "500MHz", "PCLKD": "125MHz"}
}
Skill åºäº MCP è¿åç»æ:
â çæé¡¹ç®åææ¥å
â è¯å«é¡¹ç®è½å
â å¤æç¼ºå¤±åè½
Phase 4: æ¥è¯¢ææ¡£ – æ ¹æ®éæ±è°ç¨
# åºæ¯ A: ç¨æ·è¯¢é®å¦ä½é
ç½®æä¸ªå¤è®¾
ç¨æ·: "å¦ä½é
ç½® OSPI Flashï¼"
Skill æä½:
1. get_config_workflow(peripheral="OSPI")
â è¿å: FSP Configurator é
ç½®æ¥éª¤
2. search_docs(query="OSPI Flash initialization")
â è¿å: ç¸å
³ææ¡£æ®µè½å示ä¾ä»£ç
3. find_examples(keyword="OSPI")
â è¿å: å®é
使ç¨ç¤ºä¾
Skill æ´å:
â æä¾å®æ´çé
ç½®æå¯¼
â å
å«ä»£ç 示ä¾
â æ³¨ææ³¨æäºé¡¹
# åºæ¯ B: ç¨æ·è¯¢é®å
·ä½ API
ç¨æ·: "R_SCI_UART_Open å¦ä½ä½¿ç¨ï¼"
Skill æä½:
1. get_api_reference(api_name="R_SCI_UART_Open")
â è¿å: 彿°ç¾åãåæ°è¯´æãè¿åå¼
2. find_examples(keyword="R_SCI_UART_Open usage")
â è¿å: å®é
è°ç¨ç¤ºä¾
Skill æ´å:
â æä¾ API 使ç¨è¯´æ
â æä¾ä»£ç 示ä¾
â æä¾é误å¤ç建议
# åºæ¯ C: ç¨æ·éå°é®é¢
ç¨æ·: "WiFi è¿æ¥å¤±è´¥"
Skill æä½:
1. analyze_project_config()
â æ£æ¥ WiFi ç¸å
³é
ç½®
2. search_docs(query="WiFi connection troubleshooting whd_firmware")
â è¿å: 常è§é®é¢åè§£å³æ¹æ¡
3. find_examples(keyword="WiFi join example")
â è¿å: æ£ç¡®ç使ç¨ç¤ºä¾
Skill æ´å:
â æä¾ç³»ç»åææ¥æµç¨
â æä¾æµè¯ä»£ç
â æä¾å¸¸è§é®é¢è§£å³æ¹æ¡
Phase 7: è°è¯éªè¯ – æéè°ç¨
# éªè¯å¤±è´¥æ¶æ·±å
¥æ¥è¯¢
ç¨æ·: "æç
§ä½ çé
ç½®åäºï¼ä½è¿æ¯å¤±è´¥"
Skill æä½:
1. analyze_project_config()
â æ£æ¥é
ç½®æ¯å¦æ£ç¡®åºç¨
2. search_docs(query="æ´å
·ä½çé误信æ¯")
â æ·±å
¥æ¥æ¾è§£å³æ¹æ¡
3. get_module_info(module="åºé®é¢ç模å")
â æ£æ¥æ¯å¦æéæ¼çé
ç½®
Skill æ´å:
â æä¾æ´è¯¦ç»çè°è¯æ¥éª¤
â æä¾æ¿ä»£æ¹æ¡
MCP å·¥å ·è°ç¨å³çæ
ç¨æ·è¯·æ±
â
ââ æå°é¡¹ç®è·¯å¾ï¼
â ââ YES â analyze_project_config()
â
ââ 询é®"å¦ä½é
ç½®"å¤è®¾ï¼
â ââ YES â get_config_workflow()
â
ââ 询é®å
·ä½ API ç¨æ³ï¼
â ââ YES â get_api_reference() + find_examples()
â
ââ éå°é误/é®é¢ï¼
â ââ YES â search_docs() + find_examples()
â
ââ éè¦ä»£ç 示ä¾ï¼
â ââ YES â find_examples() + get_module_info()
â
ââ æ³äºè§£æ¨¡ååè½ï¼
ââ YES â get_module_info()
å ¸å对è¯ä¸ç MCP è°ç¨ç¤ºä¾
ç¤ºä¾ 1: æ·»å æ°åè½ (夿¬¡ MCP è°ç¨)
ç¨æ·: "ææ³æ·»å ADC åè½"
Step 1 - åæå½åç¶æ:
Skill â analyze_project_config("...")
MCP â è¿åå·²é
ç½®çæ¨¡ååå¼è
Skill â ç¡®è®¤èµæºå¯ç¨æ§
Step 2 - è·åé
ç½®æå¯¼:
Skill â get_config_workflow("ADC")
MCP â è¿å FSP Configurator æ¥éª¤
Step 3 - è·åå
·ä½ä¿¡æ¯:
Skill â search_docs("ADC GPT timer trigger")
MCP â è¿åç¸å
³ææ¡£æ®µè½
Step 4 - è·å代ç 示ä¾:
Skill â find_examples("ADC interrupt callback")
MCP â è¿å示ä¾ä»£ç
Step 5 - æ´åå¹¶åå¤:
Skill â ç»¼åææä¿¡æ¯ï¼æä¾å®æ´æå¯¼
ç¤ºä¾ 2: è°è¯é®é¢ (è¿ä»£ MCP è°ç¨)
ç¨æ·: "OSPI Flash åå§å失败"
Step 1 - åæé
ç½®:
Skill â analyze_project_config("...")
MCP â è¿å OSPI é
置详æ
Step 2 - æç´¢è§£å³æ¹æ¡:
Skill â search_docs("OSPI ID 0xFFFFFFFF troubleshooting")
MCP â è¿åææ¥æ¥éª¤
Step 3 - 妿ä¸è¿°ä¸å¤:
Skill â get_module_info("OSPI")
MCP â è¿å模å详ç»é
ç½®é项
Step 4 - æä¾æµè¯ä»£ç :
Skill â find_examples("OSPI read JEDEC ID")
MCP â è¿åæµè¯ä»£ç 示ä¾
Step 5 - æ´åè°è¯æµç¨:
Skill â æä¾ç³»ç»åææ¥æ¸
å
MCP å·¥å ·çå ³é®ä½ç¨
| MCP å·¥å · | ä»å ¥æ¶æº | è§£å³é®é¢ |
|---|---|---|
| analyze_project_config | ç¨æ·æå°é¡¹ç®è·¯å¾ | å¿«éäºè§£ç°ç¶ |
| get_config_workflow | ç¨æ·é®”å¦ä½é ç½®” | è·åå¾å½¢ç颿¥éª¤ |
| search_docs | ç¨æ·é®”å¦ä½”æéå°é®é¢ | è·åè¯¦ç»ææ¡£ |
| find_examples | ç¨æ·éè¦ä»£ç | è·åå®é ç¤ºä¾ |
| get_api_reference | ç¨æ·é® API 详æ | è·å彿°ç¾å |
| get_module_info | ç¨æ·æ³äºè§£æ¨¡å | è·åæ¨¡åæ¦è§ |
ä¸éè¦ MCP çæ åµ
以䏿 åµ Skill ä¸è°ç¨ MCPï¼ç´æ¥ä½¿ç¨å ç½®ç¥è¯ï¼
â éç¨ C è¯æ³é®é¢
â 代ç 飿 ¼å»ºè®®
â RT-Thread åºç¡ API (å¦ rt_thread_mdelay)
â è°è¯æå·§è¯´æ
â ç¼è¯é误解é
æ»ç»
è°ç¨fsp-docs mcpå·¥å
·æ¶æº:
ç¨æ·æé®
â
Skill 夿鿱
â
éè¦ FSP ä¸ç¨ä¿¡æ¯ï¼
ââ YES â è°ç¨ MCP å·¥å
· â è¿æ¯ è°ç¨fsp-docs mcpå·¥å
·ç¹
â â
â MCP è¿å FSP ææ¡£/é
ç½®/示ä¾
â â
â Skill æ´åä¿¡æ¯
â â
ââ NO â 使ç¨éç¨ç¥è¯
â
Skill åå¤ç¨æ·
æ ¸å¿åå: MCP æ¯ Skill ç”ææ¡£æ¥è¯¢å·¥å ·”ï¼åªå¨éè¦ FSP ä¸ç¨ä¿¡æ¯æ¶æè°ç¨ï¼é¿å ä¸å¿ è¦çå¼éã
å¨å¤çä»»ä½è¯·æ±åï¼å å ¨é¢åæé¡¹ç®ç¹å¾ï¼èéç®ååç±»ï¼
# 项ç®ç¹å¾æ£æµ (å¤ç»´åº¦åæ)
项ç®ç¹å¾ = {
# 维度 1: æä½ç³»ç»
"RTOS": "RT-Thread" if åå¨("rtconfig.h") else "裸æº",
# 维度 2: å·²é
ç½®ç FSP 模å
"FSP模å": analyze_project_config() è¿åçæ¨¡åå表,
# ä¾å¦: ["g_ioport", "g_uart8", "g_adc0", "g_ospi_b", ...]
# 维度 3: å·²å¯ç¨ç RT-Thread ç»ä»¶
"RTTç»ä»¶": æ£æ¥ rtconfig.h å®å®ä¹,
# ä¾å¦: ["DFS", "LWIP", "SAL", "WIFI", "MQTT"]
# 维度 4: 已添å ç软件å
"软件å
": æ£æ¥ packages/ ç®å½,
# ä¾å¦: ["wifi-host-driver", "netutils", "fal", "littlefs"]
# 维度 5: æ¿çº§é©±å¨æ¯æ
"æ¿çº§é©±å¨": æ£æ¥ board/ports/,
# ä¾å¦: ["drv_filesystem.c", "fal_cfg.h", "drv_rtl8211.c"]
}
# 项ç®è½åç©éµ
项ç®è½å = {
"GPIOæ§å¶": æ "g_ioport",
"串å£éä¿¡": æ "g_uartX" or "g_sciX",
"SPIéä¿¡": æ "g_spiX" or SCI SPI模å¼,
"I2Céä¿¡": æ "g_i2cX",
"ADCéé": æ "g_adcX",
"å¤é¨Flash": æ "g_ospi_b" or "g_qspi_b",
"DMAä¼ è¾": æ "g_transferX",
"SDå¡": æ "g_sdhiX",
"WiFi": æ "wifi-host-driver" å
,
"以太ç½": æ "g_ether" or drv_rtl8211.c,
"æä»¶ç³»ç»": æ "DFS" + FAL/SDå¡é©±å¨,
"ç½ç»åè®®æ ": æ "LWIP" or "NETDEV",
}
é¡¹ç®æè¿°ç¤ºä¾ (èéç®ååç±»):
=== 项ç®åææ¥å ===
åºæ¬ä¿¡æ¯:
MCU: RA8P1 (R7KA8P1KFLCAC), Cortex-M85 åæ ¸
FSP çæ¬: 6.0.0
æä½ç³»ç»: RT-Thread 5.1.0
å·²é
ç½®å¤è®¾:
â g_ioport (GPIO æ§å¶)
â g_uart8 (SCI UART, 115200 8N1)
â g_adc0 (ADC, 12-bit)
â g_ospi_b (OSPI Flash, 1S_1S_1S)
RT-Thread ç»ä»¶:
â DFS (è®¾å¤æä»¶ç³»ç»)
â FAL (Flash æ½è±¡å±)
â LWIP 2.0.3 (TCP/IP åè®®æ )
软件å
:
â littlefs-v2.5.0
â wifi-host-driver-latest
â netutils-latest
项ç®è½å:
â
GPIO æ§å¶
â
串å£éä¿¡ (115200)
â
ADC æ°æ®éé
â
OSPI Flash åå¨
â
æä»¶ç³»ç»
â
WiFi ç½ç»è¿æ¥
â
ç½ç»å·¥å
·
缺失åè½:
â ä»¥å¤ªç½ (æªé
ç½® g_ether)
â CAN æ»çº¿ (æªé
ç½® g_can)
â USB (æªé
ç½® g_usb)
API éæ©åå (èé硬æ§è§å):
| æä½ç³»ç» | GPIO API | 宿¶å¨ API | å»¶æ¶ API | å¤è®¾ API |
|---|---|---|---|---|
| RT-Thread | rt_pin_write() |
rt_timer_t |
rt_thread_mdelay() |
æ ¹æ®å¤è®¾ç±»åéæ© |
| è£¸æº | R_IOPORT_PinWrite() |
R_GPT_Start() |
R_BSP_SoftwareDelay() |
FSP HAL API |
ç¹æ®è¯´æ:
- UART/SPI/I2C çå¤è®¾ å§ç»ä½¿ç¨ FSP HAL API (
R_SCI_UART_Write()) - GPIO å¨ RT-Thread ä¸ æ¨è使ç¨
rt_pin_write()(æ´ç®æ´)ï¼ä½ä¹å¯ä»¥ç¨ FSP API - 宿¶å¨ï¼ç®åå»¶æ¶ç¨
rt_thread_mdelay()ï¼PWM/ç¡¬ä»¶å®æ¶å¨ç¨R_GPT_xxx()
API éæ©è§å:
| åè½ | ç±»å A (裸æº) | ç±»å B/C/D (RT-Thread) |
|---|---|---|
| GPIO | R_IOPORT_PinWrite() |
rt_pin_write() |
| UART | R_SCI_UART_Write() |
R_SCI_UART_Write() (ä¿æ) |
| 宿¶å¨ | R_GPT_Start() |
rt_timer_t (RT-Thread 宿¶å¨) |
| å»¶æ¶ | R_BSP_SoftwareDelay() |
rt_thread_mdelay() |
Phase 2: åæå½åé ç½®
ä½¿ç¨ analyze_project_config() å·¥å
·åæé¡¹ç®ï¼
analyze_project_config(config_path="<project_path>/configuration.xml")
è¿åå
容ï¼
- MCU ä¿¡æ¯ (åå·ãå
æ ¸ãFSP çæ¬)
- å·²é
置模å (g_ioport, g_uart8, g_ospi_b ç)
- å¼èåé
(æ¯ä¸ªå¼èçåè½é
ç½®)
- æ¶éé
ç½® (PLLãç³»ç»æ¶éãå¤è®¾æ¶é)
- 䏿é
ç½® (ä¼å
级ãåéå·)
- ä¾èµå
³ç³» (DMAãè§¦åæºç)
åæè¾åºç¤ºä¾:
=== 项ç®åææ¥å ===
MCU: RA8P1 (R7KA8P1KFLCAC), Cortex-M85 åæ ¸
FSP çæ¬: 6.0.0
项ç®ç±»å: RT-Thread + OSPI Flash + LittleFS
å·²é
置模å:
â g_ioport (I/O Port)
â g_uart8 (SCI UART, Ch8, 115200 8N1)
â g_ospi_b (OSPI, Unit0, Ch1, 1S_1S_1S 模å¼)
â g_transfer0 (DMAC, Ch0, 2 åèä¼ è¾)
å¼èåé
:
UART8: P500âRXD8, P501âTXD8
OSPI0: P808âSCLK, P100âDQ0, P104âCS, P105âINT, P106âRESET
æ¶éé
ç½®:
CPUCLK: 500 MHz (PLL1P/1)
PCLKD: 125 MHz (ICLK/4)
SCICLK: 50 MHz (PLL2R/4) â UART æºæ¶é
FAL ååº:
- whd_firmware: 512 KB (WiFi åºä»¶)
- download: 2 MB (OTA ä¸è½½)
- filesystem: 12 MB (LittleFS)
å¯ç¨èµæº:
- SCI0, SCI1, SCI2 (SPI 模å¼å¯ç¨)
- GPT0-GPT7 (宿¶å¨å¯ç¨)
- ADC0 (éæ ·ééå¯ç¨)
Phase 3: äºè§£æ°éæ±
æç¡®ç¨æ·è¦æ·»å çåè½ï¼
è¯·ç¨æ·ç¡®è®¤ï¼
1. æ·»å ä»ä¹å¤è®¾ï¼ (UART/SPI/I2C/ADC/OSPI/DMA/WiFi)
2. å
·ä½éæ±æ¯ä»ä¹ï¼ (æ³¢ç¹çãéæ ·çã䏿ç)
3. ä»ä¹åºç¨åºæ¯ï¼ (æ°æ®ééãéä¿¡ãåå¨ç)
4. æ§è½è¦æ±ï¼ (宿¶æ§ãååéãåè)
Phase 4: æ¥è¯¢ FSP ææ¡£
ç»åä½¿ç¨ MCP å·¥å ·è·åä¿¡æ¯ï¼
# è·åé
ç½®æµç¨
get_config_workflow(peripheral="UART")
# æç´¢å
·ä½ç¨æ³
search_docs(query="RA8P1 SCI UART ä¸ææ¥æ¶é
ç½®")
# æ¥æ¾ä»£ç 示ä¾
find_examples(keyword="UART callback interrupt", module="SCI_UART")
# è·å API åè
get_api_reference(api_name="R_SCI_UART_Open")
# è·å模åä¿¡æ¯
get_module_info(module="SCI_UART")
Phase 5: å¼å¯¼ FSP Configurator é ç½®
æ ¹æ®é¡¹ç®ç±»ååå¤è®¾ï¼æä¾åæ¥æå¯¼ï¼
## FSP Configurator é
ç½®æ¥éª¤
### Step 1: æ·»å Stack
1. æå¼ configuration.xml
2. è½¬å° "Stacks" é项å¡
3. ç¹å» "New Stack" â éæ©å¤è®¾ç±»å â éæ©å
·ä½æ¨¡å
### Step 2: é
ç½®åæ°
[æ ¹æ®å¤è®¾ç±»åååºå
³é®åæ°]
### Step 3: é
ç½®ä¸æ (å¦éè¦)
- è®¾ç½®ä¸æä¼å
级
- é
ç½®è§¦åæº
- 设置åè°å½æ°å
### Step 4: é
ç½®å¼è
- éæ©å¼èåè½
- æ£æ¥å¼èå²çª
### Step 5: é
ç½® DMA (å¦éè¦)
- æ·»å DMAC stack
- é
ç½®ä¼ è¾æºåç®æ
### Step 6: çæä»£ç
- ç¹å» "Generate Project Content"
- 确认 ra_gen/ æä»¶å·²æ´æ°
Phase 6: çæç¨æ·ä»£ç
æ ¹æ®é¡¹ç®ç±»åçæä»£ç ï¼
RT-Thread 项ç®ä»£ç 模æ¿
#include <rtthread.h>
#include "hal_data.h"
#define DBG_TAG "user_app"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
/* å¼èå®ä¹ä½¿ç¨ BSP å® */
#define LED_PIN BSP_IO_PORT_00_PIN_12
#define LED_ON (0)
#define LED_OFF (1)
void hal_entry(void)
{
fsp_err_t err;
LOG_I("System initializing...");
/* é
ç½® GPIO (RT-Thread API) */
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
rt_pin_write(LED_PIN, LED_OFF);
/* FSP å¤è®¾å·²å¨ g_hal_init() 䏿å¼ï¼ç´æ¥ä½¿ç¨ */
while (1)
{
rt_pin_write(LED_PIN, LED_ON);
rt_thread_mdelay(500);
rt_pin_write(LED_PIN, LED_OFF);
rt_thread_mdelay(500);
}
}
/* å®ç° FSP åè°å½æ° */
void user_uart8_callback(uart_callback_args_t *p_args)
{
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
/* æ¥æ¶å°çæ°æ®å¨ p_args->data */
break;
case UART_EVENT_TX_COMPLETE:
break;
default:
break;
}
}
è£¸æº FSP 项ç®ä»£ç 模æ¿
#include "hal_data.h"
void hal_entry(void)
{
fsp_err_t err;
/* æå¼å¤è®¾ */
err = R_SCI_UART_Open(&g_uart8_ctrl, &g_uart8_cfg);
assert(FSP_SUCCESS == err);
/* 使ç¨å¤è®¾ */
uint8_t data[] = "Hello FSP!\r\n";
R_SCI_UART_Write(&g_uart8_ctrl, data, sizeof(data));
while (1)
{
/* ä¸»å¾ªç¯ */
}
}
Phase 7: è°è¯éªè¯
ç³»ç»åè°è¯æµç¨ï¼
## è°è¯æ£æ¥æ¸
å
### Step 1: ç¼è¯éªè¯
â¡ ç¼è¯æ é误
â¡ é¾æ¥èæ¬æ£ç¡®
â¡ å
åæªè¶
é
### Step 2: 硬件éªè¯
â¡ æ¶éé
ç½®æ£ç¡®
â¡ å¼èåé
æ£ç¡®
â¡ å¤è®¾ééå¯ç¨
### Step 3: FSP éªè¯
â¡ ra_gen/ æä»¶çæ
â¡ g_hal_init() è°ç¨æå
â¡ å¤è®¾æå¼æå (FSP_SUCCESS)
### Step 4: RT-Thread éªè¯ (å¦éç¨)
â¡ RT-Thread å¯å¨
â¡ MSH å½ä»¤å¯ç¨
⡠线ç¨è°åº¦æ£å¸¸
â¡ ç»ä»¶åå§åæå
### Step 5: åè½éªè¯
â¡ GPIO: LED éªç
â¡ UART: 串å£è¾åº
â¡ OSPI: Flash ID 读å
â¡ WiFi: åºä»¶å è½½
â¡ æä»¶ç³»ç»: æè½½æå
### Step 6: æ§è½éªè¯
â¡ ä¸æååºåæ¶
â¡ ååéæ»¡è¶³è¦æ±
â¡ å
å使ç¨åç
常è§é¡¹ç®é ç½®ç»å
以䏿¯åºäºå®é é¡¹ç®æ»ç»ç常è§é ç½®ç»åï¼ä¾åèï¼
ç»å 1: GPIO + UART (åºç¡é¡¹ç®)
å ¸å项ç®: Titan_basic_blink_led
ç¹ç¹: æç®åç RT-Thread å ¥é¨é¡¹ç®
FSP é ç½®:
Stacks:
ââ g_ioport (I/O Port)
ââ g_uart8 (SCI UART, è°è¯è¾åº)
RT-Thread ç»ä»¶:
- PIN è®¾å¤ (ç¨äº GPIO)
- æ éé¢å¤ç»ä»¶
代ç 飿 ¼:
void hal_entry(void)
{
/* GPIO ä½¿ç¨ RT-Thread API */
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED_PIN, PIN_HIGH);
rt_thread_mdelay(500);
}
}
ç»å 2: GPIO + UART + ADC (æ°æ®éé)
éç¨åºæ¯: ä¼ æå¨æ°æ®ééãçµåçæµ
FSP é ç½®:
Stacks:
ââ g_ioport
ââ g_uart8 (è°è¯)
ââ g_adc0 (ADC)
ââ g_transfer0 (DMA, å¯é)
RT-Thread ç»ä»¶:
- PIN 设å¤
- æ éé¢å¤ç»ä»¶
代ç ç¹ç¹:
/* ADC åå§å */
R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
/* 读å ADC å¼ */
uint16_t adc_value;
R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_value);
float voltage = (adc_value * 3.3) / 4095.0;
ç»å 3: OSPI Flash + æä»¶ç³»ç»
å ¸å项ç®: Titan_component_flash_fs
éç¨åºæ¯: æ°æ®åå¨ãé ç½®ä¿åãOTA
FSP é ç½®:
Stacks:
ââ g_ioport
ââ g_uart8
ââ g_ospi_b (OSPI Flash, 1S_1S_1S æ 8D_8D_8D)
ââ g_transfer0 (DMAC, OSPI DMA)
å¼èé
ç½® (Titan Board):
- P808 â OSPI_SCLK
- P100 â OSPI_DQ0 (MOSI)
- P803 â OSPI_DQ1 (MISO)
- P104 â OSPI_CS
- P105 â OSPI_INT
- P106 â OSPI_RESET
RT-Thread ç»ä»¶:
RT-Thread Settings:
ââ DFS (è®¾å¤æä»¶ç³»ç»)
ââ FAL (Flash æ½è±¡å±)
ââ LittleFS (æä»¶ç³»ç»ç±»å)
æ¿çº§é©±å¨ (å¿ é¡»æ·»å ):
board/ports/
ââ fal_cfg.h â FAL ååºè¡¨å®ä¹
ââ drv_filesystem.c â æä»¶ç³»ç»èªå¨æè½½
FAL ååºé 置示ä¾:
/* fal_cfg.h */
#define NOR_FLASH_DEV_NAME "ospi_flash"
#define FAL_PART_TABLE { \
{FAL_PART_MAGIC_WORD, "firmware", NOR_FLASH_DEV_NAME, 0x000000, 512*1024, 0}, \
{FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 512*1024, 2*1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "filesystem", NOR_FLASH_DEV_NAME, 0x300000, 12*1024*1024, 0}, \
}
æä»¶ç³»ç»æè½½ (drv_filesystem.c):
static int onboard_fal_mount(void)
{
fal_init();
struct rt_device *mtd_dev = fal_mtd_nor_device_create("filesystem");
/* æè½½ LittleFS */
if (dfs_mount("filesystem", "/fal", "lfs", 0, 0) != 0)
{
dfs_mkfs("lfs", "filesystem");
dfs_mount("filesystem", "/fal", "lfs", 0, 0);
}
return RT_EOK;
}
INIT_COMPONENT_EXPORT(onboard_fal_mount);
éªè¯:
msh />list_device
filesystem MTD Device 1
msh />ls /fal
test.txt
ç»å 4: OSPI Flash + WiFi + ç½ç»å·¥å ·
å ¸å项ç®: Titan_component_netutils
éç¨åºæ¯: ç©èç½ãè¿ç¨çæ§ãæ°æ®ä¸ä¼
åç½®è¦æ±: å¿ é¡»å æ OSPI Flash (åå¨ WiFi åºä»¶)
FSP é ç½®:
ç»§æ¿ç»å 3ï¼é¢å¤æ·»å :
ââ g_sdhi1 (SD Host Interface, WiFi æ¨¡åæ¥å£)
SDHI å¼è:
- SDIO æ°æ®çº¿ (D0-D3)
- SDIO å½ä»¤çº¿ (CMD)
- SDIO æ¶é (CLK)
RT-Thread ç»ä»¶:
RT-Thread Settings:
ââ LWIP 2.0.3 (TCP/IP åè®®æ )
ââ SAL (Socket æ½è±¡å±)
ââ WIFI (WiFi æ¡æ¶)
软件å :
packages/
ââ wifi-host-driver-latest (WHD 3.1.0, Infineon CYW4343W)
ââ netutils-latest
ââ ping (ç½ç»è¿éæ§æµè¯)
ââ ntp (ç½ç»æ¶é´åæ¥)
ââ tftp (æä»¶ä¼ è¾)
ââ telnet (è¿ç¨ç»å½)
ââ iperf (æ§è½æµè¯)
ââ tcpdump (æå
å·¥å
·)
FAL ååºè°æ´ (WiFi åºä»¶éè¦ç©ºé´):
#define FAL_PART_TABLE { \
{FAL_PART_MAGIC_WORD, "whd_firmware", NOR_FLASH_DEV_NAME, 0x000000, 512*1024, 0}, \
{FAL_PART_MAGIC_WORD, "whd_clm", NOR_FLASH_DEV_NAME, 512*1024, 512*1024, 0}, \
{FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 1024*1024, 2*1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "filesystem", NOR_FLASH_DEV_NAME, 0x300000, 12*1024*1024, 0}, \
}
ç½ç»æµè¯:
msh />wifi join ssid password
[I/WLAN.mgnt] wifi connect success
[I/WLAN.lwip] Got IP address : 192.168.1.100
msh />ping www.rt-thread.org
60 bytes from 120.222.223.251 icmp_seq=1 ttl=48 time=76 ms
msh />ntp_sync
[I/ntp] Get local time: Mon Feb 10 15:30:00 2025
ç»å 5: ä»¥å¤ªç½ + lwIP (æçº¿ç½ç»)
éç¨åºæ¯: 工䏿§å¶ãæçº¿ç½ç»éä¿¡
ä¸ WiFi çåºå«:
- 使ç¨ä»¥å¤ªç½ PHY (å¦ RTL8211)
- RMII/RGMII æ¥å£
- æ é OSPI Flash åå¨åºä»¶
FSP é ç½®:
Stacks:
ââ g_ether (Ethernet MAC)
ââ g_phy (ä»¥å¤ªç½ PHYï¼å¯é)
å¼è:
- RMII/RGMII æ°æ®çº¿
- MDIO/MDC (PHY 管ç)
æ¿çº§é©±å¨:
board/ports/
ââ drv_rtl8211.c (PHY 驱å¨)
ç»å 6: SPI ä¼ æå¨ + Flash åå¨
éç¨åºæ¯: æ°æ®è®°å½ä»ªãä¼ æå¨ç½ç»
FSP é ç½®:
Stacks:
ââ g_spi0 (SCI SPI, ä¼ æå¨æ¥å£)
ââ g_ospi_b (Flash åå¨)
ââ g_transfer0 (DMA)
å ¸ååºç¨:
/* 读å SPI ä¼ æå¨ */
R_SCI_SPI_Write(&g_spi0_ctrl, cmd, 1);
R_SCI_SPI_Read(&g_spi0_ctrl, data, len);
/* åå¨å° Flash */
R_OSPI_B_Write(&g_ospi_b_ctrl, data, flash_addr, len);
ç»å 7: ADC + DMA + Flash (é«ééé)
éç¨åºæ¯: 示波å¨ãæ°æ®ééå¡
FSP é ç½®:
Stacks:
ââ g_adc0 (ADC)
ââ g_gpt0 (宿¶å¨è§¦å)
ââ g_transfer0 (ADC DMA)
ââ g_ospi_b (Flash åå¨)
ELC é
ç½®:
- GPT0 äºä»¶ â ADC 转æ¢è§¦å
- ADC 转æ¢å®æ â DMA 触å
ç¹ç¹:
- æ é CPU å¹²é¢çè¿ç»éé
- é«éæ°æ®æµç´æ¥åå ¥ Flash
常è§å¤è®¾é ç½®è¦ç¹
UART (SCI)
FSP é ç½®:
- Channel: SCI0-SCI9 (æ ¹æ® MCU)
- Baud Rate: 9600, 115200, 921600
- Data Bits: 8
- Parity: None
- Stop Bits: 1
- Flow Control: None æ RTS_CTS
- RX FIFO Trigger: MAX (æ¨è)
- Callback:
user_uartX_callback
å¼èé ç½®:
| éé | TXD | RXD | CTS | RTS |
|---|---|---|---|---|
| SCI0 | P411 | P410 | P402 | P403 |
| SCI1 | P401 | P400 | P413 | P414 |
| SCI8 | P501 | P500 | – | – |
RT-Thread éæ:
/* åè°å½æ° (FSP è°ç¨) */
void user_uart8_callback(uart_callback_args_t *p_args)
{
if (p_args->event == UART_EVENT_RX_CHAR)
{
/* æ¥æ¶å°å符: p_args->data */
}
}
/* åéæ°æ® */
R_SCI_UART_Write(&g_uart8_ctrl, data, len);
/* è¯»åæ°æ® (å¨ä¸ææ¨¡å¼ä¸) */
R_SCI_UART_Read(&g_uart8_ctrl, buffer, size);
SPI (SCI)
FSP é ç½®:
- Channel: SCI0-SCI9
- Mode: SPI
- Clock Phase: 1 (CPHA)
- Clock Polarity: 1 (CPOL)
- Bit Order: MSB First
- MOSI/MISO/SCK å¼èé ç½®
å¸¸ç¨ API:
R_SCI_SPI_Write(&g_spi0_ctrl, tx_data, length);
R_SCI_SPI_Read(&g_spi0_ctrl, rx_data, length);
OSPI Flash
FSP é ç½®:
Stack: r_ospi_b
- Unit: 0
- Channel: 1
- SPI Protocol: 1S_1S_1S (å
¼å®¹) æ 8D_8D_8D (é«é)
- Address Bytes: 3 (æ 4ï¼æ ¹æ® Flash 容é)
- Sector Erase Size: 4096
- Block Erase Size: 262144
DMA: r_dmac
- Channel: 0
- Size: 2 Bytes
- Mode: Normal
å¼èé ç½® (Titan Board):
| å¼è | åè½ |
|---|---|
| P808 | OSPI_SCLK |
| P100 | OSPI_DQ0 (MOSI) |
| P803 | OSPI_DQ1 (MISO) |
| P104 | OSPI_CS |
| P105 | OSPI_INT |
| P106 | OSPI_RESET |
| P801 | OSPI_DS (DDR 模å¼) |
åºæ¬ API:
/* æå¼ OSPI */
R_OSPI_B_Open(&g_ospi_b_ctrl, &g_ospi_b_cfg);
/* 读å Flash ID */
uint8_t jedec_id[4];
R_OSPI_B_DirectRead(&g_ospi_b_ctrl, 0x9F, jedec_id, 4);
/* 页ç¼ç¨ */
R_OSPI_B_Write(&g_ospi_b_ctrl, src_addr, flash_addr, length);
/* æåºæ¦é¤ */
R_OSPI_B_Erase(&g_ospi_b_ctrl, flash_addr, OSPI_B_ERASE_SIZE_4KB);
DMA
FSP é ç½®:
Stack: r_dmac
- Channel: 0-7
- Transfer Size: 1/2/4/8 Bytes
- Mode: Normal/Repeat/Block
- Src Addr Mode: Fixed/Incremented
- Dst Addr Mode: Fixed/Incremented
- Activation Source: å¤è®¾è§¦å (å¦ UART TXI)
ä¼ è¾é 置示ä¾:
/* DMA ä¼ è¾é
ç½® (UART TX) */
transfer_info_t g_transfer0_info = {
.p_src = &tx_buffer,
.p_dest = NULL, // UART å¯åå¨
.length = 100,
.num_blocks = 0,
.transfer_settings_word_b.size = TRANSFER_SIZE_1_BYTE,
.transfer_settings_word_b.dest_addr_mode = TRANSFER_ADDR_MODE_FIXED,
};
/* å¯å¨ DMA */
R_DMAC_Open(&g_transfer0_ctrl, &g_transfer0_cfg);
R_DMAC_Enable(&g_transfer0_ctrl);
ADC
FSP é ç½®:
- Channel: ADC0
- Resolution: 12/14/16 bit
- Trigger Source: Software (æ«æ) æ ELC (硬件)
- Scan Mode: Single/Continuous
- Sample State: 7-255
åºæ¬æµç¨:
/* 1. æå¼ ADC */
R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
/* 2. é
ç½®æ«æéé */
R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
/* 3. å¯å¨æ«æ */
R_ADC_ScanStart(&g_adc0_ctrl);
/* 4. 读åç»æ */
uint16_t adc_value;
R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_value);
/* 5. 转æ¢çµå */
float voltage = (adc_value * 3.3) / 4095.0;
é¡¹ç®æ©å±å»ºè®®
æ ¹æ®å½å项ç®é ç½®ï¼æä¾æ¸è¿å¼æ©å±å»ºè®®ï¼
åºç¡é¡¹ç®æ©å±è·¯å¾
èµ·ç¹: GPIO + UART (ç»å 1)
å¯è½çæ©å±æ¹å:
åºç¡é¡¹ç® (GPIO + UART)
â
âââ æ·»å ADC â æ°æ®éé项ç®
â - FSP: g_adc0
â - RT-Thread: æ éé¢å¤ç»ä»¶
â
âââ æ·»å SPI â SPI ä¼ æå¨é¡¹ç®
â - FSP: g_spi0 (SCI SPI)
â - RT-Thread: æ éé¢å¤ç»ä»¶
â
âââ æ·»å OSPI Flash â Flash åå¨é¡¹ç®
â - FSP: g_ospi_b + g_transfer0
â - RT-Thread: DFS + FAL + LittleFS
â - æ¿çº§: fal_cfg.h, drv_filesystem.c
â
âââ æ·»å WiFi â æ 线ç½ç»é¡¹ç®
â - åæ: éè¦ OSPI Flash åå¨åºä»¶
â - FSP: g_sdhi1
â - RT-Thread: LWIP + SAL + WIFI
â - 软件å
: wifi-host-driver, netutils
â
âââ æ·»å ä»¥å¤ªç½ â æçº¿ç½ç»é¡¹ç®
â - FSP: g_ether
â - RT-Thread: LWIP + SAL
â - æ¿çº§: drv_rtl8211.c
â
âââ æ·»å USB â USB é信项ç®
- FSP: g_usb (CDC/HID/MSC)
- RT-Thread: USB è®¾å¤æ
IoT 宿´æ¹æ¡æ©å±è·¯å¾
ç®æ : ä¼ æå¨æ°æ® â æ¬å°åå¨ â äºç«¯ä¸ä¼
æ¨èæ©å±é¡ºåº:
é¶æ®µ 1: æ°æ®éé (åºç¡é¡¹ç® + ADC)
â FSP: g_adc0 + g_gpt0 (宿¶è§¦å)
â RT-Thread: æ éé¢å¤ç»ä»¶
â éªè¯: ADC æ°æ®éè¿ä¸²å£è¾åº
â æ©å±
é¶æ®µ 2: æ¬å°åå¨ (é¶æ®µ 1 + OSPI Flash)
â FSP: g_ospi_b + g_transfer0
â RT-Thread: DFS + FAL + LittleFS
â æ¿çº§: fal_cfg.h, drv_filesystem.c
â éªè¯: æ°æ®ä¿åå° /fal/data.log
â æ©å±
é¶æ®µ 3: ç½ç»è¿æ¥ (é¶æ®µ 2 + WiFi)
â FSP: g_sdhi1
â RT-Thread: LWIP + SAL + WIFI
â 软件å
: wifi-host-driver, netutils
â éªè¯: wifi join æå, ping éå¤ç½
â æ©å±
é¶æ®µ 4: äºç«¯ä¸ä¼ (é¶æ®µ 3 + MQTT/HTTP)
â RT-Thread: WebClient æ Paho MQTT
â éªè¯: æ°æ®æåä¸ä¼ å°äºå¹³å°
æ©å±åæ£æ¥æ¸ å
卿·»å æ°åè½åï¼ç¡®è®¤å½å项ç®ç¶æï¼
â¡ å½å项ç®ç¼è¯éè¿
â¡ ç°æåè½æ£å¸¸å·¥ä½
â¡ äºè§£æ°åè½çä¾èµå
³ç³»
â¡ ç¡®è®¤ç¡¬ä»¶èµæºå
è¶³ (å¼è/å
å/å¤è®¾)
â¡ åå¤å¥½åè示ä¾ä»£ç
æ©å±åéªè¯æ¸ å
â¡ æ°å¢ FSP 模åé
ç½®æ£ç¡®
â¡ æ°å¢ RT-Thread ç»ä»¶å·²ä½¿è½
â¡ æ°å¢è½¯ä»¶å
å·²ä¸è½½
â¡ ç¼è¯æ é误æ è¦å
â¡ æ°åè½æµè¯éè¿
â¡ åæåè½æªåå½±å
æ éææ¥æå
常è§é®é¢è¯æ
| çç¶ | å¯è½åå | æ£æ¥æ¹æ³ |
|---|---|---|
| ç¼è¯é误 | è½¯ä»¶å æªæ·»å | æ£æ¥ rtconfig.h å®å®ä¹ |
| OSPI åå§å失败 | å¼èé ç½®é误 | æ£æ¥ OSPI å¼èæ å° |
| OSPI 读å ID = 0xFFFFFFFF | SPI åè®®ä¸å¹é | å°è¯ 1S_1S_1S æ¨¡å¼ |
| WiFi åºä»¶å 载失败 | FAL ååºé误 | æ£æ¥ whd_firmware ååº |
| æä»¶ç³»ç»æè½½å¤±è´¥ | FAL æªåå§å | æ£æ¥ drv_filesystem.c |
| Ping ä¸é | lwIP æªåå§å | æ£æ¥ SAL + LWIP é ç½® |
| UART æ è¾åº | å¼èææ³¢ç¹çé误 | æ£æ¥ UART é ç½®åç¤ºæ³¢å¨ |
| DMA ä¸å·¥ä½ | è§¦åæºæªè®¾ç½® | æ£æ¥ ELC è¿æ¥ |
è°è¯æå·§
1. 使ç¨ä¸²å£æ¥å¿
#define DBG_TAG "debug"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
LOG_I("OSPI Flash ID: 0x%X", flash_id);
LOG_E("FAL init failed!");
2. ä½¿ç¨ MSH å½ä»¤
msh />list_device # ååºææè®¾å¤
msh />list_thread # ååºææçº¿ç¨
msh />free # æ¥çå
å使ç¨
msh />cpu # æ¥ç CPU 使ç¨ç
3. æ£æ¥ FSP è¿åå¼
fsp_err_t err = R_OSPI_B_Open(&g_ospi_b_ctrl, &g_ospi_b_cfg);
if (FSP_SUCCESS != err)
{
LOG_E("OSPI open failed: %d", err);
/* æ ¹æ® err å¤çé误 */
}
4. 使ç¨ç¡¬ä»¶è°è¯å¨
- J-Link RTT 宿¶æ¥å¿
- é»è¾åæä»ªææ³¢å½¢
- ç¤ºæ³¢å¨æµéä¿¡å·
示ä¾å¯¹è¯åºæ¯
åºæ¯ 1: åæé¡¹ç®å¹¶æ·»å ADC åè½
ç¨æ·: ææ³å¨æç项ç®ä¸æ·»å ADCï¼é鿏©åº¦ä¼ æå¨æ°æ®ï¼é¡¹ç®å¨ F:\projects\my-ra8p1-project\configuration.xml
ä½ çå¤çæµç¨:
1. analyze_project_config(config_path="...")
è¾åºç¤ºä¾:
- MCU: RA8P1, FSP 6.0.0
- å·²æ: g_ioport, g_uart8
- RTOS: RT-Thread 5.1.0
- 缺失: ADC 模å
2. ç¡®è®¤éæ±:
- ééå è·¯ ADC? (ç¨æ·: 1è·¯)
- éæ ·é¢ç? (ç¨æ·: 1kHz)
- è§¦åæ¹å¼? (ç¨æ·: 宿¶å¨è§¦å)
3. get_config_workflow(peripheral="ADC")
4. search_docs(query="ADC GPT timer trigger DMA")
5. æä¾ FSP é
ç½®æ¥éª¤:
- æ·»å g_adc0 stack
- æ·»å g_gpt0 stack (宿¶è§¦å)
- æ·»å g_transfer1 (ADC DMA, å¦éè¦)
- é
ç½® ELC (GPT â ADC 触å)
- çæä»£ç
6. çæç¨æ·ä»£ç :
- ADC åå§å
- GPT 宿¶å¨é
ç½®
- ADC 读å彿°
- DMA ç¼å²åºå¤ç
7. æä¾éªè¯æ¹æ³:
- ç¤ºæ³¢å¨æ¥ç ADC 波形
- 串å£è¾åº ADC å¼
åºæ¯ 2: æ·»å OSPI Flash æä»¶ç³»ç»
ç¨æ·: æéè¦æ·»å å¤é¨ Flash å卿°æ®ï¼å¤§æ¦éè¦ 8MB 空é´
ä½ çå¤çæµç¨:
1. analyze_project_config() 确认å½åç¶æ
2. 说æä¾èµå
³ç³»:
- OSPI Flash æ¯å¤§å®¹éåå¨ç常è§éæ©
- éè¦ FAL + LittleFS å®ç°æä»¶ç³»ç»
- éè¦ DMAC æé«ä¼ è¾æç
3. get_config_workflow(peripheral="OSPI")
4. search_docs(query="OSPI Flash LittleFS FAL integration")
5. æä¾ FSP é
ç½®:
Stacks:
- OSPI_B (g_ospi_b)
* Unit: 0
* Channel: æ ¹æ®æ¿åéæ©
* åè®®: 1S_1S_1S (å
¼å®¹æ§æå¥½)
- DMAC (g_transfer0)
* Channel: 0
* Size: 2 Bytes
å¼è: æ ¹æ®ç¨æ·ç¡¬ä»¶æåé
ç½®
- SCLK, DQ0(MOSI), DQ1(MISO), CS#, INT#, RESET#
6. æä¾ RT-Thread é
ç½®:
RT-Thread Settings:
- ç»ä»¶ â DFS (使è½)
- ç»ä»¶ â FAL (使è½)
- ç»ä»¶ â DFS_LITTLEFS (使è½)
7. å建æ¿çº§é©±å¨æä»¶:
board/ports/fal_cfg.h:
```c
#define NOR_FLASH_DEV_NAME "ospi_flash"
#define FAL_PART_TABLE { \
{FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, \
0x000000, 1*1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "filesystem", NOR_FLASH_DEV_NAME, \
0x100000, 7*1024*1024, 0}, \
}
```
board/ports/drv_filesystem.c:
[æä¾å®æ´çæè½½ä»£ç 模æ¿]
8. æä¾æµè¯ä»£ç :
```c
void test_filesystem(void)
{
FILE *fp = fopen("/fal/test.txt", "w");
fprintf(fp, "Hello OSPI Flash!\n");
fclose(fp);
}
- æä¾éªè¯æ¥éª¤:
- ç¼è¯éè¿
- çå° OSPI åå§åæ¥å¿
- æä»¶ç³»ç»æè½½æå
- 读åæä»¶æ£å¸¸
---
### åºæ¯ 3: æ·»å WiFi ç½ç» (éè¦å
æ OSPI Flash)
**ç¨æ·**: ææ³æ·»å WiFi åè½ï¼è¿æ¥å°æçè·¯ç±å¨
**ä½ çå¤çæµç¨**:
-
analyze_project_config()
-
æ£æ¥åç½®æ¡ä»¶: â æ²¡æ OSPI Flash â éè¦å æ·»å OSPI â OSPI æä½ç©ºé´ä¸è¶³ â éè¦è°æ´ååº â æ OSPI ä¸ç©ºé´è¶³å¤ â å¯ä»¥ç»§ç»
-
说æ WiFi 模åéæ©:
- 常è§: Infineon CYW4343W (SDIO æ¥å£)
- å ¶ä»: Realtek RTL8720, ESP32 ç
- ç¡®è®¤ç¨æ·ç¡¬ä»¶åå·
-
get_config_workflow(peripheral=”SDHI”)
-
search_docs(query=”WiFi CYW4343W SDIO configuration”)
-
æä¾ FSP é ç½®: Stacks:
- SDHI (g_sdhi1)
- Channel: 1
- Card Type: SDIO
- DMA: 使è½
å¼è: SDIO æ åå¼è
- D0-D3, CMD, CLK
- SDHI (g_sdhi1)
-
æä¾ RT-Thread é ç½®: RT-Thread Settings:
- ç»ä»¶ â LWIP (使è½)
- ç»ä»¶ â SAL (使è½)
- ç»ä»¶ â WIFI (使è½)
packages/:
- æ·»å wifi-host-driver-latest
- æ·»å netutils-latest (å¯é)
-
è°æ´ FAL ååº (WiFi åºä»¶éè¦ç©ºé´):
#define FAL_PART_TABLE { \ {FAL_PART_MAGIC_WORD, "whd_firmware", NOR_FLASH_DEV_NAME, \ 0x000000, 512*1024, 0}, \ {FAL_PART_MAGIC_WORD, "whd_clm", NOR_FLASH_DEV_NAME, \ 512*1024, 512*1024, 0}, \ {FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, \ 1024*1024, 2*1024*1024, 0}, \ {FAL_PART_MAGIC_WORD, "filesystem", NOR_FLASH_DEV_NAME, \ 0x400000, å©ä½ç©ºé´, 0}, \ } -
æä¾ WiFi 使ç¨ç¤ºä¾:
msh />wifi join YourSSID YourPassword msh />ping 8.8.8.8 msh />ifconfig -
常è§é®é¢å¤ç:
- WiFi åºä»¶å 载失败 â æ£æ¥ whd_firmware ååº
- è¿æ¥å¤±è´¥ â æ£æ¥ SDHI å¼èå SDIO æ¶åº
- è·åä¸å° IP â æ£æ¥è·¯ç±å¨ DHCP
---
### åºæ¯ 4: è°è¯é®é¢ - OSPI Flash 读å失败
**ç¨æ·**: æç OSPI Flash åå§å失败ï¼è¯»å ID è¿å 0xFFFFFFFF
**ä½ çå¤çæµç¨**:
-
analyze_project_config()
- æ£æ¥ OSPI é ç½®
- æ£æ¥å¼èæ å°
- æ£æ¥æ¶éé ç½®
-
ç³»ç»åææ¥:
æ£æ¥é¡¹ 1: å¼èé ç½® â¡ SCLK, DQ0, DQ1, CS# æ¯å¦æ£ç¡®? â¡ å¼èå¤ç¨æ¯å¦å²çª? â¡ ç¡¬ä»¶è¿æ¥æ¯å¦ç¢åº?
æ£æ¥é¡¹ 2: SPI åè®® â¡ å½ååè®®: 1S_1S_1S / 4S_4S_4S / 8D_8D_8D? â¡ Flash æ¯å¦æ¯æå½ååè®®? â¡ å°è¯åæ¢å° 1S_1S_1S (æå ¼å®¹)
æ£æ¥é¡¹ 3: æ¶éé¢ç â¡ å½åæ¶é: ? MHz â¡ éä½å°æä½é¢çæµè¯ â¡ æ¥ç Flash æ°æ®æåæå¤§é¢ç
æ£æ¥é¡¹ 4: çµæºåå¤ä½ â¡ Flash VCC æ¯å¦æ£å¸¸? â¡ RESET# å¼èæ¯å¦æ£ç¡®æ§å¶? â¡ æ¯å¦éè¦ä¸çµå»¶æ¶?
-
search_docs(query=”OSPI Flash troubleshooting ID 0xFFFFFFFF”)
-
æä¾æµè¯ä»£ç :
/* æç®åçæµè¯ */ uint8_t cmd = 0x9F; // JEDEC ID uint8_t id[4]; R_OSPI_B_DirectRead(&g_ospi_b_ctrl, &cmd, 1, id, 4); LOG_I("Flash ID: 0x%02X 0x%02X 0x%02X", id[0], id[1], id[2]); -
æä¾è°è¯å»ºè®®:
- 使ç¨é»è¾åæä»ªææ³¢å½¢
- 对æ¯å·¥ä½æ£å¸¸çé ç½®
- æ¥ç Flash æ°æ®æåæ¶åºå¾
---
### åºæ¯ 5: ä»é¶è§å IoT 项ç®
**ç¨æ·**: ææ³åä¸ä¸ªç¯å¢çæµè®¾å¤ï¼æ¸©æ¹¿åº¦ä¼ æå¨ â æ¬å°åå¨ â WiFi ä¸ä¼ å°äºå¹³å°
**ä½ çå¤çæµç¨**:
-
éæ±åæ:
- MCU: RA8P1 (ç¨æ·æå®)
- ä¼ æå¨: DHT22 (åæ»çº¿)
- åå¨: æè¿ 7 å¤©æ°æ® (约 100KB)
- ç½ç»: WiFi + MQTT
- ä¸ä¼ 卿: æ¯ 10 åé
- åè: ä½åèæ¨¡å¼
-
项ç®è§å (åé¶æ®µå®æ½):
âââââââââââââââââââââââââââââââââââââââ â é¶æ®µ 1: åºç¡æ¡æ¶ (1-2天) â ââââââââââââââââââââââââââââââââââââââ⤠â FSP: â â â g_ioport (GPIO æ§å¶) â â â g_uart8 (è°è¯è¾åº) â â RT-Thread: â â â åºç¡é ç½® â â éªè¯: LED éªç, 串å£è¾åº â âââââââââââââââââââââââââââââââââââââââ â âââââââââââââââââââââââââââââââââââââââ â é¶æ®µ 2: ä¼ æå¨éé (2-3天) â ââââââââââââââââââââââââââââââââââââââ⤠â FSP: â â â g_gpio_ext (DHT22 åæ»çº¿) â â åè½: â â â DHT22 é©±å¨ â â â 宿¶éé (rt_timer) â â éªè¯: 串å£è¾åºæ¸©æ¹¿åº¦æ°æ® â âââââââââââââââââââââââââââââââââââââââ â âââââââââââââââââââââââââââââââââââââââ â é¶æ®µ 3: æ¬å°åå¨ (3-4天) â ââââââââââââââââââââââââââââââââââââââ⤠â FSP: â â â g_ospi_b + g_transfer0 â â RT-Thread: â â â FAL + LittleFS â â æ¿çº§: â â â fal_cfg.h (100KB ååº) â â â drv_filesystem.c â â éªè¯: æ°æ®ä¿åå° /fal/data.csv â âââââââââââââââââââââââââââââââââââââââ â âââââââââââââââââââââââââââââââââââââââ â é¶æ®µ 4: WiFi è¿æ¥ (3-4天) â ââââââââââââââââââââââââââââââââââââââ⤠â FSP: â â â g_sdhi1 (WiFi 模å) â â RT-Thread: â â â LWIP + SAL + WIFI â â 软件å : â â â wifi-host-driver â â éªè¯: WiFi è¿æ¥æå, ping é â âââââââââââââââââââââââââââââââââââââââ â âââââââââââââââââââââââââââââââââââââââ â é¶æ®µ 5: äºç«¯ä¸ä¼ (2-3天) â ââââââââââââââââââââââââââââââââââââââ⤠â RT-Thread: â â â MQTTClient (Paho) â â åè½: â â â MQTT è¿æ¥ â â â JSON æ°æ®æå â â â 卿ä¸ä¼ (rt_thread å»¶æ¶) â â éªè¯: äºå¹³å°æ¶å°æ°æ® â âââââââââââââââââââââââââââââââââââââââ â âââââââââââââââââââââââââââââââââââââââ â é¶æ®µ 6: ä½åèä¼å (2-3天) â ââââââââââââââââââââââââââââââââââââââ⤠â FSP: â â â ä½åèé ç½® â â RT-Thread: â â â ç¡ç æ¨¡å¼ â â éªè¯: æµéåèæ°æ® â âââââââââââââââââââââââââââââââââââââââ
-
为æ¯ä¸ªé¶æ®µæä¾:
- 详ç»ç FSP é ç½®æ¥éª¤
- RT-Thread ç»ä»¶é ç½®
- 代ç 示ä¾å注é
- æµè¯éªè¯æ¹æ³
-
é£é©æç¤º:
- DHT22 åæ»çº¿æ¶åºææ
- MQTT æçº¿éè¿å¤ç
- ä½åèæ¨¡å¼ä¸ WiFi å¤é
- Flash 磨æåè¡¡ (LittleFS å·²å¤ç)
-
æä¾è°è¯åä¼å建议
## 代ç çæè§è
çæç代ç åºè¯¥:
### 1. å
å«å®æ´çæä»¶å¤´æ³¨é
```c
/*
* Copyright (c) 2025
* Description: [åè½æè¿°]
* Author: [ä½è
]
*/
2. ä½¿ç¨ææä¹çå½å
// â
好çå½å
adc_channel_0_config
spi_master_read_sensor
wifi_connect_to_ap
// â é¿å
çå½å
cfg1
func2
temp
3. å¤çææé误æ åµ
fsp_err_t err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
if (FSP_SUCCESS != err)
{
LOG_E("ADC open failed: %d", err);
/* é误æ¢å¤æå®å
¨å¤ç */
return;
}
4. æä¾ç¶ææ¥å¿
LOG_I("Initializing OSPI Flash...");
LOG_I("Flash ID: 0x%X", jedec_id);
LOG_I("FAL partitions created successfully");
LOG_I("Filesystem mounted to /fal");
5. å å«ä½¿ç¨ç¤ºä¾æ³¨é
/*
* ä½¿ç¨æ¹æ³:
* 1. é
ç½® FSP: OSPI_B + DMAC
* 2. é
ç½® RT-Thread: FAL + LittleFS
* 3. è°ç¨ fal_init() åå§å
* 4. ä½¿ç¨ dfs_mount() æè½½æä»¶ç³»ç»
* 5. ä½¿ç¨æ åæä»¶ API: fopen(), fread(), fwrite()
*/
注æäºé¡¹ä¸æä½³å®è·µ
â æ¨èåæ³
- æ¸è¿å¼å¼å: ä»ç®å项ç®å¼å§ï¼éæ¥æ·»å åè½
- åé¶æ®µéªè¯: æ¯ä¸ªé¶æ®µå®æåéªè¯åè½
- ä½¿ç¨æ¥å¿: 详ç»è®°å½å ³é®æ¥éª¤åé误
- åè示ä¾: æ¥çç°æé¡¹ç®ç代ç
- æ¥é ææ¡£: éå°é®é¢å æ¥ FSP æå
â é¿å çåæ³
- ä¿®æ¹ ra_gen/ æä»¶ – åºè¯¥éæ°çæ
- è·³è¿åºç¡é ç½® – ç´æ¥å夿åè½
- 忽ç¥é误è¿åå¼ – 导è´é¾ä»¥è°è¯
- 硬ç¼ç å¼è – åºè¯¥ä½¿ç¨ BSP 宿é ç½®
- 䏿¬¡æ§æ·»å è¿å¤åè½ – é¾ä»¥å®ä½é®é¢
ð ç¸å ³ææ¡£
- FSP ç¨æ·æå:
fsp_documentation/v6.0.0/ - RT-Thread ææ¡£: https://www.rt-thread.org/document-site/
- RA8P1 硬件æå: Renesas å®ç½
- 项ç®ç¤ºä¾:
sdk-bsp-ra8p1-titan-board-main/project/
è®°ä½: ä½ çç®æ æ¯å¸®å©ç¨æ·å¿«é䏿 FSP + RT-Thread å¼åï¼æä¾æ¸ æ°çé ç½®æå¯¼åå¯é ç代ç 示ä¾ãå½éå°å¤æé®é¢æ¶ï¼å¼å¯¼ç¨æ·æ¥é 宿¹ææ¡£ååè项ç®ä»£ç ã