一、單片機MCU
1.1 單片機和嵌入式
- 嵌入式系統以計算機為核心,tips:計算機【處理單元,內存 + 硬盤】可以控制的外部設備,傳感器,電機,繼電器嵌入式開發 數據源 --> 處理器(CPU MCU MPU) --> 執行器計算機通過硬件連接和程序控制,讓整個設備可以滿足用戶的需求,例如 智能手表,汽車駕駛輔助,無人機,武器系統,智能家居。
- 單片機 --> MCUMCU (Microcontroller Unit) 微型控制單元,主要包括中央處理器,指令處理單元ROM 硬盤/存儲空間RAM 運行內存可以認為 MCU 是一個小型計算機系統。具備獨立運行控制執行的作用。
1.2 ARM公司
????????ARM Holdings(Advanced RISC Machines)不生產芯片,僅提供芯片設計方案和芯片解決方案。
以下是 ARM 公司對外提供的芯片內核方案:
????????Cortex-A 內核,更新頻率更快,性能最好,緊跟市場潮流!!!主要用于要求性能較高,能
耗支持較高的使用場景,利用手機 SOC/高通,小米,聯發科,蘋果。車機芯片,ARM 開發
板。后續驅動課程使用的芯片 RK3399 (dual-core Cortex-A72 and quad-core Cortex-A53)
RK3588 基于 Cortex-A 內核
????????Cortex-R 內核 常見場景有車輛 ECU,要求響應速度較快常見
????????Cortex-M 內核 主要用于 MCU 微型處理器,目前主流的內核方案有 M0 M3 M4 M7, 常見
MCU STM32F1XX(M3 內核) STM32F4XX(M4 內核) STM32H7XX(M7 內核)
1.3 常用的32芯片
- 國外芯片
- ST 系列:由 STM 意法半導體公司生產,常用型號有 STMF1、STMF4、STMH7、STMLXX、STMW 等。
- Ti 系列:美國德州儀器公司的產品,該公司是世界上最大的 DSP(數據信號處理)芯片提供商,例如 TM320F28335PGFA。
- 國內芯片
- GD 兆易創新:是目前國內 32 MCU 芯片領域的領頭企業,內核采用 ARM 公司提供的 Cortex - M 系列,且完整兼容 STM32 芯片。
- 樂鑫科技:有 ESP32 芯片,以及 WiFi 芯片 ESP8266。
- 華大半導體。
- 沁恒微電子。
- 靈動微電子。
- 國產自研芯片:架構、內核、知識產權均為國內自主研發。
- 龍芯:主要面向服務器、PC 工業控制、武器裝備、政府設施等領域的芯片解決方案。
- 海思:華為旗下的芯片公司。
- 國內車企(如吉利、蔚來、小鵬、長安等)都在自研芯片。
- 目前國內大多數公司都在轉向國產芯片方案,這是為了芯片安全和信息安全。學習 STM32 的重點內容是【寄存器操作方式】和【32 標準庫方式】開發。
1.4 STM32開發板概述
- STM32 是意法半導體公司基于 ARMv7 Cortex - M 內核設計的 32 位 MCU 芯片。
- F 表示通用型號,還有 L、H、W、G 相關系列。
- 103 表示增強型。
- F1xx 表明當前內核為 Cortex - M3 內核。
- ZET6 各部分含義:
- Z:表示引腳數為 144。
- E:表示閃存 Flash 為 512KB,屬于大容量存儲設備。
- T:表示封裝標準為 LQFP 封裝。
- 6:表示工作溫度限制在 - 40℃~85℃。
二、 GPIO
2.1 GPIO概述
2.1 GPIO 概述
????????GPIO(General Purpose Input/Output)是 STM32 微控制器最基本、最常用的外設之一,用于與外部設備進行數字信號交互(如控制 LED、讀取按鍵、驅動傳感器等)。
咱們學習 Hi3861 中利用 GPIO 完成了 LED 控制,按鍵控制,傳感器數據讀取,蜂鳴器控制,利用 GPIO 模版 PWM 控制舵機。
GPIO 的控制核心邏輯
- 輸入輸出控制
- 高低電平控制
在當前 STM32F103ZET6 中一共有 - 7 組 GPIO 分別對應 GPIOA~GPIOG 分組。
- 同時每一個 GPIO 分組對應 16 個對外引腳,流入 GPIOA00~GPIOA15 ==>PA0~PA15
- STM32F103ZET6 對外可以提供可編程 GPIO 引腳一共是 16 * 7 ==> 112 引腳
2.2 STM32F103ZET6 原理圖簡單分析
?????????原理圖是開發中重要的參考依據,通過原理圖分析當前 MCU 芯片引腳對應的功能模塊,已經控制方式分析。以 LED 燈為例分析,當前開發板中 DS0 絲印位號對應的 LED 燈在原理圖中,對應的引腳為 LED0。

2.3 GPIO STM32模式
在 STM32 開發中,操作 GPIO 需要確定的內容有:
- 那一組 GPIO,例如 GPIOB。
- 操作的 GPIO 是當前組內第幾個 Pin 引腳,對應引腳為 5 引腳 ==> GPIOB5 ==> PB5。
- 設置 GPIO 的工作模式。
2.3.1. 浮空輸入模式(Floating Input)原理:在這種模式下,GPIO 引腳沒有接上拉電阻或下拉電阻,其電平狀態完全取決于外部電路。引腳處于高阻抗狀態,輸入電流幾乎為零。應用場景:適用于外部信號已經有明確的驅動能力和電平狀態的情況,比如連接按鍵,按鍵按下時直接將引腳接地,松開時引腳浮空,通過讀取引腳電平判斷按鍵狀態。2.3.2. 上拉輸入模式(Pull - up Inpu)原理:GPIO 引腳內部連接了上拉電阻,當外部電路沒有對引腳進行驅動時,引腳電平被上拉到高電平。如果外部電路將引腳拉低,那么引腳電平就為低電平。應用場景:常用于按鍵輸入,當按鍵未按下時,引腳通過上拉電阻保持高電平;按鍵按下時,引腳接地變為低電平,避免了引腳浮空可能帶來的電平不穩定問題。2.3.3. 下拉輸入模式(Pull - down Input)原理:與上拉輸入模式相反,GPIO 引腳內部連接了下拉電阻,當外部電路沒有對引腳進行驅動時,引腳電平被下拉到低電平。如果外部電路將引腳拉高,那么引腳電平就為高電平。應用場景:同樣適用于按鍵輸入等場景,當按鍵未按下時,引腳通過下拉電阻保持低電平;按鍵按下時,引腳接高電平。2.3.4. 模擬輸入模式(Analog Input)原理:該模式下,GPIO 引腳用于模擬信號的輸入,內部的數字邏輯電路被斷開,引腳直接連接到模擬信號處理模塊,如 ADC(模擬 - 數字轉換器)。應用場景:用于采集模擬信號,如溫度傳感器、壓力傳感器等輸出的模擬電壓信號,通過ADC 將模擬信號轉換為數字信號進行處理。2.3.5. 開漏輸出模式(Open - Drain Output)原理:在開漏輸出模式下,GPIO 引腳內部的輸出級只有 N 溝道 MOS 管,當輸出為低電平時,MOS 管導通,引腳接地;當輸出為高電平時,MOS 管截止,引腳處于高阻態,需要外部接上拉電阻才能輸出高電平。應用場景:常用于實現線與功能、I2C 總線等通信協議,多個開漏輸出引腳可以連接在一起,只要有一個引腳輸出低電平,總線就為低電平。2.3.6. 推挽輸出模式(Push - Pull Output)原理:推挽輸出模式下,GPIO 引腳內部的輸出級由 P 溝道 MOS 管和 N 溝道 MOS 管組成。當輸出為高電平時,P 溝道 MOS 管導通,引腳輸出高電平;當輸出為低電平時,N 溝道 MOS 管導通,引腳輸出低電平。應用場景:適用于直接驅動一些負載,如 LED 燈,能夠提供較強的驅動能力。2.3.7. 復用開漏輸出模式(Alternate Function Open - Drain Output)原理:該模式下,GPIO 引腳的功能由片上外設控制,輸出級采用開漏輸出結構。與普通開漏輸出模式類似,需要外部接上拉電阻才能輸出高電平。應用場景:常用于一些通信協議和外設接口,如 SPI 總線的某些引腳、I2C 總線等,將 GPIO 引腳復用為外設的特定功能。2.3.8. 復用推挽輸出模式(Alternate Function Push - Pull Output)原理:此模式下,GPIO 引腳的功能由片上外設控制,輸出級采用推挽輸出結構,能夠直接輸出高電平和低電平。應用場景:常用于一些需要較強驅動能力的外設接口,如 UART 通信的發送引腳、PWM 信號輸出等。
2.4 LED開發流程
2.4.1 LED 燈電路分析

2.4.2 LED STM32 開發流程
? ? ? ? 1.【使能】時鐘。
? ? ? ? 2.GPIO PB5 PE5 設置【推挽輸出模式(Push - Pull Output)】
? ? ? ? 3. 利用寄存器控制 PB5 PE5 引腳電平模式
2.4.3 【時鐘】小重點
????????時鐘可以認為是當前 MCU 的處理能力,運算能力。
????????STM32F103ZET6 對應的最高主頻 72MHz,當前 MCU 1 秒中可以處理 72M 任務單元。每一個任 務單元對應的時間為 13.88 ns 。
????????在 MCU 執行過程中,如果沒有打開對應的外設時鐘,對應外設不會在整個的 MCU 執行周期內容 工作,可以認為是沒有開啟任務模塊。
????????MCU 為了管理不同的外設,提供時【鐘樹管】理不同的模塊。
2.4.4 LED 對應 GPIO 組時鐘使能
【寄存器開發模式】
????????利用 STM32 時鐘寄存器,開啟對應 APB2 中的 GPIOB 和 GPIOE 兩個 GPIO 組時鐘使能。MCU 才可以在執行周期中,運行 GPIOB 和 GPIOE 內容。
????????對應文檔中的內容是 RCC (Reset & Clock Control) 復位和時鐘控制。
2.4.5 LED 對應 GPIO 引腳配置
使能之后,需要對引腳進行選擇。 STM32 中的 GPIO 配置寄存器對應有兩個寄存器
????????GPIOx_CRL 低位寄存器 --> GPIO 組 0 ~ 7 Pin
????????GPIOx_CRH 高位寄存器 --> GPIO 組 8 ~ 15 Pin
當前操作的引腳是 PB5 和 PE5 對應 GPIOx_CRL 低位配置寄存器。
在 GPIOx_CRL GPIOx_CRH 每 4 個二進制為對應一個 GPIO 引腳
????????CNFx (x ==> 0~15) 配置當前 GPIO?
總結效果
- 輸出模式 CNF + MODE 寄存器位置效果,速度都使用 50MHz 作為基準
- 0011 推挽輸出模式
- 0111 開漏輸出模式
- 1011 復用推挽輸出模式
- 1111 復用開漏輸出模式
- 輸入模式 CNF + MODE 寄存器位置效果
- 0000 模擬輸入
- 0100 浮空輸入
- 1000 上拉 / 下拉輸入,需要后續配置 IDR 參數
2.4.6 引腳輸出高低電平配置
????????利用 GPIOx_ODR 寄存器配置當前指定引腳的輸出高電平和低電平狀態
2.4.7?代碼實現
#include "stm32f10x.h"
/*
STM32 核心頭文件,標準頭文件,當前對應 STM32F10x 系列,
當前使用的芯片是 STM32F103ZET6
開發中,需要使用相關函數,相關類型,相關配置都在當前
頭文件中。
*/
void Led_Delay(u32 tim);
int main(void)
{/*1. 時鐘使用,RCC 配置當前 GPIOB 和 GPIOE 兩個 GPIO 組使能。RCC ==> Reset & Clock ControlAPB2ENR 當前 APB2 Bridge 對應寄存器配置,當前 APB2ENR包括 【GPIOA ~ GPIOG】 ADC1,2,3 TIM1 TIM8 USART1 SPI1根據寄存器文檔分析,目標當前寄存器中的數據效果為【高 16 位不考慮,對應保留位】0000 0000 0100 10000x01 ==> 0000 00010x01 << 6 ==> 0100 0000 (GPIOE使能位)0x01 << 3 ==> 0000 1000 (GPIOB使能位)0x01 << 6 | 0x01 << 3 = 0100 1000*/RCC->APB2ENR |= 0x01 << 6; // GPIOE 組使能RCC->APB2ENR |= 0x01 << 3; // GPIOB 組使能/*2. 配置 GPIOB --> PB5 和 GPIOE --> PE5 對應工作模式為【推挽輸出模式】。二進制為效果為 0011 (CNF=00, MODE=11)需要配置 GPIOx_CRL 位 23:20 對應 CNF5 和 MODE5 因為GPIOx_CRL 默認值是 0x44444444 存在基礎數據*//*2.1 對 GPIOx_CRL 位 23:20 默認數據進行擦除。0x0F ==> 0000 11110x0F << 20 ==> 對應位23-20~(0x0F << 20) ==> 清除掩碼*/GPIOB->CRL &= ~(0x0F << 20);GPIOE->CRL &= ~(0x0F << 20);/*2.2 對 GPIOx_CRL 位 23:20 進行數據賦值 0011推挽輸出模式配置: CNF=00, MODE=11 (50MHz)*/GPIOB->CRL |= 0x03 << 20;GPIOE->CRL |= 0x03 << 20;/*3. 控制高低電平,從而控制 LED 亮和滅MCU 引腳輸出高電平 LED 燈滅MCU 引腳輸出低電平 LED 燈亮GPIOx_ODR 控制位 5 對應 PB5 和 PE5 兩個引腳對應 ODR 位 5 數據為 1 高電平,0 低電平*/while (1){GPIOB->ODR &= ~(0x01 << 5); // PB5 低電平 LED0 燈亮GPIOE->ODR |= (0x01 << 5); // PE5 高電平 LED1 燈滅Led_Delay(200000);GPIOB->ODR |= (0x01 << 5); // PB5 高電平 LED0 燈滅GPIOE->ODR &= ~(0x01 << 5); // PE5 低電平 LED1 燈亮Led_Delay(200000);}
}// 延時函數
void Led_Delay(u32 tim)
{while (tim--){for (int i = 0; i < 72; i++){// 空循環,用于延時調整}}
}
2.4.8?代碼編譯和燒錄
https://github.com/0voice