一、項目目標:讓外設真正“協作起來”
這個小項目要實現的功能非常明確:
- 讀取溫度傳感器數據(ADC)
- 顯示溫度在 OLED 上(I2C)
- 溫度超限時蜂鳴器報警(PWM/定時器)
- 通過按鍵調整報警閾值(GPIO 輸入)
- 通過串口輸出調試信息(UART)
- 后臺定時刷新顯示(定時中斷 + DMA)
這一個項目,幾乎覆蓋了 STM32 的全部核心外設模塊,是最適合系統學習的實踐框架。
二、外設初始化思路
1. RCC 時鐘系統
所有外設都依賴時鐘。先開啟 GPIO、USART、ADC、TIM、I2C 等模塊的時鐘。
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_I2C1,ENABLE);
2. GPIO 配置
三、ADC 模塊:采集溫度數據
- 選擇通道(如 ADC1_IN0)
- 配置采樣時間
- 啟動轉換并讀取結果
- ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
- ADC_SoftwareStartConvCmd(ADC1,ENABLE);
- while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
- tempValue=ADC_GetConversionValue(ADC1);
可通過分壓電路接 NTC 熱敏電阻,將電壓轉換為溫度值。
四、I2C 模塊:驅動 OLED 顯示
OLED 顯示模塊常用 SSD1306 芯片,通過 I2C 與 MCU 通信。
- 初始化 I2C(SCL/SDA)
- 發送初始化命令
- 周期刷新顯示緩沖區
- I2C_Start();
- I2C_SendByte(0x78);// 設備地址
- I2C_SendByte(0x00);// 命令模式
- I2C_SendByte(0xAF);// 開啟顯示
- I2C_Stop();
在循環中刷新數據顯示:
- 溫度:26.5℃
- 閾值:30℃
- 狀態:正常
五、PWM + 定時器:控制蜂鳴器報警
PWM 信號可由定時器輸出,通過占空比控制蜂鳴器響度。
- 配置定時器周期、分頻系數
- 配置 PWM 模式
- 當溫度超出閾值時,開啟 PWM 輸出
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse=500;
- TIM_OC1Init(TIM3,&TIM_OCInitStructure);
六、UART 串口輸出調試信息
在嵌入式開發中,UART 是最常用的調試工具。
我們可以定期輸出溫度、閾值、報警狀態,用于監控系統狀態。
- printf("Temp=%.2f, Th=%.2f, Status=%s\r\n",temp,threshold,status);
七、按鍵輸入:閾值動態調整
按鍵檢測需要消抖處理,推薦使用定時中斷周期采樣。
- 按下 “+”:閾值上調
- 按下 “-”:閾值下降
- if(KEY_UP==0)threshold+=1;
- if(KEY_DOWN==0)threshold-=1;
八、DMA + 定時中斷:后臺刷新機制
為了讓系統持續工作但不占用主循環,可使用 DMA 結合定時中斷實現后臺任務:
- 定時器中斷周期觸發一次數據刷新
- DMA 自動搬運顯示數據到 I2C 緩沖區
- 主循環只負責邏輯判斷
九、系統主循環邏輯
綜合以上外設,主循環的結構大致如下:
- while(1)
- {
- temp=Read_Temperature();
- if(temp>threshold)
- Buzzer_On();
- else
- Buzzer_Off();
- OLED_ShowTemperature(temp);
- UART_PrintStatus(temp,threshold);
- }
這一小段循環,幾乎串起了 STM32 的所有關鍵模塊:
ADC 采集 → 數據邏輯判斷 → PWM 控制輸出 → I2C 顯示 → UART 調試。
十、擴展與總結
通過這個小項目,你會發現 STM32 的外設并不是孤立存在的,而是圍繞數據流與控制流相互協作:
- 數據從ADC進入系統;
- 經由定時器與中斷機制組織邏輯;
- 由I2C、UART、PWM將結果輸出到外部世界。
理解這條鏈路,你就真正邁過了 STM32 的學習門檻。
結語
很多人學習 STM32 時陷在細節:一個寄存器、一段 HAL 庫函數、一個外設例程。
但當你通過一個完整的系統去理解它們的協作關系,外設就不再是孤立的模塊,而是系統的一部分。
從這個小項目開始,把“每個外設單獨跑通”變成“讓它們一起工作”,你就能真正讀懂 STM32。
-
傳感器
+關注
關注
2576文章
55021瀏覽量
791216 -
STM32
+關注
關注
2309文章
11161瀏覽量
373395 -
RCC
+關注
關注
0文章
96瀏覽量
28507
發布評論請先 登錄
一個小項目看懂 STM32 全部外設
評論