一、項(xiàng)目目標(biāo):讓外設(shè)真正“協(xié)作起來(lái)”
這個(gè)小項(xiàng)目要實(shí)現(xiàn)的功能非常明確:
- 讀取溫度傳感器數(shù)據(jù)(ADC)
- 顯示溫度在 OLED 上(I2C)
- 溫度超限時(shí)蜂鳴器報(bào)警(PWM/定時(shí)器)
- 通過按鍵調(diào)整報(bào)警閾值(GPIO 輸入)
- 通過串口輸出調(diào)試信息(UART)
- 后臺(tái)定時(shí)刷新顯示(定時(shí)中斷 + DMA)
這一個(gè)項(xiàng)目,幾乎覆蓋了 STM32 的全部核心外設(shè)模塊,是最適合系統(tǒng)學(xué)習(xí)的實(shí)踐框架。
二、外設(shè)初始化思路
1. RCC 時(shí)鐘系統(tǒng)
所有外設(shè)都依賴時(shí)鐘。先開啟 GPIO、USART、ADC、TIM、I2C 等模塊的時(shí)鐘。
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_I2C1,ENABLE);
2. GPIO 配置
三、ADC 模塊:采集溫度數(shù)據(jù)
- 選擇通道(如 ADC1_IN0)
- 配置采樣時(shí)間
- 啟動(dòng)轉(zhuǎn)換并讀取結(jié)果
- 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 熱敏電阻,將電壓轉(zhuǎn)換為溫度值。
四、I2C 模塊:驅(qū)動(dòng) OLED 顯示
OLED 顯示模塊常用 SSD1306 芯片,通過 I2C 與 MCU 通信。
- 初始化 I2C(SCL/SDA)
- 發(fā)送初始化命令
- 周期刷新顯示緩沖區(qū)
- I2C_Start();
- I2C_SendByte(0x78);// 設(shè)備地址
- I2C_SendByte(0x00);// 命令模式
- I2C_SendByte(0xAF);// 開啟顯示
- I2C_Stop();
在循環(huán)中刷新數(shù)據(jù)顯示:
- 溫度:26.5℃
- 閾值:30℃
- 狀態(tài):正常
五、PWM + 定時(shí)器:控制蜂鳴器報(bào)警
PWM 信號(hào)可由定時(shí)器輸出,通過占空比控制蜂鳴器響度。
- 配置定時(shí)器周期、分頻系數(shù)
- 配置 PWM 模式
- 當(dāng)溫度超出閾值時(shí),開啟 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 串口輸出調(diào)試信息
在嵌入式開發(fā)中,UART 是最常用的調(diào)試工具。
我們可以定期輸出溫度、閾值、報(bào)警狀態(tài),用于監(jiān)控系統(tǒng)狀態(tài)。
- printf("Temp=%.2f, Th=%.2f, Status=%s\r\n",temp,threshold,status);
七、按鍵輸入:閾值動(dòng)態(tài)調(diào)整
按鍵檢測(cè)需要消抖處理,推薦使用定時(shí)中斷周期采樣。
- 按下 “+”:閾值上調(diào)
- 按下 “-”:閾值下降
- if(KEY_UP==0)threshold+=1;
- if(KEY_DOWN==0)threshold-=1;
八、DMA + 定時(shí)中斷:后臺(tái)刷新機(jī)制
為了讓系統(tǒng)持續(xù)工作但不占用主循環(huán),可使用 DMA 結(jié)合定時(shí)中斷實(shí)現(xiàn)后臺(tái)任務(wù):
- 定時(shí)器中斷周期觸發(fā)一次數(shù)據(jù)刷新
- DMA 自動(dòng)搬運(yùn)顯示數(shù)據(jù)到 I2C 緩沖區(qū)
- 主循環(huán)只負(fù)責(zé)邏輯判斷
九、系統(tǒng)主循環(huán)邏輯
綜合以上外設(shè),主循環(huán)的結(jié)構(gòu)大致如下:
- while(1)
- {
- temp=Read_Temperature();
- if(temp>threshold)
- Buzzer_On();
- else
- Buzzer_Off();
- OLED_ShowTemperature(temp);
- UART_PrintStatus(temp,threshold);
- }
這一小段循環(huán),幾乎串起了 STM32 的所有關(guān)鍵模塊:
ADC 采集 → 數(shù)據(jù)邏輯判斷 → PWM 控制輸出 → I2C 顯示 → UART 調(diào)試。
十、擴(kuò)展與總結(jié)
通過這個(gè)小項(xiàng)目,你會(huì)發(fā)現(xiàn) STM32 的外設(shè)并不是孤立存在的,而是圍繞數(shù)據(jù)流與控制流相互協(xié)作:
- 數(shù)據(jù)從ADC進(jìn)入系統(tǒng);
- 經(jīng)由定時(shí)器與中斷機(jī)制組織邏輯;
- 由I2C、UART、PWM將結(jié)果輸出到外部世界。
理解這條鏈路,你就真正邁過了 STM32 的學(xué)習(xí)門檻。
結(jié)語(yǔ)
很多人學(xué)習(xí) STM32 時(shí)陷在細(xì)節(jié):一個(gè)寄存器、一段 HAL 庫(kù)函數(shù)、一個(gè)外設(shè)例程。
但當(dāng)你通過一個(gè)完整的系統(tǒng)去理解它們的協(xié)作關(guān)系,外設(shè)就不再是孤立的模塊,而是系統(tǒng)的一部分。
從這個(gè)小項(xiàng)目開始,把“每個(gè)外設(shè)單獨(dú)跑通”變成“讓它們一起工作”,你就能真正讀懂 STM32。
-
傳感器
+關(guān)注
關(guān)注
2576文章
55014瀏覽量
791176 -
STM32
+關(guān)注
關(guān)注
2309文章
11161瀏覽量
373371 -
RCC
+關(guān)注
關(guān)注
0文章
96瀏覽量
28502
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問除了Flash芯片STM32F7的QSPI能接其他外設(shè)嗎?
用stm32做了一個(gè)小項(xiàng)目
使用NodeMCU開發(fā)一些小項(xiàng)目
使用STM32H750型號(hào)的單片機(jī)做一個(gè)小項(xiàng)目
【野火魯班貓2開發(fā)板體驗(yàn)】Debian + 物聯(lián)網(wǎng) + 綜合小項(xiàng)目
【魯班貓創(chuàng)意氛圍賽】魯班貓2單板電腦=物聯(lián)網(wǎng)+綜合小項(xiàng)目
物聯(lián)網(wǎng)小項(xiàng)目:STM32F103單片機(jī)通過MQTT協(xié)議連接阿里云
第一個(gè)STM32CubeIDE項(xiàng)目
Arduino Bootcamp師生小項(xiàng)目
一個(gè)小項(xiàng)目看懂 STM32 全部外設(shè)
評(píng)論