# STM32 Nucleo-F446RC + CubeMX 完整教學系列

## 📚 課程總覽

歡迎來到 **STM32 嵌入式開發完整教學系列**！本教學系列共 **13 節課程**，涵蓋從環境搭建到高級 RTOS 應用的完整學習路徑。

> 🎯 **適合對象**：大專院校二年級以上學生、嵌入式初學者  
> 📖 **建議時間**：每節 3-5 小時  
> 💻 **所需硬體**：STM32 Nucleo-F446RC × 1  
> 🛠️ **開發工具**：STM32CubeIDE（免費）

---

## 📋 課程大綱

### 🟢 基礎課程（第 1-3 節）
這三節課程為您建立完整的開發環境，並掌握 GPIO 基本操作。

| 節次 | 標題 | 重點概念 | 難度 |
|------|------|--------|------|
| [第 1 節](#第-1-節環境搭建--blink-led) | **環境搭建 + Blink LED** | IDE 安裝、第一個程式、GPIO 輸出 | ⭐ |
| [第 2 節](#第-2-節時脈控制講解) | **時脈控制講解** | 振盪器、PLL 倍頻、Clock Tree | ⭐⭐ |
| [第 3 節](#第-3-節gpio-進階按鍵中斷去彈跳) | **GPIO 進階** | 按鍵檢測、中斷系統、去彈跳 | ⭐⭐ |

### 🟡 通訊協議課程（第 4-9 節）
掌握 STM32 常見的通訊協議，是開發實際應用的基礎。

| 節次 | 標題 | 重點概念 | 難度 |
|------|------|--------|------|
| [第 4 節](#第-4-節uart-串列通訊--命令介面) | **UART 串列通訊** | 序列通訊、命令解析、中斷接收 | ⭐⭐ |
| [第 5 節](#第-5-節adc多種轉換方式與如何調用-channel) | **ADC 類比轉換** | 模數轉換、多通道採樣、連續轉換 | ⭐⭐ |
| [第 6 節](#第-6-節定時器-timer--pwm) | **定時器 + PWM** | 定時中斷、PWM 脈衝、呼吸燈效果 | ⭐⭐ |
| [第 7 節](#第-7-節dma直接記憶體存取) | **DMA 轉移** | 無 CPU 干預、高速採樣、循環模式 | ⭐⭐⭐ |
| [第 8 節](#第-8-節i2c-通訊--dma) | **I2C 通訊** | 感測器通訊、多從設備、時序控制 | ⭐⭐⭐ |
| [第 9 節](#第-9-節spi-通訊--dma) | **SPI 高速通訊** | 主從模式、高速傳輸、SD 卡讀寫 | ⭐⭐⭐ |

### 🔴 工業級通訊課程（第 10-12 節）
進階通訊協議，適合工業應用和嚴苛環境。

| 節次 | 標題 | 重點概念 | 難度 |
|------|------|--------|------|
| [第 10 節](#第-10-節canbus-通訊兩板間通訊) | **CANbus 網路** | 車用協議、雙板通訊、優先級仲裁 | ⭐⭐⭐ |
| [第 11 節](#第-11-節rs-485-通訊) | **RS-485 遠距** | 差分信號、長距離、收發切換 | ⭐⭐⭐ |
| [第 12 節](#第-12-節硬體-crc-計算) | **硬體 CRC 校驗** | 資料完整性、加速計算、通訊驗證 | ⭐⭐ |

### 🔵 高級應用課程（第 13 節）
實時操作系統，用於複雜的多任務應用。

| 節次 | 標題 | 重點概念 | 難度 |
|------|------|--------|------|
| [第 13 節](#第-13-節rtos實時操作系統) | **FreeRTOS** | 多任務調度、任務同步、隊列通訊 | ⭐⭐⭐⭐ |

---

## 📖 詳細課程連結

### 第 1 節：環境搭建 + Blink LED
**檔案**：`stm32_lesson_01_env.md`

✅ 學習目標：
- 完成 STM32CubeIDE 安裝與配置
- 認識 Nucleo-F446RC 硬體
- 實現第一個 LED 閃爍程式

🎯 重點內容：
- STM32CubeIDE 下載與安裝步驟
- 開發板組成與主要接腳
- CubeMX 配置工作流程
- 完整可編譯的 Blink LED 代碼

---

### 第 2 節：時脈控制講解
**檔案**：`stm32_lesson_02_clock.md`

✅ 學習目標：
- 理解 STM32F446 的時脈架構
- 掌握 Clock Tree 配置
- 透過改變時脈觀察 LED 動作變化

🎯 重點內容：
- 振盪器（HSI、HSE）與 PLL 倍頻原理
- 時脈分頻器（AHB、APB1、APB2）說明
- Clock Tree 工作流程
- 多時脈配置驗證實驗

---

### 第 3 節：GPIO 進階（按鍵、中斷、去彈跳）
**檔案**：`stm32_lesson_03_gpio_adv.md`

✅ 學習目標：
- 掌握 GPIO 輸入配置
- 理解外部中斷系統（EXTI）
- 實現按鍵去彈跳算法

🎯 重點內容：
- GPIO 各種工作模式詳解
- 上拉/下拉配置與應用
- 外部中斷工作原理
- 軟體去彈跳技術實現

---

### 第 4 節：UART 串列通訊 + 命令介面
**檔案**：`stm32_lesson_04_uart.md`

✅ 學習目標：
- 掌握 UART 通訊協定
- 實現收發功能
- 建立簡單的命令解析系統

🎯 重點內容：
- UART 信號線、波特率、資料格式
- 中斷驅動的收發機制
- 命令解析與執行邏輯
- 與電腦通訊的實現

---

### 第 5 節：ADC（多種轉換方式與如何調用 Channel）
**檔案**：`stm32_lesson_05_adc.md`

✅ 學習目標：
- 理解 ADC 工作原理
- 配置不同轉換模式
- 實現多通道採樣

🎯 重點內容：
- 12-bit ADC 分辨率與轉換時間
- 單次、連續、掃描模式配置
- 通道選擇與採樣時間設定
- 類比電壓到數位值的轉換公式

---

### 第 6 節：定時器 Timer + PWM
**檔案**：`stm32_lesson_06_timer_pwm.md`

✅ 學習目標：
- 理解定時器工作原理
- 掌握 PWM 信號產生
- 實現呼吸燈效果

🎯 重點內容：
- 定時器分類與功能
- PWM 原理與佔空比概念
- PWM 頻率與分辨率計算
- 實現 LED 亮度平滑調控

---

### 第 7 節：DMA（直接記憶體存取）
**檔案**：`stm32_lesson_07_dma.md`

✅ 學習目標：
- 理解 DMA 工作原理
- 配置 ADC + DMA
- 實現高速資料轉移

🎯 重點內容：
- DMA 與 CPU 的角色分工
- 循環模式與普通模式
- DMA 流與通道概念
- ADC + DMA 高效採樣實現

---

### 第 8 節：I2C 通訊 + DMA
**檔案**：`stm32_lesson_08_i2c.md`

✅ 學習目標：
- 理解 I2C 協定
- I2C 從設備通訊
- I2C + DMA 應用

🎯 重點內容：
- I2C 時序與尋址機制
- SCL、SDA 信號線工作原理
- 常見感測器地址與讀寫方式
- 設備掃描與通訊示例

---

### 第 9 節：SPI 通訊 + DMA
**檔案**：`stm32_lesson_09_13_summary.md`（第 9 節部分）

✅ 學習目標：
- 理解 SPI 高速序列通訊
- SPI 感測器通訊
- SPI + DMA 應用

🎯 重點內容：
- MOSI、MISO、SCK、CS 信號線
- 主從模式與時序配置
- SPI 與 I2C 的比較
- 高速感測器讀寫實現

---

### 第 10 節：CANbus 通訊（兩板間通訊）
**檔案**：`stm32_lesson_09_13_summary.md`（第 10 節部分）

✅ 學習目標：
- CAN 協定基礎
- 雙開發板通訊
- 訊息的發送與接收

🎯 重點內容：
- CAN 識別符與優先級仲裁
- CAN 收發器 TJA1050 接線
- 過濾器配置與中斷處理
- Nucleo ↔ Nucleo 通訊實現

---

### 第 11 節：RS-485 通訊
**檔案**：`stm32_lesson_09_13_summary.md`（第 11 節部分）

✅ 學習目標：
- RS-485 差分信號
- 多設備總線通訊
- 半雙工收發切換

🎯 重點內容：
- RS-485 與 RS-232 的區別
- MAX485 收發器配置
- 發送/接收模式切換
- 長距離通訊應用

---

### 第 12 節：硬體 CRC 計算
**檔案**：`stm32_lesson_09_13_summary.md`（第 12 節部分）

✅ 學習目標：
- CRC 校驗原理
- STM32 硬體 CRC
- 應用於通訊協定

🎯 重點內容：
- CRC 多項式與計算方式
- 軟體 vs 硬體 CRC 性能對比
- CRC-32 配置與計算
- 資料完整性驗證實現

---

### 第 13 節：RTOS（實時操作系統）
**檔案**：`stm32_lesson_09_13_summary.md`（第 13 節部分）

✅ 學習目標：
- RTOS 基本概念
- FreeRTOS 配置
- 任務間通訊

🎯 重點內容：
- 多任務調度與優先級
- 任務同步機制（隊列、信號量、互斥鎖）
- FreeRTOS 核心 API
- 完整的多任務示例應用

---

## 🛠️ 快速開始

### 準備工作清單

- [ ] 下載 STM32CubeIDE（v1.13+）：https://www.st.com/en/development-tools/stm32cubeide.html
- [ ] 下載本教學全部 13 個 Markdown 文件
- [ ] 準備 STM32 Nucleo-F446RC 開發板
- [ ] 準備 USB Type-B 傳輸線
- [ ] 安裝 ST-Link 驅動（通常自動安裝）

### 推薦學習流程

```
第 1 節：環境搭建 ✓
   ↓
第 2 節：時脈控制 ✓
   ↓
第 3 節：GPIO 進階 ✓
   ↓
第 4 節：UART 通訊 ✓
   ↓
第 5 節：ADC 採樣 ✓
   ↓
第 6 節：Timer + PWM ✓
   ↓
第 7 節：DMA（可選）
   ↓
第 8-12 節：各類通訊協議
   ↓
第 13 節：RTOS（進階）
```

---

## 📝 每節課程格式

每個課程文件均包含以下結構：

```
🎯 學習目標（3 個具體目標）
   ↓
🎓 理論基礎（概念與原理）
   ↓
🛠️ 硬體接線（接線圖表）
   ↓
⚙️ CubeMX 配置（詳細步驟）
   ↓
💻 完整程式碼（可直接編譯）
   ↓
🔍 測試與除錯（預期結果、常見問題）
   ↓
📱 進階應用（擴展挑戰）
   ↓
🔗 延伸學習（下節預覽與資源）
```

---

## 📚 配套資源

### 硬體資源
- 📘 [STM32F446 資料表](https://www.st.com/resource/en/datasheet/stm32f446rc.pdf)
- 📘 [Nucleo-F446RC 使用手冊](https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-board-mb1137-stmicroelectronics.pdf)
- 📘 [STM32F4 參考手冊](https://www.st.com/resource/en/reference_manual/dm00135183-stm32f446xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf)

### 軟體工具
- 🔧 STM32CubeIDE：整合開發環境
- 🔧 STM32CubeMX：硬體配置工具
- 🔧 STM32Cube Firmware：函式庫與驅動

### 終端機軟體
- **Windows**：PuTTY、Tera Term、Arduino IDE
- **Linux**：minicom、picocom
- **macOS**：minicom 或 Arduino IDE

---

## 💡 學習建議

### ✅ 推薦做法
1. **按順序學習** - 不要跳躍課程，基礎很重要
2. **動手實驗** - 自己親手敲代碼並燒錄
3. **修改參數** - 改變延遲、頻率等參數觀察變化
4. **深入思考** - 理解為什麼而不只是怎麼做
5. **延伸挑戰** - 完成每節的進階挑戰題

### ❌ 避免做法
1. ❌ 直接複製貼上程式碼，不理解原理
2. ❌ 遇到編譯錯誤就放棄
3. ❌ 跳過理論部分直接看代碼
4. ❌ 依賴 IDE 自動補全，不手動練習
5. ❌ 不親自調試，只靠口頭解釋

---

## 🐛 常見問題解決

### 編譯錯誤
- **錯誤**：`undefined reference to 'HAL_xxx'`
- **原因**：HAL 函式庫未連結
- **解決**：Project → Properties → C/C++ Build → Libraries 檢查

### 燒錄失敗
- **錯誤**：`Failed to connect to target`
- **原因**：ST-Link 驅動未安裝或連接不良
- **解決**：檢查裝置管理員，重新插拔 USB

### 程式無反應
- **原因**：主要在 main 迴圈中無窮迴圈
- **解決**：新增 `while(1)` 的除錯輸出確認運行

---

## 📞 獲取幫助

如遇問題，依序嘗試：
1. 查看本教學的「常見問題 & 解決方案」部分
2. 檢查 [STM32 官方社群論壇](https://community.st.com/)
3. 參考相關的開源項目代碼

---

## 📄 版權與使用條款

本教學系列基於 **CC-BY-SA 4.0 開源協議** 發布。
- ✅ 自由使用、修改、分發
- ✅ 用於學習和商業用途
- ✅ 需標明原作者
- ✅ 任何修改版本也需以相同協議發布

---

## 🎓 學習成果

完成全部 13 節課程後，您將能夠：

✅ 獨立配置 STM32 微控制器  
✅ 實現各種通訊協議（UART、SPI、I2C、CAN、RS-485）  
✅ 進行類比信號採集與數位控制  
✅ 設計實時多任務系統  
✅ 解決常見嵌入式開發問題  
✅ 應對工業級應用挑戰  

---

## 🚀 下一步學習方向

完成本系列後，建議進階學習：

1. **進階硬體**：USB、以太網、外部記憶體
2. **系統設計**：電源管理、EMC/EMI 防護
3. **實際項目**：無人機、機器人、物聯網設備
4. **其他平台**：ARM Cortex-M0、STM32L 低功耗系列

---

## 📧 反饋與改進

歡迎提供學習建議和課程改進意見！

---

**✨ 祝您在 STM32 嵌入式開發的學習旅程中取得成功！🚀**

---

## 快速導航

| | 課程連結 |
|---|---|
| 🏠 首頁 | [點此返回](#stm32-nucleo-f446rc--cubemx-完整教學系列) |
| ➡️ 第 1 節 | [環境搭建 + Blink LED](#第-1-節環境搭建--blink-led) |
| ➡️ 第 2 節 | [時脈控制講解](#第-2-節時脈控制講解) |
| ➡️ 第 3 節 | [GPIO 進階](#第-3-節gpio-進階按鍵中斷去彈跳) |
| ➡️ 第 4 節 | [UART 通訊](#第-4-節uart-串列通訊--命令介面) |
| ➡️ 第 5 節 | [ADC 採樣](#第-5-節adc多種轉換方式與如何調用-channel) |
| ➡️ 第 6 節 | [Timer + PWM](#第-6-節定時器-timer--pwm) |
| ➡️ 第 7 節 | [DMA](#第-7-節dma直接記憶體存取) |
| ➡️ 第 8 節 | [I2C](#第-8-節i2c-通訊--dma) |
| ➡️ 第 9 節 | [SPI](#第-9-節spi-通訊--dma) |
| ➡️ 第 10 節 | [CANbus](#第-10-節canbus-通訊兩板間通訊) |
| ➡️ 第 11 節 | [RS-485](#第-11-節rs-485-通訊) |
| ➡️ 第 12 節 | [硬體 CRC](#第-12-節硬體-crc-計算) |
| ➡️ 第 13 節 | [RTOS](#第-13-節rtos實時操作系統) |

---

**最後更新**：2026-03-06  
**版本**：1.0.0  
**語言**：繁體中文  
**難度範圍**：⭐ ~ ⭐⭐⭐⭐