MCU引腳不夠用?老工程師簡(jiǎn)單一招把1根線抻成N根
發(fā)布日期:2026-08-12
點(diǎn)擊次數(shù):1324
你肯定遇到過(guò)這種的時(shí)刻:MCU 的引腳幾乎用完,產(chǎn)品馬上要交付,客戶(hù)突然說(shuō)要加一個(gè) 4 位數(shù)碼管或者一排指示燈。多一根 GPIO 都擠不出來(lái),加芯片又嫌板子和成本撐不住。今天分享一個(gè)偏門(mén)玩法——用一個(gè) GPIO,靠“不同長(zhǎng)度的脈沖”在硬件上跑出一串串行數(shù)據(jù),最后鎖存成 N 位并行輸出。不再糾結(jié)引腳,也不再改 MCU,只需要加些門(mén)電路、RC時(shí)序電路和移位寄存器就能搞定。

需求有多“坑”:只剩一條 I/O 卻要 N 位并行
先說(shuō)下靈感的來(lái)源。EDN 的老朋友 Jayapal 前陣子投稿,說(shuō)他碰到一個(gè)“噩夢(mèng)開(kāi)局”:MCU 只剩一個(gè)引腳空閑,卻臨時(shí)要加一個(gè) 4 位數(shù)碼管。是不是聽(tīng)起來(lái)就頭大?再加上馬上要交付,完全就是恐怖片開(kāi)局。
他的做法很聰明——在一條 GPIO 上,用不同時(shí)長(zhǎng)的軟件脈沖來(lái)編碼控制信息,直接“一拖多”。順著這個(gè)思路,我就在想:能不能把玩法再“泛化”一點(diǎn)?不限于 4 位 BCD,而是任意 N 位并行輸出,都用同一根 GPIO。于是就有了下面這套電路與時(shí)序方案。
電路要點(diǎn):一條 GPIO “玩轉(zhuǎn)”三路 RC 與移位寄存器
電路的核心思路其實(shí)很簡(jiǎn)單:
·GPIO 輸出的脈沖先經(jīng)過(guò)一個(gè)非反相門(mén) U1a 做一下緩沖;
·然后同時(shí)給三組 RC/門(mén)電路“喂”脈沖:
i.SER 0/1 判別電路 U1b:R1C3 時(shí)間常數(shù) 400 μs,用來(lái)判斷這一位是 0 還是 1;
ii.RCLK(鎖存時(shí)鐘)生成電路 U1cd:R4C2=2.4 ms,交流耦合施密特觸發(fā),用來(lái)在“傳輸結(jié)束”時(shí)產(chǎn)生一個(gè)并行鎖存脈沖;
iii.SRCLK(移位寄存器串行時(shí)鐘):作為移位時(shí)鐘,把 SER 上的位一個(gè)一個(gè)挪進(jìn)移位寄存器串。
這里所有時(shí)鐘和控制都由 GPIO 的“脈沖時(shí)長(zhǎng)”和 RC 充放電來(lái)決定。

示例電路
時(shí)序設(shè)計(jì):用“脈沖長(zhǎng)短”編碼 0/1 并自動(dòng)鎖存
要玩得穩(wěn),最關(guān)鍵的是:MCU 這條 GPIO 必須有穩(wěn)定、可預(yù)測(cè)的輸出翻轉(zhuǎn)。接下來(lái)看具體時(shí)序規(guī)則,這些是可以直接落地的參數(shù):
·空閑態(tài):GPIO 保持 高電平(1)。
·要發(fā)位時(shí),先把 GPIO 拉低(0),這相當(dāng)于開(kāi)始脈沖,同時(shí)釋放各路 RC時(shí)序電路。
·發(fā)完這一位后,GPIO 再回到高(1)。低電平的持續(xù)時(shí)間決定了你移進(jìn)去的是 0 還是 1:
o若 < 100 μs(T0):R1C3 還沒(méi)來(lái)得及把 SER 拉高,當(dāng) SRCLK 上升沿到來(lái)時(shí),SER 仍然是 0——于是移位寄存器收到的是 0;
o若 > 400 μs(T1):R1C3 有足夠時(shí)間把 SER 拉高,SRCLK 上升沿鎖進(jìn)的就是 1。

GPIO脈沖時(shí)序
只要你控制好相鄰脈沖之間的空閑時(shí)間 < 600 μs,就可以維持在 2–10 kbps 左右的有效數(shù)據(jù)率(取決于 0/1 的分布)。
整包數(shù)據(jù)發(fā)完后,只要讓 GPIO 空閑 > TR=3.5 ms,R4C2 的 AC 耦合施密特觸發(fā)就會(huì)超時(shí)并產(chǎn)生一個(gè) RCLK 脈沖,一次性把移位寄存器里的數(shù)據(jù)“橫向”打到 N 位并行輸出口。
如果你是做 4 位 BCD 數(shù)碼管(16 bit),用兩個(gè) 8-bit 移位寄存器,整體時(shí)序大概在 12 ms 內(nèi)就夠用。對(duì)多數(shù)低速顯示/控制場(chǎng)景來(lái)說(shuō),完全“打得動(dòng)”。
使用邊界與工程取舍
任何“花式省引腳”的方案,都要清楚它的適用邊界。這套玩法有幾個(gè)點(diǎn)我建議你心里有數(shù):
·可靠性嚴(yán)重依賴(lài) RC 與溫度/批次:R/C 的精度、溫度系數(shù)、電源波動(dòng)都會(huì)影響閾值。如果你對(duì)時(shí)序要求很?chē)?yán),或者要過(guò)寬溫范圍,最好把 RC 換成更穩(wěn)定的方案。
·協(xié)議是“定制的單總線”:MCU 端需要用軟件精確控制脈沖寬度;如果你后面要維護(hù)/交接,記得把時(shí)序參數(shù)寫(xiě)進(jìn)注釋或文檔。
·速率不高,適合低速控制/顯示:2–10 kbps 級(jí)別對(duì)狀態(tài)指示、數(shù)碼管、繼電器陣列等完全夠用;但別指望跑高速通信或視頻類(lèi)數(shù)據(jù)。
·硬件成本 vs 軟件成本:如果 MCU 本身還有余量,你當(dāng)然可以用更“正統(tǒng)”的 擴(kuò)展方法,或者干脆換一顆引腳更多的 MCU;但在“硬件不能動(dòng)、BOM 受限、交期卡死”的前提下,這套 RC+移位寄存器的做法是個(gè)很實(shí)用的補(bǔ)丁方案。
聲明:
本文來(lái)源于網(wǎng)絡(luò) ,轉(zhuǎn)載僅為學(xué)習(xí)參考,如有問(wèn)題請(qǐng)聯(lián)系,謝謝。
深圳市正芯科技有限公司http://www.getce2.com









