最新消息
最新消息
漫威電影宇宙最精彩的科普總結
2022-03-16 529

MCU是微控制器單元(Microcontroller Unit)的縮寫,俗稱單晶片,其原理是在適當降低CPU的頻率和規格的同時,將記憶體、計數器、USB介面、A/D轉換器、UART、PLC、DMA甚至LCD驅動電路等外圍介面整合到單一晶片上,形成晶片級電腦。它可以對不同的應用進行不同的控制組合,例如手機、PC週邊、遙控器、汽車電子、工業步進馬達和機器人手臂控制等。 MCU的結構如圖所示。



為前線醫護人員打氣,送上由衷的敬意。讓你在送禮的同時,也為香港盡一分力。
微控制器發展簡史



微控制器的歷史雖然不長,但發展速度卻非常快速。它的生產和發展通常與微處理器(CPU)的生產和發展同步進行。自美國英特爾公司於1971年首次推出4位元微處理器以來,其發展歷程大致可分為五個階段。以下是英特爾公司微控制器發展歷程的介紹。


1971~1976


微控制器發展的初期階段。 1971年11月,英特爾首次設計了Intel 4004,這是一款4位元微處理器,每個晶片整合了2,000個晶體管,並配備了RAM、ROM和移位暫存器,構成了第一款MCS-4微處理器。隨後,英特爾推出了8位元微處理器Intel 8008,其他公司也相繼推出了8位元微處理器。


1976~1980


低性能微控制器階段。以英特爾於1976年推出的MCS-48系列為代表,它採用單晶片結構,將8位元CPU、8位元並行I/O介面、8位元定時器/計數器、RAM和ROM整合在一顆半導體晶片上。雖然其尋址範圍有限(不超過4KB),沒有串行I/O,RAM和ROM容量較小,中斷系統也相對簡單,但其功能足以滿足一般工業控制和智慧儀表的需求。


1980~1983


高效能微控制器階段。此階段推出的高效能8位元微控制器通常具有串列埠、多層中斷處理系統和多個16位元定時器/計數器。片上RAM和ROM的容量增加,尋址範圍可達64KB。部分晶片還附有A/D轉換介面。


1983年~1980年代末


16位元微控制器階段。 1983年,英特爾推出了高效能16位元微控制器MCS-96系列。由於採用了當時最先進的製造工藝,該晶片的整合度高達120,000萬個電晶體/晶片。


1990s


微控制器在整合度、功能性、速度、可靠性和應用領域等各個方面都在不斷發展,邁向更高的水準。




單晶片的分類與應用



根據記憶體類型,MCU 可以分為兩類:無片上 ROM 的和有片上 ROM 的。對於無片上 ROM 的晶片,必須連接外部 EPROM 才能使用(通常為 8031);有片上 ROM 的晶片又分為片上 EPROM 型(典型晶片為 87C51)、片上遮罩 ROM 型(典型晶片為 8051)、片上 Flash 型(典型晶片為 89C51)和其他型別晶片。


根據用途,可分為通用型和專用型;根據資料匯流排的寬度和一次可處理的資料位元組長度,可分為 8 位元、16 位元和 32 位元 MCU。


目前,國內MCU應用最廣泛的領域是消費性電子領域,其次是工業領域和汽車電子市場。消費性電子領域包括家用電器、電視、遊戲機、影音系統等;工業領域包括智慧家庭、自動化、醫療應用以及新能源發電和輸配電;汽車領域包括汽車動力總成和安全控制系統。




微控制器的基本功能



對於大多數微控制器(MCU)而言,以下功能是最常用和最基本的。不同MCU對這些功能的描述方式可能有所不同,但本質上是相同的:


1. 定時器(Timer):雖然定時器有很多種類,但可以歸納為兩大類:一類是固定時間間隔的定時器,即定時時間由系統設定,用戶程式無法控制。系統僅提供幾個固定的時間間隔供使用者程式選擇,例如 32Hz、16Hz、8Hz 等。這類定時器在 4 位元單晶片中較為常見,可用於實現時鐘、定時等相關功能。


另一種類型是可程式定時器。顧名思義,這類定時器的定時時間可以由使用者程式控制。控制方法包括:選擇時鐘來源、選擇分頻(預分頻)以及設定預設值。有些微控制器同時具備這三種功能,而有些則可能只具備其中一種或兩種。這種定時器的應用非常靈活,其實際用途也不斷變化。最常見的應用之一是用於實現脈寬調變(PWM)輸出。


由於時鐘來源可以自由選擇,因此這種類型的計時器通常與事件計數器結合使用。


2. I/O 連接埠:任何 MCU 都具有一定數量的 I/O 連接埠。如果沒有 I/O 端口,MCU 就失去了與外界通訊的通道。根據 I/O 連接埠的可配置性,可以將其分為以下幾種類型:


純輸入/純輸出埠:這種類型的I/O埠由MCU硬體設計決定,只能用於輸入或輸出,無法透過軟體進行即時設定。


直接讀寫I/O埠:例如,MCS-51的I/O埠就屬於這種類型的I/O埠。當執行讀取I/O埠指令時,它是一個輸入埠;當執行寫入I/O埠指令時,它會自動成為一個輸出埠。


輸入輸出方向的設定:此類I/O埠的輸入或輸出方向由程式依實際需求設定。應用較為靈活,可實現一些匯流排級應用,例如I2C匯流排、各種LCD、LED驅動控制匯流排等。


對於 I/O 端口的使用,必須牢記一點:對於輸入端口,必須有清晰的電平信號以確保其不會浮空(這可以通過添加上拉或下拉電阻來實現);對於輸出端口,輸出狀態電平必須考慮其外部連接條件,並且應確保在待機或靜態狀態下沒有電流拉取或吸收。


3. 外部中斷:外部中斷也是大多數MCU的基本功能。它通常用於訊號的即時觸發、數據採樣和狀態檢測。中斷方式包括上升沿觸發、下降沿觸發和電平觸發。外部中斷通常透過輸入連接埠實現。如果是I/O端口,其中斷功能僅在設定為輸入時啟用;如果是輸出端口,外部中斷功能將自動關閉(ATMEL的ATiny系列是例外,即使作為輸出端口也可以觸發中斷功能)。外部中斷的應用如下:


外部觸發訊號的偵測:一種是基於即時性要求,例如控制閘流管、偵測突發訊號等;另一種則是為了節省電力。


訊號頻率測量:為了確保不漏掉訊號,外部中斷是理想的選擇。


數據解碼:在遙控應用領域,為了降低設計成本,通常需要使用軟體來解碼各種編碼數據,例如曼徹斯特編碼和PWM編碼的解碼。


關鍵偵測與系統喚醒:對於進入睡眠狀態的微控制器 (MCU),通常需要透過外部中斷來喚醒。最基本的方式是按鍵,按鍵動作會造成電平變化。


4. 通訊介面:MCU提供的通訊介面一般包括SPI介面、UART、I2C介面等,具體描述如下:


SPI介面:這種介面是大多數MCU提供的最基本的通訊方式。其資料傳輸由同步時鐘控制。訊號包括:SDI(串列資料輸入)、SDO(串列資料輸出)、SCLK(串列時脈)和Ready訊號;在某些情況下,可能沒有Ready訊號;此介面可以工作在主模式或從模式下。通俗地說,這取決於誰提供時鐘訊號。提供時脈訊號的一方是主設備,另一方是從設備。


UART(通用非同步收發器):是最基本的非同步傳輸介面。它只有兩條訊號線,Rx 和 Tx。基本資料格式為:起始位元 + 資料位元(7 位元/8 位元)+ 奇偶校驗位元(偶校驗、奇校驗或無校驗)+ 停止位元(1~2 位元)。傳輸一位資料所花費的時間稱為波特率。


對於大多數微控制器(MCU),資料位元長度、資料校驗模式(奇校驗、偶校驗或無校驗)、停止位元長度和波特率都可以透過程式編程靈活設定。此類介面最常用的方法是與PC的串口通訊。


I2C介面:I2C是由飛利浦公司開發的一種資料傳輸協定。它也使用兩個訊號來實現:SDAT(串行資料輸入/輸出)和SCLK(串行時脈)。其最大的優勢在於可以將多個裝置連接到該總線上,並透過位址進行識別和存取;I2C匯流排的另一個主要優勢是可以透過I/O埠使用軟體輕鬆實現。與對速率有嚴格要求的UART介面不同,I2C的資料傳輸速率完全由SCLK控制,可以設定很快也可以很慢。


5. 看門狗(看門狗定時器):看門狗也是大多數MCU的基本配置(某些4位MCU可能不具備此功能)。大多數MCU的看門狗隻允許程式重位,而不能將其關閉(有些MCU在程式燒錄時就已設置,例如Microchip PIC系列MCU),而有些MCU則使用特定方法來決定是否開啟看門狗,例如三星KS57系列。只要程式存取看門狗暫存器,看門狗就會自動開啟,無法再次關閉。一般來說,看門狗的複位時間可以透過程式設定。看門狗最基本的應用是為因意外故障而崩潰的MCU提供自我恢復能力。




全球主流微控制器製造商

(排名不分先後,依主流廠商分類。如有遺漏,請在評論區補充。)




歐美




1. Freescale+NXP(Freescale+NXP):荷蘭,主要提供 16 位元和 32 位元 MCU。應用領域:汽車電子、LED 和通用照明、醫療保健、多媒體整合、家用電器和電動工具、樓宇自動化技術馬達控制、電源和電源轉換器、能源和智慧電網、自動化、電腦和通訊基礎設施。




2. Microchip+Atmel(Microchip Technology + Atmel):美國,主要提供 16 位元和 32 位元 MCU。應用領域:汽車電子、工業應用、馬達控制、汽車、建築自動化、家用電器、家庭娛樂、工業自動化、照明、物聯網、智慧能源、行動電子設備、電腦週邊設備。




3. Cypress+Spansion(Cypress + Spansion Semiconductor):美國,主要提供 8 位元、16 位元和 32 位元 MCU。應用領域:汽車電子、家用電器、醫療、消費性電子、通訊和電信、工業、無線通訊。




4. ADI(Analog Devices):美國,主要提供 8 位元、16 位元和 32 位元 MCU。應用領域:航空航太與國防、汽車應用、建築技術、通訊、消費性電子、能源、醫療保健、儀器與測量、馬達、工業自動化、安防。




5. 英飛凌:德國,主要提供 16 位元和 32 位元 MCU。應用領域:汽車電子、消費性電子、工程、商用和農業車輛、資料處理、電動交通、工業應用、醫療設備、行動裝置、馬達控制和驅動、電源、摩托車、電動自行車和小型電動車、智慧電網、照明、太陽能係統解決方案、風能係統解決方案。




6. 義法半導體:義大利/法國,主要提供 32 位元 MCU。應用領域:LED 和通用照明、交通運輸、醫療保健、多媒體整合、家用電器和電動工具、樓宇自動化技術馬達控制、電源和電源轉換器、能源和智慧電網、自動化、電腦和通訊基礎設施。




7. 高通:美國,主要提供 16 位元和 32 位元微控制器。應用領域:智慧型手機、平板電腦、無線數據機。




8. 德州儀器:美國,主要提供16位和32位MCU。應用範圍:汽車電子、消費性電子、醫療設備、行動裝置、通訊。




9. Maxim(Maxim):美國,主要提供32位MCU。應用範圍:汽車電子、消費性電子、工業應用、安防。




日本和韓國  




1. 瑞薩電子:日本,主要提供16位元和32位元MCU。應用範圍:電腦及週邊設備、消費性電子、醫療電子、汽車電子、工業及通訊。




2. 東芝:日本,主要提供16位和32位MCU。應用範圍:汽車電子、工業應用、馬達控制、無線通訊、行動電話、電腦及週邊設備、影像及音訊視訊、消費性電子(家用電器)、LED照明、安防、電源管理、娛樂設備。




3. 富士通:日本,主要提供32位MCU。應用範圍:汽車、醫療、機械、家用電器。




4. 三星電子:韓國,主要提供 16 位元和 32 位元 MCU。應用領域:汽車電子、工業應用、馬達控制、汽車、建築自動化、家用電器、家庭娛樂、工業自動化、照明、物聯網、智慧能源、行動電子設備、電腦週邊設備。




中國地區  




中國大陸  




1. Sigma Microelectronics:主要提供 32 位元 MCU,應用範圍:電信、製造、能源、交通、電力等。




2. 珠海軌道:主要提供 32 位元 MCU,應用範圍:航空航太:衛星站、船舶、飛機;高端工業控制:嵌入式電腦;船舶控制、工業控制、電力設備、環境監控。




3. GigaDevice Innovation:主要提供 32 位元 MCU,應用範圍:工業自動化、人機介面、馬達控制、安全監控、智慧家庭、物聯網。




4. 盛思微電子:主要提供8位元和32位元MCU。應用範圍:小型家用電器、消費性電子、遙控器、滑鼠、鋰電池、數位產品、汽車電子、醫療器材及測量、玩具、工業控制、智慧家庭及安防等領域。




5. 芯海科技:主要提供16位和32位MCU。應用範圍:儀器儀表、物聯網、消費性電子、家用電器和汽車電子。




6. 聯華積體電路:主要提供8位元和16位元MCU。應用範圍:消費性電子、白色家電、工業控制、通訊設備、汽車電子和電腦。




7. 珠海建榮:主要提供 8 位元 MCU,應用範圍:家用電器、行動電源。




8. Actions Technology:主要提供 8 位元至 32 位元 MCU,應用範圍:平板電腦、智慧家庭、多媒體、藍牙、Wi-Fi 音訊。




9. 艾斯柯微電子:主要提供8位元和16位元MCU。應用範圍:消費晶片、通訊晶片、資訊晶片和家用電器。




10. 華鑫微電子:主要提供8位元和4位MCU。應用領域:衛星接收器、手機充電器、萬年曆和多功能遙控器。




11. 上海貝靈(華大半導體控股有限公司):主要提供 8 位、16 位和 32 位 MCU。應用領域:電腦週邊設備、高畫質電視、電源管理、小家電和數位家電。




12. 海爾積體電路:主要提供14位元、15位元和16位元MCU。應用範圍:消費性電子、汽車電子、工業和智慧儀器。




13. 北京英健:主要提供 32 位元 MCU,應用範圍:穿戴式裝置、物聯網、智慧家居設備、汽車、消費性電子產品、平板電腦。




14. 中國微電子:主要提供8位元MCU。應用領域:智慧家電、汽車電子、安防監控、LED照明及景觀、智慧玩具、智慧家庭、消費性電子產品。




15. 神州龍森積體電路:主要提供 32 位元 MCU,應用範圍:電力監控、智慧電網、工業數位控制、物聯網、智慧家庭、數據監控。




16.紫光微電子:主要提供8位元和16位元MCU。應用範圍:智慧家庭設備。




17.時代民信:主要提供32位MCU,應用範圍:汽車導航、交通監控、漁船監控、電力通訊網路。




18. 華潤矽微電子(華潤微電子的子公司):主要提供8位和16位MCU。應用範圍:消費性電子、工業控制和家用電器。




19. 國家核心技術:主要提供 32 位元 MCU,應用範圍:資訊安全領域、辦公室自動化領域、通訊網路領域、資訊安全領域。




20. 中天微電子:主要提供32位元MCU。應用領域:智慧型手機、數位電視、機上盒、汽車電子、GPS、電子閱讀器和印表機。




21. 華潤微電子:主要提供8位元和16位元MCU。應用範圍:家用電器、消費性電子產品和工業自動化控制的通用控制電路。




22. 中盈電子:主要提供4位、8位、16位和32位MCU。應用範圍:家用電器和馬達。




23. 凌東微電子:主要提供 32 位,應用範圍:馬達控制、藍牙控制、高畫質顯示、無線充電、無人機、微型印表機、智慧標籤、電子煙、LED 點陣屏等。




24. 新頓科技:主要提供 8 位元 MCU,應用範圍:照明、物聯網等。




25. 東軟開利:主要提供8位和32位MCU。應用領域:家用電器、智慧家庭、儀器、液晶面板控制器、工業控制等。




26. Betley:主要提供 32 位元 MCU,應用範圍:智慧家庭、工業控制和消費產品。




27. 盛泉科技:主要提供 8 位元 MCU,應用範圍:汽車、教育、工業控制、醫療等領域的中小型顯示面板。




28. 恆順晶片:主要提供8位元和32位元MCU。應用範圍:汽車、物聯網等。




29. 復旦微電子:主要提供16位元和32位元MCU。應用領域:智慧電錶、智慧門鎖等。




30. 華大半導體:主要提供8位、16位和32位MCU。應用領域:工業控制、智慧製造、智慧生活與物聯網。




中國台灣  




1.鴻景科技:主要提供32位MCU。應用範圍:通訊、工業控制、資訊家電、語音。




2. 霍爾泰克半導體:主要提供8位元和32位元MCU。應用範圍:消費性電子、LED照明等。




3.凌陽科技:主要提供8位和16位MCU。應用範圍:家庭影音。




4. 中盈電子:主要提供4位和8位MCU。應用範圍:充電器、行動電源、家用電器、工業控制。




5. 松漢科技:主要提供8位和32位MCU。應用範圍:遙控器、智慧型充電器、大型小型系統、電子秤、耳溫計、血壓計、胎壓計、各種測量和健康設備。




6. 華邦電子:主要提供8位元和16位元MCU。應用範圍:汽車電子、工業電子、網路、電腦、消費性電子、物聯網。




7. 十速科技:主要提供4位、8位和51位MCU。應用範圍:遙控器、小型家用電器。




8. 友華微電子:主要提供4位元和8位元MCU。應用範圍:記錄積體電路產品、消費性電子產品、家用產品。




9. 盈光科技微控制器:主要提供4位元和8位元MCU。應用範圍:機械、自動化、家用電器、機器人。




10. 伊蘭電子:主要提供8位元和16位元MCU。應用範圍:消費性電子、電腦、智慧型手機。
 





學習微控制器的技巧
   




所有單晶片的基本原理和功能都大同小異,唯一的區別在於外圍功能模組、指令系統等的配置和數量。




對於指令系統而言,儘管它們的形式看起來截然不同,但實際上它們只是不同的符號。它們所代表的意義、要完成的功能以及尋址方法基本上相似。




要了解一個MCU,首先需要了解它的ROM空間、RAM空間、I/O連接埠數量、定時器數量和定時方法、提供的外圍功能模組(外圍電路)、中斷源、工作電壓和功耗等。




在了解了這些 MCU 特性之後,下一步是將所選 MCU 的功能與實際專案開發所需的功能進行比較,並明確指出目前需要哪些資源以及本專案未使用哪些資源。




對於專案中需要用到但所選MCU未提供的功能,您需要仔細了解MCU的相關信息,以便使用間接方法實現這些功能。例如,如果您開發的專案需要與PC的COM端口通信,而所選MCU沒有UART端口,您可以考慮使用外部中斷來實現該功能。




專案開發所需的資源需要仔細閱讀手冊*,而對於不必要的模組可以忽略或略讀。學習單晶片,應用才是關鍵和主要目的。




在明確了MCU的相關功能之後,就可以開始程式設計了。




對於初次使用這款MCU的初學者或設計人員來說,他們可能會遇到許多關於MCU功能描述不夠清晰的問題。針對這類問題,有兩種解決方法。一種是編寫專門的驗證程序來理解資料中描述的功能;另一種是暫時忽略這些描述,根據自己目前的理解編寫MCU程序,並在調試過程中進行修改和完善。前一種方法適用於時間較為充裕的專案和初學者,而後者則適用於具有一定微控制器開發經驗或專案時間緊迫的情況。




不必花太多時間去理解指令系統。指令系統只是邏輯描述的符號。在程式設計過程中,你只需根據自己的邏輯和程式的邏輯需求來查看相關的指令。隨著程式設計經驗的積累,你會越來越熟練地掌握指令系統,甚至可以做到無意識地記住它。





微控制器程式設計




MCU程式編寫與PC程式編寫之間存在著很大的差異。雖然基於C語言的MCU開發工具越來越受歡迎,但對於那些追求高效程式程式碼且喜歡使用彙編語言的設計人員來說,彙編語言仍然是最簡潔高效的程式語言。




對於MCU程式而言,其基本框架大致相同。它通常分為三個部分:初始化部分(這是MCU編程與PC編程的最大區別)、主程式循環體和中斷處理程序。它們的具體描述如下:




1. 初始化:對於所有MCU程式的設計而言,初始化是最基本、也是最重要的步驟,通常包括以下步驟:




屏蔽所有中斷並初始化堆疊指標:初始化部分通常不希望發生任何中斷。




清除系統 RAM 區域和顯示記憶體:雖然有時可能並非完全必要,但從可靠性和一致性的角度來看,尤其是為了防止意外錯誤,建議養成良好的程式設計習慣。




IO埠初始化:依專案應用需求,設定對應IO埠的輸入輸出模式。對於輸入端口,需要設定上拉或下拉電阻;對於輸出端口,必須設定其初始電平輸出,以防止不必要的錯誤。




中斷設定:專案中所有需要使用的中斷來源都應啟用,並設定中斷觸發條件。未使用的冗餘中斷必須停用。




其他功能模組的初始化:對於所有需要使用的MCU外圍功能模組,必須根據專案應用需求進行相應的設定。例如,對於UART通信,需要設定波特率、資料長度、驗證方式和停止位元長度。對於程式定時器,需要設定時脈源、分頻比和重載資料。




參數初始化:完成MCU硬體和資源的初始化後,下一步是初始化程序中使用的一些變數和資料。這部分的初始化需要根據具體項目和程序的整體佈局進行設計。對於一些使用EEPROM保存項目預製資料的應用,建議在初始化期間將相關資料複製到MCU的RAM中,以提高程式的資料存取速度並降低系統功耗(原則上,存取外部EEPROM會增加電源的功耗)。




2. 主程式循環體:大多數單晶片長時間連續運行,因此其主程式體基本上設計成循環結構。對於具有多種工作模式的應用,可能存在多個循環體,這些循環體會透過狀態標誌進行切換。主程式體通常包含以下模組:




計算程序:計算程序通常很耗時,因此我們堅決反對在任何中斷中處理它們,特別是乘法和除法運算。




對即時性要求低或無即時性要求的程序進行處理;
 




顯示傳輸程式:主要用於外部 LED 和 LCD 驅動器的應用。




3. 中斷處理程序:中斷程序主要用於處理即時性要求高的任務和事件,例如偵測外部突發訊號、偵測和處理按鈕、計時計數、LED 顯示掃描等。




一般來說,中斷程式的程式碼應盡可能簡潔明了。對於無需即時處理的功能,可以在中斷中設定觸發標誌,然後由主程式執行特定的事務。這一點非常重要,尤其對於低功耗、低速的微控制器而言,它們必須確保對所有中斷的及時回應。




4. 對於不同任務體的排列,不同的MCU有不同的處理方法:




例如,對於低速、低功耗的MCU(Fosc=32768Hz)應用,考慮到此類項目通常是手持設備並使用普通LCD顯示屏,按鍵響應和顯示響應需要較高的實時性,因此通常使用定時中斷來處理按鍵動作和資料顯示;而對於高速MCU(例如Fosc>1MHz的應用),由於此時MCU有足夠的時間執行主程式循環,因此只需在對應的中斷中設定各種觸發標誌,並將所有任務放在主程式循環中執行即可。




5. 在單晶片編程中,有一點需要特別注意:

必須防止在中斷和主程式體中同時存取或設定相同的變數或資料。一種有效的防止方法是將此類資料的處理安排在一個模組中,並透過判斷觸發標誌來確定是否對資料執行相關操作;在其他程式體(主要是中斷)中,僅在需要處理資料的地方設定觸發標誌。 ——這樣可以確保資料執行的可預測性和唯一性。




  工程師對微控制器程式設計的總結  




1. 養成總結的好習慣。總結不僅是自身學習內容的總結,也是學習過程的回顧與深化。它還可以避免再次犯錯。


2. 在編寫程式之前,你必須先熟悉項目,了解項目內容,並勾勒出一個整體框架。仔細考慮如何佈局以及最合理的佈局方式至關重要。你需要分析應該先寫哪個模組,該模組的具體步驟,如何命名每個函數,與其他模組的連接等等。最好拿張紙,把重要的流程記下來。


3. 在C語言中,模組化編程必須先將每個模組拆分成多個部分,然後逐個模組進行編程,確定編程順序,並嚴格按照順序執行,直到一個模組成功完成後才能編寫下一個模組。對於頭文件,也需要在模組編寫完成後再編寫該模組的頭檔。


4. 不要忽視出現的警告。這意味著程序中肯定存在一些不合理的問題。你需要找出問題的根源並找到解決方案。尋找問題根源時要具體明確。你可以上網搜尋相關信息,或向他人尋求建議。例如,另一個項目中的主函數被加入了這個項目。實際上存在重複的函數名稱。此外,還需要分析實驗現象並逐步進行。也可能是在定義連接埠時選擇了錯誤的介面。有時,如果實在無法解決,不妨停下來思考。無論問題多麼簡單,都應該重視,因為其中可能有錯誤。   
在微控制器應用開發中,程式碼使用效率、抗干擾性能和微控制器可靠性等問題仍然困擾著我們。本文總結了微控制器開發中需要掌握的幾項基本技能。        
 
 
  微控制器開發技能  
1 如何減少程式中的錯誤
關於如何減少程式錯誤,您首先應該考慮以下在系統運作期間應考慮的超出範圍管理參數。  
 
  • 物理參數:這些參數主要是系統的輸入參數,包括激勵參數、採集處理過程中的操作參數和處理結束時的結果參數。
  • 資源參數:這些參數主要是系統中電​​路、裝置和功能單元的資源,例如記憶體容量、儲存單元長度和堆疊深度。
  • 應用參數:這些應用參數通常會作為某些微控制器和功能單元的應用條件出現。過程參數:指在系統運作過程中依序變化的參數。

2 如何提高 C 語言程式碼的效率
使用C語言進行微控制器程式設計是微控制器開發和應用領域不可避免的趨勢。如果想要在C語言程式設計中達到最高效率,最好熟悉所使用的C編譯器。首先測試每種C語言編譯方式對應的組合語言語句行數,以便清楚了解其效率。在以後的程式設計中,優先選擇編譯效率最高的語句。由於每個C編譯器都會存在一定的差異,因此編譯效率也會有所不同。對於嵌入式系統而言,優秀的C編譯器產生的程式碼長度和執行時間僅比用組譯語言編寫的相同函數長5%到20%。  
對於開發時間緊迫的複雜項目,可以使用C語言,但前提是您必須非常熟悉C語言以及MCU系統的C編譯器。尤其要注意C編譯系統支援的資料類型和演算法。雖然C語言是最常用的高階語言,但不同的MCU廠商擁有不同的C語言編譯系統,尤其是在某些特殊功能模組的操作方面。因此,如果您不了解這些特性,調試過程中會遇到很多問題,導致執行效率低於彙編語言。


3 如何解決微控制器的抗干擾問題
防止幹擾最有效的方法是消除乾擾源並阻斷幹擾路徑,但這往往難以做到,因此我們只能檢驗微控制器的抗干擾能力是否足夠強。在提升硬體系統抗干擾能力的同時,軟體抗干擾因其設計靈活、節省硬體資源和可靠性高等優點,正受到越來越多的關注。  
微控制器幹擾最常見的現象就是重設。至於程式失控,實際上可以使用軟體陷阱和看門狗機制將程式拉回到重設狀態。因此,微控制器軟體抵抗干擾的關鍵在於妥善處理復歸狀態。  
通常,微控制器會配備一些標誌暫存器,用於判斷重設原因;此外,你也可以自行將一些標誌位元儲存在 RAM 中。每次程式重設時,都可以透過判斷這些標誌位元來確定不同的重設原因;你也可以根據不同的標誌位元直接跳到對應的程式。這樣,程式就可以持續運行,使用者在使用過程中不會察覺到程式已被重設。  
4 如何測試微控制器系統的可靠性
當微控制器系統設計完成後,不同的微控制器系統產品會有不同的測試項目和方法,但有些項目是必須測試的:
 
  • 測試微控制器軟體功能的完整性
  • 開機和關機測試
  • 老化測試
  • 諸如靜電放電測試(ESD)和情緒釋放測試(EFT)等。

有時,我們也可以模擬人為使用過程中可能造成的損壞。例如,故意用人體或衣物摩擦微控制器系統的接點,以測試其抗靜電能力;或使用高功率電鑽靠近微控制器系統進行操作,以測試其抗電磁幹擾能力。


綜上所述,單晶片已成為電腦發展和應用的重要組成部分。單晶片應用的重要意義在於,它從根本上改變了傳統的控制系統設計想法和設計方法。


過去必須由類比電路或數位電路實現的大部分功能,現在都可以透過使用微控制器的軟體方法來實現。這種軟體取代硬體的控制技術也稱為微控制技術,它是傳統控制技術的革命。  
此外,在開發和應用過程中,我們必須掌握技能並提高效率,以便它能夠用於更廣泛的用途。        
       
晶片運作概述
       
晶片上的操作主要是對晶片內部暫存器的操作。晶片中的暫存器在記憶體中都有各自唯一的位址,操作就是對應位址的操作。在查看晶片時,首先要查看時序圖,然後了解對應的暫存器及其工作原理,定義所需的連接埠(這些連接埠可以透過程式識別),並編寫寫入操作流程和讀取操作流程。


如何將數據寫入晶片,如何讀取數據,以及透過哪個連接埠輸入或讀取數據(這是最重要的)。


透過總線連接晶片時,首先必須了解總線的協定。連接到 I2C 匯流排的晶片主要透過此匯流排進行控制。


1. 點陣中的一個74HC595用於列選擇,另外兩個用於顏色選擇。此點陣相當於一組二極體。


只有當一端接高電位而另一端接低電位時,二極體才能亮起。只是當一端接低電位不同時,就會亮起不同顏色的光。


定時器工作模式的選擇:高四位設定定時器T1,低四位設定定時器T0。然後,每個模式的最後兩位數字設定工作模式。設定兩個定時器時,請注意使用“或”(|)。使用中斷時,注意在進入中斷後清除那些需要清除的定時器。


2. 串列埠收發器:模式 2(自動重載初始值)通常用於設定波特率。由於不同設備的資料處理能力不同,設定波特率主要是為了兼顧低速設備之間的通訊。中斷標誌位元必須由軟體清除。設定串口中斷時,無論是傳送或接收產生的中斷都可能進入中斷功能,因此需要注意中斷功能的設定。 (一般依自身情況設置,作為主機或從機)。


如果使用中斷發送數據,則必須先弄清楚如何首次進入中斷狀態,因此必須先發送一次數據,然後才能進入中斷狀態。每次只能傳送一個字節,並且只有在 TI 被置位後才能傳送下一個位元組。


3. PCF8591AD轉換器有四個輸入通道。讀取PCF8591時,選擇其中一個通道,並讀取該通道的輸入電壓。轉換後的資料儲存在晶片中,然後讀取出來。讀取時,先寫入晶片位址,然後寫入元件子位址(0x40|頻道號碼),最後寫入讀取的資料。


4. DA轉換先將設備位址寫入晶片,然後寫入子位址(0x40),最後寫入待轉換的數字量。設備位址晶片資訊已輸入。


5. 對於液晶顯示屏,資料寫入顯示後,將一直顯示,不會持續刷新。如果需要更改,只能重新輸入。


6. 對於DS1302時脈晶片,讀取資料時,寫入資料時,第一個資料在第八個時脈週期的下降沿讀取,然後準備下一個輸出。注意程式的寫入方法和傳回值的位置。


7. 首先在DS1302中指定暫存器,然後向其寫入資料。晶片上的寄存器資料指示位址。 (我仍然不太理解寫入保護程式。寫入操作不是一直都在進行嗎?為什麼寫入保護仍然開啟?)


(根據前一位大神的說法,可以在初始化時間之後設定一個標誌位。如果有了這個標誌位,就不需要初始化時間了。但是,如果斷電,MCU的RAM無法保存這個標誌位,所以可以使用DS1302的RAM來保存這個標誌位,並在上電後讀取它。我也是個新手,最近打算用DS1302。


8. 最好把初始化程式碼寫下來,以免以後忘記。有時要注意讀寫時是先操作最低位還是最高位,可以根據時序圖來判斷。


9. 對於紅外線收發器,接收訊號時,它會根據兩個下降沿之間的時間間隔來判斷訊號是高電位還是低電位。在編寫程式時,首先使用計時器來確定時間間隔並保存,然後將其轉換為二進位(閱讀更多關於如何編寫此程式的內容,非常好)。


10. 步進馬達:主要用於開關控制。步進馬達的扭力隨轉速的增加而減少。主要用於工具機加工零件的自動送料,也可用於精度要求較高的控制場合。


步進馬達是一種開環控制元件,它將電脈衝訊號轉換為角位移或線位移。在非過載條件下,馬達的轉速和停止位置僅取決於脈衝訊號的頻率和脈衝數,不受負載變化的影響。當步進驅動器接收到脈衝訊號時,它會驅動步進馬達以固定的角度(稱為“步進角”)沿著設定的方向旋轉。馬達的旋轉以固定的角度逐步進行。透過控制脈衝數可以控制角位移,從而實現精確定位;同時,透過控制脈衝頻率可以控制馬達的轉速和加速度,從而實現調速。


11. 伺服馬達:伺服馬達是指伺服系統中控制機械零件運作的動力裝置。它是一種輔助馬達的間接傳動裝置。伺服馬達能夠非常精確地控制速度和位置,並將電壓訊號轉換為扭矩和轉速來驅動控制物件。伺服馬達的轉子速度由輸入訊號控制,且反應速度快。在自動控制系統中,它被用作執行器,具有機電時間常數小、線性度高、啟動電壓低等特點。它可以將接收到的電訊號轉換為馬達軸上的角位移或角速度輸出。伺服馬達分為直流伺服馬達和交流伺服馬達兩類。它們的主要特點是:當訊號電壓為零時,馬達不旋轉;隨著扭矩的增加,轉速以恆定速度降低。直流伺服馬達:應用範圍廣,主要用於小型汽車。


12. 漢字概述:
為了在顯示器或印表機上輸出漢字,需要根據圖形符號將漢字設計成點陣,從而得到對應的點陣碼(字碼)。


電腦中用於表示漢字的統一編碼方法形成一種稱為內部碼(例如國家標準碼)的漢字編碼,該內部碼是唯一的(相當於漢字的ID號)。為了方便漢字輸入而形成的漢字編碼是輸入碼,它是漢字的外部編碼。由於編碼方法的不同,輸入碼也不同,種類繁多。用於顯示和列印漢字的漢字編碼是字形碼。電腦透過漢字內部碼在字型模型庫中尋找漢字的字碼,並實現轉換。


相機內程式碼


根據國家標準編碼的規定,每個漢字都有一個特定的二進位編碼,但這個編碼在電腦內部處理時會與ASCII碼衝突。為了解決這個問題,將國家標準編碼每個位元組的第一位加1。由於ASCII碼只使用7位,第一位的「1」可以作為漢字編碼的標記。當電腦處理第一位為「1」的編碼時,它將其識別為漢字資訊;當處理第一位為「0」的編碼時,它將其識別為ASCII碼。這樣處理後的國家標準編碼(內部編碼)就是內部編碼。


如果我們把這個“口”字形中的“.”替換成“0”,就能非常清晰地得到“口”字的字形代碼:0000H 0004H 3FFAH 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H 0000H。當電腦想要輸出「口」字時,它首先找到顯示字體庫的第一個位址,根據「口」字的內部程式碼進行計算,然後找到「口」字的字形代碼,再透過字元產生器的控制,按照字形代碼(二進位)順序掃描螢幕。當二進位代碼為「0」時,掃描「0」所在的位置,掃描「1」所在的位置並高亮顯示,從而得到「口」字的字元模式。


漢字字體按照國家標準代碼的順序排列,並以二進位檔案的形式儲存在記憶體中,形成漢字字體庫,也稱為漢字字形庫或漢字庫。


兩種編碼方法,請參考頭文件


GB1616.h//------------------ 中文字體資料結構定義 ------------------------//structtypFNT_GB16 //中文字體資料結構 {unsignedcharIndex[3]; //中文字元內部程式碼索引 unsignedchar Msk[32];//點陣程式碼資料 }; /// ... :Xu;寬度×高度(像素):16×16--------------------------------------------------------------------------------*/"Xu",0x10,0x80,0x10,0x80,0x21 ,0x40,0x42,0x20,0x94,0x10,0x1B,0xEC,0x20,0x80,0x60,0x80,0xAF,0xF8,0x 20,0x80,0x22,0xA0,0x24,0x90,0x2A,0x88,0x21,0x00,0x00,0x00,0x00,0x00,
 
這種結構非常簡單:一部分是內部程式碼,一部分是點陣序列。之前的點陣庫是按照內部程式碼的順序放置的,不需要內部程式碼索引。如果只放置一些漢字,則需要內部代碼索引。 (前面的漢字「Xu」是為了在輸出「Xu」時查找對應的點陣序列。這個點陣序列是我自己寫的。當使用1602顯示時,由於晶片記憶體中已經儲存了英文點陣序列,所以不需要再編寫。)通常,內部程式碼只需要兩個位元組就足夠了。如果需要多用一個字節,只需在末尾添加一個0即可。這樣,就可以直接將漢字字串放入漢字內部程式碼中;


codeGB_16[k].Index[0] 表示存在一個名為 codeGB_16 的結構體 typFNT_GB16 的陣列。 codeGB_16[k] 是該陣列的第 k+1 個成員。 index 是結構體 typFNT_GB16 的成員,因此可以用 codeGB_16[k].Index 來引用。同時,index 本身也是一個數組,所以可以用 indexed[0] 來存取。如果 ((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1])),&& 是一個邏輯與運算符,表示 && 符號兩側的值都為真。只有 && 的值是真,即 true && true = true。這句話的意思是:codeGB_16[k].Index[0]==c[0] 和 codeGB_16[k].Index[1]==c[1] 同時成立。如果執行下列語句,則 codeGB_16[] 是一個結構體數組,codeGB_16[k].Index[0] 表示該結構體數組中第 k 個結構體的索引成員的第 0 個元素的值。  
      13. 12864 LCD:

每個顯示點對應一個二進位數,1 表示開,0 表示關。儲存這些點陣資訊的 RAM 稱為顯示資料記憶體。要顯示某個圖形或漢字,就需要將對應的點陣資訊寫入對應的儲存單元。  
圖形記憶體的位址計數器 (AC) 只會自動將水平位址(X 軸)加一。當水平位址為 0FH 時,它將被重設為 00H。但是,它不會自動將垂直位址加一並帶進位。因此,當連續寫入多個資料時,程式需要判斷是否需要重置垂直位址。


14. 繪圖 RAM(GDRAM)

繪圖顯示RAM提供128×8位元組的記憶體空間。修改繪圖RAM時,先連續寫入水平和垂直座標值,然後再向繪圖RAM寫入兩個位元組的資料。位址計數器(AC)會自動將水平位址(X位址)加1。當水平位址為0XFH時,將重設為00H;垂直位址不會自動加1。寫入繪圖RAM時,必須關閉繪圖顯示。

 
[cpp] view plain copy//顯示中文字元 voiddispString (uchar X, Y,uchar *msg)//哪行是 X,哪列是 Y。 msg 是中文字元 {if(X==0) write_data(*msg++); //顯示中文字元}}////////////////////////////////// /////////////////////////// i,j;//*******顯示螢幕上半部內容設定 for(i=0;i<32;i++)//螢幕上半部32列位址 { write_com(0x80 + i);//設定垂直位址 VERTICALADD write_com(0x80);//設定水平位址 HORIZONTALrite ADDfor(jd=0dj++djd); //************在螢幕下半部顯示內容設定 for(i=0;i<32;i++) //{ write_com(0x80 + i); //設定垂直位址 VERTICALADD write_com(0x88); //設定水平位址 HORIZONTAL ADD for(j=0;j<16;j++){wder_data(++adder);
 
在 C 語言中,系統會自動為定義的變數分配空間,變數的位址就是變數名。透過這個名稱,可以從記憶體中檢索數據,也可以透過計算來獲得新的數據。然而,在組合語言中,程式設計師需要定義儲存空間,並將資料傳送到累加器進行計算。每一步都需要程式設計師的操作。而在 C 語言中,這些過程都是由編譯器自動完成。




15. 一些有用的問題和答案

① 在微控制器C語言中,變數的記憶體分配是如何進行的?編譯器是否會在編譯過程中智慧地添加分配和回收程式碼?關鍵在於,我編寫的程式如何確保不會出現記憶體溢位錯誤?如果我進行遞歸操作,那麼記憶體需求很難自行計算。




②. 微控制器C語言在變數定義上是否會受到限制?例如,浮點資料的乘除運算是用彙編語言編寫的,程式碼相當複雜。如果直接用C語言寫,會不會太簡單?




③ 在微控制器的 C 語言產生的 hex 檔案中,指令 ROM 和資料 ROM 的位址分配是由編譯器自動分配的嗎?用戶可以自行分配嗎?




答 1:首先,一個用 C 語言寫的微控制器程式被一個程式(似乎是 c51.exe)編譯。編譯完成後,變數的儲存空間大小已分配完畢,但具體位址尚未分配(位址是浮空的)。接下來,另一個程式(似乎是 a51.exe)被連接。連接完成後,具體地址被確定。  
如果變數過多,編譯器會提示資料段過大。為避免記憶體溢出錯誤,主要考慮的是棧溢出,而這取決於經驗。




微控制器的C語言通常禁止遞迴,遞迴操作也一般避免使用。畢竟,微控制器不是PC,遞歸會影響速度。如果需要遞歸,最好使用DSP晶片。總之,必須能夠選擇合適的晶片。




答案 2:變數的大小(位數)通常與晶片累加器的位數相同。例如,數字 51 通常使用 8 位,因為它是 8 位微控制器。

微控制器可以定義位元變量,但不能定義位數組。用C語言編寫程式碼看似簡單,但實際上會產生大量的程式碼。用於控制的微控制器幾乎不使用浮點運算,這不僅速度慢,而且繁瑣並佔用空間。如果是DSP晶片,擁有合適的硬體結構會更好。




答案 3:通常情況下,它是自動分配的。它可以用 C 語言和彙編語言混合編程,也可以使用 Keil C 在線彙編。晶片與外部之間的資料交換透過​​連接埠進行。



公司電話號碼:+86-0755-83044319
傳真:+86-0755-83975897
郵箱:1615456225@qq.com
QQ:3518641314 李經理

QQ:332496225 邱經理

地址:深圳市龍華新區民治大道1079號展濤科技大樓C座809室

whatsapp

WhatsApp

Whatsapp:+8618073002950