




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
《嵌入式技術(shù)及應(yīng)用》“教學做一體化”課程學習內(nèi)容嵌入式系統(tǒng)概述1STM32嵌入式C語言編程特點2STM32嵌入式開發(fā)基礎(chǔ)知識3實踐項目1——點亮LED燈4實踐項目2——按鍵檢測5實踐項目3——LCD12864顯示6實踐項目4——中斷按鍵7實踐項目5——SysTick實現(xiàn)精確延時8階段項目——狀態(tài)機編程實現(xiàn)按鍵長按短按操作9實踐項目6——USART實現(xiàn)計算機控制LED燈10實踐項目7——ADC數(shù)據(jù)采集11實踐項目8——利用DMA實現(xiàn)多路ADC數(shù)據(jù)采集12實踐項目9——TIM定時器的PWM控制LED亮度13實踐項目10——LCD彩屏顯示模擬時鐘14實踐項目11——μC/OS-III操作系統(tǒng)15綜合項目——溫濕度測量儀設(shè)計16第1章嵌入式系統(tǒng)概述第1章
嵌入式系統(tǒng)概述學習目標 理解單片機、嵌入式系統(tǒng)的基本概念,了解嵌入式系統(tǒng)的發(fā)展過程及其特點。 掌握精簡指令集與復(fù)雜指令集的基本概念,理解指令集對性能的影響。 掌握普林斯頓結(jié)構(gòu)和哈佛結(jié)構(gòu)的概念,理解結(jié)構(gòu)對系統(tǒng)性能的影響。 了解ARM公司及其商業(yè)模式,了解ARM的產(chǎn)品體系,重點理解Cortex-M核心的微處理器系列及其特點。 掌握STM32處理器的資源分布、特點和選型。第1章
嵌入式系統(tǒng)概述任務(wù)描述通過學習基本概念,了解嵌入式系統(tǒng)的結(jié)構(gòu)和指令集,理解結(jié)構(gòu)和指令集對嵌入式系統(tǒng)性能的影響。學會STM32處理器的選型。第1章
嵌入式系統(tǒng)概述1.1從單片機到嵌入式系統(tǒng)1.2精簡指令集計算機與復(fù)雜指令集計算機1.3普林斯頓結(jié)構(gòu)和哈佛結(jié)構(gòu)1.4ARM公司及其微處理器1.5STM32F103系列微控制器1.1從單片機到嵌入式系統(tǒng)單片機、嵌入式都是耳熟能詳?shù)拿~,到底什么是單片機?什么是嵌入式呢?1.1從單片機到嵌入式系統(tǒng)1.1.1單片機系統(tǒng)1.1.2嵌入式系統(tǒng)1.1.1單片機系統(tǒng)單片機(Single-ChipMicrocomputer)是一種集成電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計數(shù)器等功能(可能還包括顯示驅(qū)動電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個小而完善的微型計算機系統(tǒng)。從上世紀80年代,由當時的4位、8位單片機,發(fā)展到現(xiàn)在的300M的高速單片機1.1.1單片機系統(tǒng)單片機又稱單片微控制器,它不是完成某一個邏輯功能的芯片,而是把一個計算機系統(tǒng)集成到一個芯片上。相當于一個微型的計算機,和計算機相比,單片機只缺少了I/O設(shè)備。概括的講:一塊芯片就成了一臺計算機。相對功能比較強大的個人計算機(PC),單片機的運算能力是有限的,但是單片機憑借體積小、功耗低、質(zhì)量輕、價格便宜等特點,已經(jīng)滲透到日常生產(chǎn)生活的方方面面,在工業(yè)控制、國防技術(shù)、智能儀表、通訊設(shè)備、導航系統(tǒng)、家用電器、消費電子產(chǎn)品等領(lǐng)域得到了廣泛應(yīng)用。1.1.1單片機系統(tǒng)從二十世紀九十年代開始,單片機技術(shù)就已經(jīng)發(fā)展起來,隨著時代的進步與科技的發(fā)展,目前該技術(shù)的實踐應(yīng)用日漸成熟,單片機被廣泛應(yīng)用于各個領(lǐng)域?,F(xiàn)如今,人們越來越重視單片機在智能電子技術(shù)方面的開發(fā)和應(yīng)用,單片機的發(fā)展進入到新的時期,無論是自動測量還是智能儀表的實踐,都能看到單片機技術(shù)的身影。當前工業(yè)發(fā)展進程中,電子行業(yè)屬于新興產(chǎn)業(yè),工業(yè)生產(chǎn)中人們將電子信息技術(shù)成功運用,讓電子信息技術(shù)與單片機技術(shù)相融合,有效提高了單片機應(yīng)用效果。作為計算機技術(shù)中的一個分支,單片機技術(shù)在電子產(chǎn)品領(lǐng)域的應(yīng)用,豐富了電子產(chǎn)品的功能,也為智能化電子設(shè)備的開發(fā)和應(yīng)用提供了新的出路,實現(xiàn)了智能化電子設(shè)備的創(chuàng)新與發(fā)展1.1.1單片機系統(tǒng)隨著電子產(chǎn)品人機交互界面彩屏化、觸摸化以及通訊網(wǎng)絡(luò)化的趨勢,運算能力有限的8位乃至16位單片機已經(jīng)越來越不能滿足需求,具有較強運算能力的32位嵌入式系統(tǒng)的優(yōu)勢日益突顯。1.1.2嵌入式系統(tǒng)1.什么是嵌入式系統(tǒng)嵌入式系統(tǒng)(Embeddedsystem)是以應(yīng)用為中心,以現(xiàn)代計算機技術(shù)為基礎(chǔ),能夠根據(jù)用戶需求(功能、可靠性、成本、體積、功耗、環(huán)境等)靈活裁剪軟硬件模塊的專用計算機系統(tǒng)。1.1.2嵌入式系統(tǒng)1.什么是嵌入式系統(tǒng)要點概括為:(1)以應(yīng)用為中心(2)專用性(3)以現(xiàn)代計算機技術(shù)為核心(4)軟硬件可裁剪1.1.2嵌入式系統(tǒng)2.嵌入式系統(tǒng)的發(fā)展1971年11月,算術(shù)運算器和控制器電路成功的被集成在一起,推出了第一款微處理器20世紀80年代,隨著微電子工藝水平的提高,集成電路制造商開始把嵌入式計算機應(yīng)用中所需要的微處理器、I/O接口、A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器、串行接口,以及RAM、ROM等部件全部集成到一個VLSI中,從而制造出面向I/O設(shè)計的微控制器,即俗稱的單片機1.1.2嵌入式系統(tǒng)2.嵌入式系統(tǒng)的發(fā)展嵌入式系統(tǒng)的發(fā)展大致經(jīng)歷了以下三個階段:第一階段:嵌入技術(shù)的早期階段。嵌入式系統(tǒng)以功能簡單的專用計算機或單片機為核心的可編程控制器形式存在,具有監(jiān)測、伺服、設(shè)備指示等功能。第二階段:以高端嵌入式CPU和嵌入式操作系統(tǒng)為標志。這一階段系統(tǒng)的主要特點是計算機硬件出現(xiàn)了高可靠、低功耗的嵌入式CPU,且支持操作系統(tǒng),支持復(fù)雜應(yīng)用程序的開發(fā)和運行。第三階段:以芯片技術(shù)和Internet技術(shù)為標志。微電子技術(shù)發(fā)展迅速,SOC(片上系統(tǒng))使嵌入式系統(tǒng)越來越小,功能卻越來越強。目前大多數(shù)嵌入式系統(tǒng)還孤立于Internet之外,但隨著Internet的發(fā)展及Internet技術(shù)與信息家電、工業(yè)控制技術(shù)等結(jié)合日益密切,嵌入式技術(shù)正在進入快速發(fā)展和廣泛應(yīng)用的時期。1.1.2嵌入式系統(tǒng)3.嵌入式系統(tǒng)的特點嵌入式系統(tǒng)的硬件和軟件必須根據(jù)具體的應(yīng)用任務(wù),以功耗、成本、體積、可靠性、處理能力等為指標來進行選擇。嵌入式系統(tǒng)的核心是系統(tǒng)軟件和應(yīng)用軟件,由于存儲空間有限,因而要求軟件代碼緊湊、可靠,且對實時性有嚴格要求。從構(gòu)成上看,嵌入式系統(tǒng)是集軟硬件于一體的、可獨立工作的計算機系統(tǒng);從外觀上看,嵌入式系統(tǒng)像是一個“可編程”的電子“器件”;從功能上看,它是對目標系統(tǒng)(宿主對象)進行控制,使其智能化的控制器。1.1.2嵌入式系統(tǒng)4.嵌入式系統(tǒng)、單片機系統(tǒng)與通用計算機系統(tǒng)的關(guān)系圖1-1嵌入式系統(tǒng)、單片機系統(tǒng)與通用計算機系統(tǒng)1.2精簡指令集計算機與復(fù)雜指令集計算機精簡指令集計算機(RISC:ReducedInstructionSetComputing)復(fù)雜指令集計算機(CISC:ComplexInstructionSetComputing)1.2精簡指令集計算機與復(fù)雜指令集計算機精簡指令集計算機(RISC:ReducedInstructionSetComputing)復(fù)雜指令集計算機(CISC:ComplexInstructionSetComputing)計算機處理器包含有實現(xiàn)各種功能的指令或微指令,指令集越豐富,為微處理器編寫程序就越容易,但是豐富的微指令集會影響其性能。1.2精簡指令集計算機與復(fù)雜指令集計算機復(fù)雜指令集計算機(CISC)體系結(jié)構(gòu)的設(shè)計策略是使用大量的指令,包括復(fù)雜指令。在CISC中進行程序設(shè)計要比在其他設(shè)計中容易,因為每一項簡單或復(fù)雜的任務(wù)都有一條對應(yīng)的指令。程序設(shè)計者不需要寫一大堆指令去完成一項復(fù)雜的任務(wù)。指令集的復(fù)雜性使得CPU和控制單元的電路非常復(fù)雜。帶來的副作用是價格和功耗較高。典型的CISC處理器包括Intel的X86架構(gòu)處理器以及8051單片機。1.2精簡指令集計算機與復(fù)雜指令集計算機在CISC指令集的各種指令中,其使用頻率卻相差懸殊,大約有20%的指令會被反復(fù)使用,占整個程序代碼的80%。而余下的80%的指令卻不經(jīng)常使用,在程序設(shè)計中只占20%。CISC處理器的復(fù)雜結(jié)構(gòu)只是為了使用率不高的復(fù)雜運算指令服務(wù),這顯然是不劃算的,于是RISC處理器應(yīng)運而生。1.2精簡指令集計算機與復(fù)雜指令集計算機RISC的指令系統(tǒng)相對簡單,它只要求硬件執(zhí)行很有限且最常用的那部分指令,大部分復(fù)雜的操作則使用成熟的編譯技術(shù),由簡單指令合成。目前在中高檔服務(wù)器中普遍采用這一指令系統(tǒng)的CPU,特別是高檔服務(wù)器全都采用RISC指令系統(tǒng)的CPU。采用RISC指令的CPU主要有Compaq(康柏,即新惠普)公司的Alpha、HP公司的PA-RISC、IBM公司的PowerPC、MIPS公司的MIPS和SUN公司的Sparc。1.2精簡指令集計算機與復(fù)雜指令集計算機RISC設(shè)計方案是根據(jù)JohnCocke在IBM所做的工作形成的。JohnCocke發(fā)現(xiàn)大約20%的計算機指令完成大約80%的工作。因此,基于RISC的系統(tǒng)通常比CISC系統(tǒng)速度快。它的80/20規(guī)則促進了RISC體系結(jié)構(gòu)的發(fā)展。RISC把主要精力放在放在那些常用的指令上,盡量使它們簡單高效。對不常用的復(fù)雜運算,通常采用指令組合來完成,因此在RISC處理器中進行復(fù)雜運算時效率可能較低,但是可以利用流水線技術(shù)加以彌補。1.2精簡指令集計算機與復(fù)雜指令集計算機從硬件角度看,CISC處理的是不等長指令,它必須對不等長指令進行分割,在執(zhí)行單一指令的時候,需要進行較多的處理工作;而RISC執(zhí)行的是等長指令集,CPU在執(zhí)行指令的時候速度較快且性能穩(wěn)定,在并行處理方面,RISC明顯優(yōu)于CISC,RISC可同時執(zhí)行多條指令,將一條指令分割成若干個進程或線程,交由多個處理器同時執(zhí)行。由于RISC執(zhí)行的是精簡指令集,對應(yīng)的處理器硬件結(jié)構(gòu)相對而言復(fù)雜度不高,所以它的制造工藝簡單且成本相對低廉。1.3普林斯頓結(jié)構(gòu)和哈佛結(jié)構(gòu)1.3.1普林斯頓結(jié)構(gòu)1.3.2哈佛結(jié)構(gòu)1.3.1普林斯頓結(jié)構(gòu)圖1-2普林斯頓結(jié)構(gòu)示意圖普林斯頓結(jié)構(gòu)也稱馮·諾依曼結(jié)構(gòu)三個基本原則,即采用二進制邏輯、程序存儲執(zhí)行以及計算機由五個部分組成(運算器、控制器、存儲器、輸入設(shè)備、輸出設(shè)備),這套理論被稱為馮·諾依曼體系結(jié)構(gòu)。1.3.1普林斯頓結(jié)構(gòu)圖1-2普林斯頓結(jié)構(gòu)示意圖1.普林斯頓結(jié)構(gòu)的特點(1)單處理機結(jié)構(gòu),機器以運算器為中心;(2)采用程序存儲思想;(3)指令和數(shù)據(jù)一樣可以參與運算;(4)數(shù)據(jù)以二進制表示;(5)將軟件和硬件完全分離;(6)指令由操作碼和操作數(shù)組成;(7)指令順序執(zhí)行。1.3.1普林斯頓結(jié)構(gòu)圖1-2普林斯頓結(jié)構(gòu)示意圖2.普林斯頓結(jié)構(gòu)的局限(1)指令和數(shù)據(jù)存儲在同一個存儲器中,形成系統(tǒng)對存儲器的過分依賴。(2)指令在存儲器中按其執(zhí)行順序存放,由指令計數(shù)器PC指明要執(zhí)行的指令所在的單元地址。然后取出指令執(zhí)行操作任務(wù)。所以指令的執(zhí)行是串行。影響了系統(tǒng)執(zhí)行的速度。(3)存儲器是按地址訪問的線性編址,按順序排列的地址訪問,利于存儲和執(zhí)行的機器語言指令,適用于作數(shù)值計算。但是高級語言表示的存儲器則是一組有名字的變量,按名字調(diào)用變量,不按地址訪問。機器語言同高級語言在語義上存在很大的間隔,稱之為馮·諾依曼語義間隔。消除語義間隔成了計算機發(fā)展面臨的一大難題。(4)馮·諾依曼體系結(jié)構(gòu)計算機是為算術(shù)和邏輯運算而誕生的,目前在數(shù)值處理方面已經(jīng)到達較高的速度和精度,而非數(shù)值處理應(yīng)用領(lǐng)域發(fā)展緩慢,需要在體系結(jié)構(gòu)方面有重大的突破。(5)傳統(tǒng)的馮·諾依曼型結(jié)構(gòu)屬于控制驅(qū)動方式。它是執(zhí)行指令代碼對數(shù)值代碼進行處理,只要指令明確,輸入數(shù)據(jù)準確,啟動程序后自動運行而且結(jié)果是預(yù)期的。一旦指令和數(shù)據(jù)有錯誤,機器不會主動修改指令并完善程序。而人類生活中有許多信息是模糊的,事件的發(fā)生、發(fā)展和結(jié)果是不能預(yù)期的,現(xiàn)代計算機的智能是無法應(yīng)對如此復(fù)雜任務(wù)的。1.3.2哈佛結(jié)構(gòu)圖1-2普林斯頓結(jié)構(gòu)示意圖哈佛結(jié)構(gòu)的計算機分為三大部件:(1)CPU;(2)程序存儲器;(3)數(shù)據(jù)存儲器它的特點是將程序指令和數(shù)據(jù)分開存儲,由于數(shù)據(jù)存儲器與程序存儲器采用不同的總線,因而較大的提高了存儲器的帶寬,使之數(shù)字信號處理性能更加優(yōu)越。圖1-3哈佛結(jié)構(gòu)示意圖1.3.2哈佛結(jié)構(gòu)圖1-2普林斯頓結(jié)構(gòu)示意圖高性能處理器的發(fā)展趨勢是在芯片內(nèi)部使用結(jié)構(gòu)復(fù)雜、效率較高的哈佛結(jié)構(gòu),在芯片外部使用結(jié)構(gòu)簡單的普林斯頓結(jié)構(gòu)。本書使用的STM32微控制器使用了ARM公司的Cortex-M3內(nèi)核,是一款采用哈佛結(jié)構(gòu)的RISC處理器。圖1-3哈佛結(jié)構(gòu)示意圖1.4ARM公司及其微處理器1.4.1ARM公司簡介1.4.2ARM的產(chǎn)品體系1.4.3ARMCortex-M系列處理器1.4.1ARM公司簡介1978年12月,劍橋處理器(CambridgeProcessorUnit)公司在英國劍橋創(chuàng)辦,公司的創(chuàng)始人是一個名叫HermannHauser的奧地利籍物理學博士,還有他的朋友,一個名叫ChrisCurry的英國工程師。主要從事電子設(shè)備設(shè)計和制造的業(yè)務(wù)。1979年合并其他公司后改名AcornComputerLtd。1.4.1ARM公司簡介1981年,公司迎來了一個難得的機遇——英國廣播公司BBC打算在整個英國播放一套提高電腦普及水平的節(jié)目,他們希望Acorn能生產(chǎn)一款與之配套的電腦。Acorn公司贏得了“BBCMicro”生產(chǎn)的合同。產(chǎn)品推向市場后取得了意想不到的成功,預(yù)計銷售1.2萬臺,結(jié)果卻賣出了150萬臺,Acorn初戰(zhàn)告捷。1.4.1ARM公司簡介1982年,Acorn公司打算使用摩托羅拉公司的16位處理器芯片,但是發(fā)現(xiàn)這種芯片太慢也太貴,轉(zhuǎn)而向Intel公司索要80286處理器芯片的設(shè)計資料卻遭到拒絕,于是被迫開始自行研發(fā)。1985年,Acorn設(shè)計了自己的第一代32位、主頻6MHz的RISC處理器ARM1,簡稱ARM(AcornRISCMachine)。在ARM1之后,Acorn陸續(xù)推出了好幾個系列,例如ARM2,ARM3。1.4.1ARM公司簡介1990年,Acorn為了和蘋果合作,專門成立了一家公司,名叫ARM(AdvancedRISCMachines)。ARM是一家合資公司,蘋果投了150萬英鎊,芯片廠商VLSI投了25萬英鎊,Acorn本身則以150萬英鎊的知識產(chǎn)權(quán)和12名工程師入股。蘋果公司使用ARM610芯片作為AppleNewtonPDA的CPU。1.4.1ARM公司簡介ARM決定改變他們的產(chǎn)品策略——他們不再生產(chǎn)芯片,轉(zhuǎn)而以授權(quán)的方式,將芯片設(shè)計方案轉(zhuǎn)讓給其他公司,即“Partnership”開放模式。ARM所采取的是IP(IntellectualProperty,知識產(chǎn)權(quán))授權(quán)的商業(yè)模式,收取一次性技術(shù)授權(quán)費用和版稅提成。1.4.1ARM公司簡介具體來說,ARM有三種授權(quán)方式:處理器、POP以及架構(gòu)授權(quán)。圖1-4ARM公司的商業(yè)運行模式1.4.1ARM公司簡介1998年4月17日,業(yè)務(wù)飛速發(fā)展的ARM控股公司,同時在倫敦證交所和納斯達克上市。在ARM公司上市之后,處于后喬布斯時代的蘋果公司,逐步賣掉了所持有的ARM股票,把資金投入到ipod產(chǎn)品的開發(fā)上。鑒于蘋果研究人員對ARM芯片架構(gòu)非常熟悉,ipod也繼續(xù)使用了ARM芯片。1.4.1ARM公司簡介2007年,真正的劃時代產(chǎn)品iPhone的出現(xiàn),徹底顛覆了移動電話的設(shè)計,開啟了全新的時代。第一代iPhone,使用了ARM設(shè)計、三星制造的芯片。iphone的熱銷,AppStore的迅速崛起,讓全球移動應(yīng)用徹底綁定在ARM指令集上。緊接著,2008年,谷歌推出了Android(安卓)系統(tǒng),也是基于ARM指令集。至此,智能手機進入了飛速發(fā)展階段,ARM也因此奠定了在智能手機市場的霸主地位。同年,ARM芯片的出貨量達到了一百億顆。1.4.1ARM公司簡介2011年,微軟也宣布Windows8平臺將支持ARM架構(gòu)。2010年6月,蘋果公司向ARM董事會表示有意以85億美元的價格收購ARM公司,但遭到ARM董事會的拒絕。2016年7月18日,曾經(jīng)投資阿里巴巴的韓裔日本商人孫正義和他的日本軟銀集團,以243億英鎊(約309億美元)收購了ARM集團。至此,ARM成為軟銀集團旗下的全資子公司。不過,軟銀集團表示,不會干預(yù)或影響ARM未來的商業(yè)計劃和決策。1.4.2ARM的產(chǎn)品體系A(chǔ)RM處理器發(fā)展到現(xiàn)在,其內(nèi)核架構(gòu)從ARMv1發(fā)展到ARMv8。體系架構(gòu)處理器家族ARMv1ARM1ARMv2ARM2、ARM3ARMv3ARM6、ARM600、ARM610、ARM7、ARM700、ARM710ARMv4StrongARM、ARM8、ARM810、ARM7-TDMI、ARM9-TDMIARMv5ARM7EJ、ARM9E、ARM10E、XScaleARMv6ARM11表1-1ARMv7前的產(chǎn)品對應(yīng)體系架構(gòu)1.4.2ARM的產(chǎn)品體系A(chǔ)RM11芯片之后,也就是從ARMv7架構(gòu)開始,ARM的命名方式有所改變,不在沿用過去的數(shù)字命名方式在新的處理器家族,以Cortex命名,并分為Cortex-A,Cortex-R和Cortex-M三個系列。1.4.2ARM的產(chǎn)品體系(1)Cortex-A系列(A:Application)針對日益增長的消費娛樂和無線產(chǎn)品設(shè)計,用于具有高計算要求、運行豐富操作系統(tǒng)及提供交互媒體和圖形體驗的應(yīng)用領(lǐng)域,如智能手機、平板電腦、汽車娛樂系統(tǒng)、數(shù)字電視等。圖1-5ARM公司部分Cortex-A系列內(nèi)核
1.4.2ARM的產(chǎn)品體系(2)Cortex-R系列(R:Real-time)針對需要運行實時操作的系統(tǒng)應(yīng)用,面向如汽車制動系統(tǒng)、動力傳動解決方案、大容量存儲控制器等深層嵌入式實時應(yīng)用。圖1-6ARM公司部分Cortex-R系列內(nèi)核
1.4.2ARM的產(chǎn)品體系(3)Cortex-M系列(M:Microcontroller)該系列面向微控制器領(lǐng)域,主要針對成本和功耗敏感的應(yīng)用,如智能測量、人機接口設(shè)備、汽車和工業(yè)控制系統(tǒng)、家用電器、消費性產(chǎn)品和醫(yī)療器械等。圖1-7ARM公司部分Cortex-M系列內(nèi)核1.4.3ARMCortex-M系列處理器圖1-8Cortex-M系列內(nèi)核的進化1.4.3ARMCortex-M系列處理器發(fā)布時間內(nèi)核名稱應(yīng)用面向及主要特點2004年10月Cortex-M3針對低功耗微控制器設(shè)計的處理器,面積小但是性能強勁,支持處理器快速處理復(fù)雜任務(wù)的豐富指令集。具有硬件除法器和乘加指令(MAC),并且,M3支持全面的調(diào)試和跟蹤功能,使軟件開發(fā)更加高效。2007年3月Cortex-M1面向現(xiàn)場可編程門陣列(FPGA)中應(yīng)用設(shè)計實現(xiàn)的ARM處理器,利用FPGA上的存儲器塊實現(xiàn)了緊耦合內(nèi)存(TCM)和Cortex-M0有相同的指令集。2009年2月Cortex-M0面向低成本,超低功耗的微控制器和深度嵌入應(yīng)用的非常小的處理器(最小12K
門的面積),采用普林斯頓結(jié)構(gòu)2010年2月Cortex-M4在M3內(nèi)核基礎(chǔ)上增加了單精度浮點運算、數(shù)字信號處理(DSP)等功能,以滿足數(shù)字信號控制市場的需求2012年3月Cortex-M0+針對小型嵌入式系統(tǒng)的最高能效的處理器,與Cortex-M0處理器接近的尺寸大小和編程模式,但是具有擴展功能,如單周期I/O接口和向量表重定位功能。2014年9月Cortex-M7針對高端微控制和數(shù)據(jù)處理密集的應(yīng)用開發(fā)的高性能處理器。在M4內(nèi)核的基礎(chǔ)上進一步提升計算性能和數(shù)字信號處理能力。支持雙精度浮點運算,具備擴展的存儲器功能。2016年Cortex-M23面向超低功耗,低成本應(yīng)用設(shè)計的小尺寸處理器,和Cortex-M0相似,但是支持各種增強的指令集和系統(tǒng)層面的功能特性。增加了安全技術(shù)TrustZone。Cortex-M33主流的處理器設(shè)計,與M3、M4類似,但系統(tǒng)設(shè)計更加靈活。因采用全新架構(gòu)ARMv8架構(gòu),能效比更高效,性能更高
。增加了安全技術(shù)TrustZone,Cortex-M33性能相較M4提升了20%,而能效方面保持一致。另外與Cortex-A5比較,其體積要小80%。表1-2Cortex-M內(nèi)核處理器家族1.5STM32F103系列微控制器Cortex-M3處理器內(nèi)核是單片機的中央處理單元(CPU)。在芯片制造商得到CM3處理器內(nèi)核的使用授權(quán)后,它們就可以把CM3內(nèi)核用在自己的硅片設(shè)計中,添加存儲器、外設(shè)、I/O以及其它功能塊。不同廠家設(shè)計出的單片機會有不同的配置,包括存儲器容量、類型、外設(shè)等都各具特色。如果想要了解某個具體型號的處理器,還需查閱相關(guān)廠家提供的文檔。1.5STM32F103系列微控制器圖1-9基于CM3核的處理器簡圖1.5STM32F103系列微控制器1.STM32F10x系列微控制器圖1-10STM32F10x系列微控制器資源分布圖1.5STM32F103系列微控制器1.STM32F10x系列微控制器(1)STM32F100為“超值型”,主頻最高達到24MHz,具有電機控制和消費電子控制(CEC:ConsumerElectronicsControl)功能。(2)STM32F101為“基本型”,主頻最高達到36MHz,具有高達1MB的閃存。(3)STM32F102為“USB基本型”,主頻最高達到48MHz,具有全速(FS:FullSpeed)USB接口。(4)STM32F105/107為“互聯(lián)型”,主頻最高達到72MHz,具有以太網(wǎng)MAC層協(xié)議接口、CAN總線接口和USB2.0OTG接口。(5)STM32F103為“增強型”,主頻最高達到72MHz,是同類產(chǎn)品中接口最完備、性能最強的。STM32F103系列微控制器最多擁有1MB閃存(FLASH)存儲空間和96KB內(nèi)存,具有GPIO、通用定時器、RTC、ADC、USART、SPI等傳統(tǒng)外設(shè),以及高級定時器、USB、SDIO、FSMC、DMA、DAC等增強型外設(shè)。1.5STM32F103系列微控制器2.增強型STM32F103系列微控制器1.5STM32F103系列微控制器2.增強型STM32F103系列微控制器命名規(guī)則1.5STM32F103系列微控制器2.增強型STM32F103系列微控制器利用官網(wǎng)()的在線選型工具進行。第1章嵌入式系統(tǒng)概述小結(jié) 理解單片機、嵌入式系統(tǒng)的基本概念,了解嵌入式系統(tǒng)的發(fā)展過程及其特點。掌握精簡指令集與復(fù)雜指令集的基本概念,理解指令集對性能的影響。掌握普林斯頓結(jié)構(gòu)和哈佛結(jié)構(gòu)的概念,理解結(jié)構(gòu)對系統(tǒng)性能的影響。了解ARM公司及其商業(yè)模式,了解ARM的產(chǎn)品體系,重點理解Cortex-M核心的微處理器系列及其特點。掌握STM32處理器的資源分布、特點和選型。謝謝!微信E-mail:XS_CHEN@126.com《嵌入式技術(shù)及應(yīng)用》“教學做一體化”課程學習內(nèi)容嵌入式系統(tǒng)概述1STM32嵌入式C語言編程特點2STM32嵌入式開發(fā)基礎(chǔ)知識3實踐項目1——點亮LED燈4實踐項目2——按鍵檢測5實踐項目3——LCD12864顯示6實踐項目4——中斷按鍵7實踐項目5——SysTick實現(xiàn)精確延時8階段項目——狀態(tài)機編程實現(xiàn)按鍵長按短按操作9實踐項目6——USART實現(xiàn)計算機控制LED燈10實踐項目7——ADC數(shù)據(jù)采集11實踐項目8——利用DMA實現(xiàn)多路ADC數(shù)據(jù)采集12實踐項目9——TIM定時器的PWM控制LED亮度13實踐項目10——LCD彩屏顯示模擬時鐘14實踐項目11——μC/OS-III操作系統(tǒng)15綜合項目——溫濕度測量儀設(shè)計16第2章STM32嵌入式C語言編程特點第2章STM32嵌入式C語言編程特點學習目標 掌握宏指令的使用。 掌握STM32嵌入式C語言編程的常用關(guān)鍵字的使用。 掌握結(jié)構(gòu)體和枚舉類型的定義,理解數(shù)據(jù)類型的含義,了解枚舉類型和結(jié)構(gòu)體指針定義和作用。 掌握C語言編程的常用的代碼風格。第2章STM32嵌入式C語言編程特點任務(wù)描述通過學習STM32嵌入式C語言編程特點,掌握嵌入式編程過程中常使用的關(guān)鍵詞的含義,為后續(xù)章節(jié)學習以及標準庫編程學習掃清障礙。理解數(shù)據(jù)類型的含義,學會宏指令、結(jié)構(gòu)體、枚舉在編程中的應(yīng)用。第2章STM32嵌入式C語言編程特點2.1宏指令的使用及其意義2.2STM32嵌入式C語言編程中幾個重要的關(guān)鍵字2.3STM32嵌入式C語言編程的基本數(shù)據(jù)類型2.4結(jié)構(gòu)體與指針2.5枚舉2.6C語言編程的代碼格式2.1宏指令的使用及其意義現(xiàn)在多數(shù)微控制器編程都支持C語言,正確使用C語言里的宏指令可以提高代碼的移植性,可讀性,便捷性,也可以使程序結(jié)構(gòu)更加合理,提高程序的可讀性。2.1宏指令的使用及其意義源程序編譯預(yù)處理編譯目標文件2.1宏指令的使用及其意義宏指令是以#號開頭的代碼行,#號必須是該行除了任何空白字符外的第一個字符。#后是指令關(guān)鍵字,在關(guān)鍵字和#號之間允許存在任意個數(shù)的空白字符,整行語句構(gòu)成了一條預(yù)處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉(zhuǎn)換。2.1宏指令的使用及其意義2.1宏指令的使用及其意義(1)#include命令#include命令叫文件包含命令。編譯器發(fā)現(xiàn)#include命令后,就會尋找指令后面的文件名,并把這個文件的內(nèi)容包含到當前文件中。被包含的文件中的文本將替換源代碼文件中的#include命令,就像把被包含文件中的全部內(nèi)容拷貝到源文件中的#include命令所在的位置一樣。#include命令有兩種格式:#include"文件名"#include<文件名>2.1宏指令的使用及其意義2.1宏指令的使用及其意義(2)#define命令C語言中允許用一個標識符來表示一個字符串,稱為宏定義。宏定義的格式如下:#define標識符(宏名)字符串被定義為“宏”的標識符稱為“宏名”。在編譯預(yù)處理時,對代碼中出現(xiàn)的所有“宏名”,都會用宏定義的字符串去代替,稱之為“宏代換”或“宏展開”。2.1宏指令的使用及其意義2.1宏指令的使用及其意義在嵌入式C語言中,宏定義除了用于常量和變量外,還經(jīng)常用于函數(shù),即用明確的單詞來表示一個特定的動作。例如,下面的兩個宏定義:#defineD3_G_ONGPIO_ResetBits(GPIOB,GPIO_Pin_0)#defineD3_G_OFFGPIO_SetBits(GPIOB,GPIO_Pin_0)2.1宏指令的使用及其意義(3)#ifndef和#endif命令所有的標準外設(shè)庫的外設(shè)驅(qū)動的頭文件中都使用#include包含了“stm32f10x.h”文件,如果編程時用到了多個外設(shè)庫,那么必須將對應(yīng)的外設(shè)庫頭文件都包含進源程序中。但是C語言編譯器是不允許重復(fù)包含同一文件的,為了避免這種情況,在每個外設(shè)驅(qū)動頭文件的開始位置都會添加宏指令#ifndef和#define,在結(jié)束位置處加宏指令#endif。2.1宏指令的使用及其意義注意:為了避免重復(fù)包含,建議在所有頭文件中都采用這種頭文件結(jié)構(gòu)。2.1宏指令的使用及其意義(4)#if…#else…#endif命令這也是一種條件編譯語句。有些程序在調(diào)試、兼容性、平臺移植等情況下可能想要通過簡單地設(shè)置一些參數(shù)就生成一個不同的軟件,這當然可以通過變量設(shè)置,把所有可能用到的代碼都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分代碼,就沒必要把所有的代碼都寫進去,就可以用條件編譯,通過預(yù)編譯指令設(shè)置編譯條件,在不同的需要時編譯不同的代碼。2.1宏指令的使用及其意義2.2STM32嵌入式C語言編程中幾個重要的關(guān)鍵字(1)typedef關(guān)鍵字typedef的作用是為一種已知數(shù)據(jù)類型定義別名,這里的數(shù)據(jù)類型包括系統(tǒng)內(nèi)部的數(shù)據(jù)類型(如int、char)和用戶自定義數(shù)據(jù)類型。在編程中,使用typedef的目的主要有兩個,一個是為已知數(shù)據(jù)類型取一個方便記憶且意義明確的新名稱,一個是簡化一些復(fù)雜的類型聲明。2.2STM32嵌入式C語言編程中幾個重要的關(guān)鍵字2.2STM32嵌入式C語言編程中幾個重要的關(guān)鍵字如代碼清單2-5,第3至第12行,實際上有兩個功能,首先定義一個名為structGPIO_Type結(jié)構(gòu)體,然后用typedef定義結(jié)構(gòu)體類型GPIO_TypeDef。定義該結(jié)構(gòu)體變量的操作如下:structGPIO_TypeGPIOa;GPIO_TypeDef
GPIOa;這里,GPIO_TypeDef相當于structGPIO_Type,兩者的作用相同,都是定義了結(jié)構(gòu)體變量GPIOa。2.2STM32嵌入式C語言編程中幾個重要的關(guān)鍵字(2)volatile關(guān)鍵字volatile也稱為易失性,它會影響到編譯器的編譯結(jié)果,其作用是通知編譯器被volatile修飾的變量是隨時可能發(fā)生變化的。與volatile變量有關(guān)的運算不要進行優(yōu)化以免出錯。關(guān)鍵字volatile修飾的變量包括指向硬件寄存器(如狀態(tài)寄存器)的變量、可能會被中斷服務(wù)子程序改寫的變量、多線程應(yīng)用中被幾個任務(wù)共享的變量等。2.2STM32嵌入式C語言編程中幾個重要的關(guān)鍵字(3)const在定義變量的時候,如果加上關(guān)鍵字const,則變量值在程序運行期間不能改變,當然也不能再賦值了。這種變量稱為常變量(constantvariable)或只讀變量(readonlyvariable)。const和變量類型可以互換位置,二者是等價的。編譯器在遇到const關(guān)鍵字時,一般會將其修飾的常變量放置于程序存儲器中。2.3STM32嵌入式C語言編程的基本數(shù)據(jù)類型什么是數(shù)據(jù)類型?2.3STM32嵌入式C語言編程的基本數(shù)據(jù)類型基本數(shù)據(jù)類型包括兩方面的定義一是Keil-MDK-ARMC語言編譯器的數(shù)據(jù)類型二是STM32標準外設(shè)庫規(guī)定的數(shù)據(jù)類型。2.3STM32嵌入式C語言編程的基本數(shù)據(jù)類型2.3STM32嵌入式C語言編程的基本數(shù)據(jù)類型2.4結(jié)構(gòu)體與指針結(jié)構(gòu)體是一個可以包含不同數(shù)據(jù)類型成員的集合體,它是一種可以自己定義的數(shù)據(jù)類型。定義結(jié)構(gòu)體時應(yīng)力爭使結(jié)構(gòu)體只代表一種現(xiàn)實事物的抽象,而不應(yīng)同時代表多種。結(jié)構(gòu)體中的各成員應(yīng)代表同一事物的不同側(cè)面,而不應(yīng)把描述沒有關(guān)系或關(guān)系很弱的不同事物的成員放到同一結(jié)構(gòu)體中。2.4結(jié)構(gòu)體與指針相同結(jié)構(gòu)體類型的結(jié)構(gòu)體變量之間是可以相互賦值的,結(jié)構(gòu)體變量可以作為函數(shù)的參數(shù),也可以作為函數(shù)的返回值。結(jié)構(gòu)體指針是一個結(jié)構(gòu)體變量在內(nèi)存中的地址,使用指針而不是直接使用變量,往往會帶來數(shù)據(jù)傳遞效率上的提升和靈活。2.4結(jié)構(gòu)體與指針2.4結(jié)構(gòu)體與指針將一個結(jié)構(gòu)體變量作為函數(shù)的參數(shù)有兩種方法:第一種是將結(jié)構(gòu)體變量直接作為函數(shù)參數(shù),程序直觀易懂,但效率不是太高;第二種是將指向結(jié)構(gòu)體變量的指針作為函數(shù)參數(shù),這種方法開銷較小,效率較高。在STM32標準外設(shè)庫中就是采用第二種方法,例如:voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)2.4結(jié)構(gòu)體與指針這里的GPIO_InitStruct是結(jié)構(gòu)體指針,而前面提到的GPIO_InitStructure是結(jié)構(gòu)體變量,在對結(jié)構(gòu)體成員操作時,要注意符號“->”和“.”的不同。例如,對結(jié)構(gòu)體指針GPIO_InitStruct中的成員賦值時,要寫成:GPIO_InitStruct->GPIO_MODE=GPIO_Mode_Out_PP;2.5枚舉2.5枚舉枚舉類型其實是整型常量的列表,在枚舉定義時,可以分別為每個元素指定常量值(必須不同),也可以指定部分元素,在編譯器編譯程序時,會給枚舉類型的每個元素一個整型常量值。沒有指定的元素的值在前一個成員值的基礎(chǔ)上加一。例如,代碼清單2-10中,第一個枚舉元素的值指定為整型的1,后續(xù)枚舉元素的值在前一個元素的值基礎(chǔ)上加1,也可以人為設(shè)定枚舉成員的值,后續(xù)枚舉成員的值仍然是遞加的關(guān)系。如果所有元素都沒有指定值,則整型常量值從0開始依次遞增1。2.5枚舉2.6C語言編程的代碼格式“具有良好的編程風格和編程習慣”是很多企業(yè)在招聘軟件工程師時很看重的一個要求,代碼的清晰、簡潔以及風格的統(tǒng)一可以使代碼易于實現(xiàn)、方便維護并保證團隊合作的順暢。C語言是一個書寫格式比較隨意的編程語言,但是隨意不等于隨便,在業(yè)界和很多企業(yè)內(nèi)部對C語言編程是有著比較嚴格的約定或者規(guī)范的。2.6C語言編程的代碼格式C語言編程的代碼格式和命名規(guī)范(1)程序塊要采用縮進風格,縮進的空格數(shù)為4個。函數(shù)或過程的開始、結(jié)構(gòu)的定義及循環(huán)、判斷等語句中的代碼都要采用縮進風格,case語句下的處理語句也要遵循語句縮進要求。(2)相對獨立的程序塊之間、變量說明之后必須加空行。2.6C語言編程的代碼格式C語言編程的代碼格式和命名規(guī)范(3)一行程序以小于80個字符為宜,不要寫得過長。較長的語句(大于80個字符)要分成多行書寫;長表達式要在低優(yōu)先級操作符處劃分斷行,操作符放在新行之首,劃分出的新行進行適當?shù)目s進,使排版整齊、語句可讀。(4)不允許把多個短語句寫在一行中,即一行只寫一個語句。這樣的代碼容易閱讀,并且便于寫注釋。2.6C語言編程的代碼格式C語言編程的代碼格式和命名規(guī)范(5)if、for、do、while、case、switch、default等關(guān)鍵字自占一行,且if、for、do、while等語句的執(zhí)行語句部分無論多少行都要加大括號{}。(6)程序塊的分界符(大括號“{”和“}”)應(yīng)獨占一行且位于同一列,同時與引用它們的語句左對齊。2.6C語言編程的代碼格式C語言編程的代碼格式和命名規(guī)范(7)變量和函數(shù)的命名要清晰明了,有明確的含義,盡量使用完整的單詞和短語,單詞和短語最好“見名知意”。如果命名中包含多個單詞,可以在單詞間采用下劃線連接,但下劃線的數(shù)量不宜超過兩個。(8)對于變量命名,禁止用單個字符(如i、j、k等),建議除了要有具體含義外,還要表明其變量類型、數(shù)據(jù)類型,但i、j、k作局部變量是允許的。2.6C語言編程的代碼格式C語言編程的代碼格式和命名規(guī)范(9)變量的命名建議使用全小寫字母,函數(shù)的命名建議關(guān)鍵字的首字母使用大寫字母,宏定義的命名則全大寫字母。(10)注意運算符的優(yōu)先級,建議使用擴號來明確表達式的操作順序,避免使用默認的優(yōu)先級,以防止因默認的優(yōu)先級與設(shè)計思想不符而導致程序出錯。2.6C語言編程的代碼格式C語言編程的代碼格式和命名規(guī)范(11)C語言中一行注釋一般采用//…,多行注釋必須采用/*…*/。注釋通常用于重要的代碼行或段落提示。在一般情況下,源程序有效注釋量必須在20%以上。雖然注釋有助于理解代碼,但注意不可過多地使用注釋。第2章STM32嵌入式C語言編程特點小結(jié) 掌握宏指令的使用。掌握STM32嵌入式C語言編程的常用關(guān)鍵字的使用。掌握結(jié)構(gòu)體和枚舉類型的定義,理解數(shù)據(jù)類型的含義,了解枚舉類型和結(jié)構(gòu)體指針定義和作用。掌握C語言編程的常用的代碼風格。謝謝!《嵌入式技術(shù)及應(yīng)用》“教學做一體化”課程學習內(nèi)容嵌入式系統(tǒng)概述1STM32嵌入式C語言編程特點2STM32嵌入式開發(fā)基礎(chǔ)知識3實踐項目1——點亮LED燈4實踐項目2——按鍵檢測5實踐項目3——LCD12864顯示6實踐項目4——中斷按鍵7實踐項目5——SysTick實現(xiàn)精確延時8階段項目——狀態(tài)機編程實現(xiàn)按鍵長按短按操作9實踐項目6——USART實現(xiàn)計算機控制LED燈10實踐項目7——ADC數(shù)據(jù)采集11實踐項目8——利用DMA實現(xiàn)多路ADC數(shù)據(jù)采集12實踐項目9——TIM定時器的PWM控制LED亮度13實踐項目10——LCD彩屏顯示模擬時鐘14實踐項目11——μC/OS-III操作系統(tǒng)15綜合項目——溫濕度測量儀設(shè)計16第3章
STM32嵌入式開發(fā)基礎(chǔ)知識第3章STM32嵌入式開發(fā)基礎(chǔ)知識學習目標 了解STM32標準庫的結(jié)構(gòu)體系和命名規(guī)則。 了解本書開發(fā)板板載資源分布。 掌握keilMDK-ARM安裝以及工程創(chuàng)建的步驟方法。 掌握基本調(diào)試器的設(shè)置,程序的下載。第3章STM32嵌入式開發(fā)基礎(chǔ)知識任務(wù)描述學習CMSIS標準軟件接口以及STM32標準外設(shè)庫的基礎(chǔ)知識,學會在MDK集成開發(fā)環(huán)境下新建工程模板,編譯并下載到配套的硬件開發(fā)平臺運行。第3章STM32嵌入式開發(fā)基礎(chǔ)知識3.1CMSIS與STM32標準外設(shè)庫3.2STM32嵌入式開發(fā)目標板簡介3.3仿真器3.4軟件集成開發(fā)環(huán)境3.5新建工程模板3.1.1ARMCortex微控制器軟件接口標準CMSISCMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)標準,即“ARMCore微控制器軟件接口標準”。解決各個廠商片上外設(shè)差異,導致程序軟件在相同內(nèi)核、不同廠商的微處理器芯片間移植困難的問題。3.1.1ARMCortex微控制器軟件接口標準CMSISCMSIS標準是Cortex-M系列處理器與供應(yīng)商無關(guān)的硬件抽象層,使用CMSIS可以為處理器和外設(shè)實現(xiàn)一致且簡單的軟件接口,從而簡化軟件的重用和移植、縮短微控制器開發(fā)人員的學習過程、縮短產(chǎn)品和工程的研發(fā)時間。3.1.1ARMCortex微控制器軟件接口標準CMSISCMSIS可以分為多個軟件層次,分別由ARM公司和芯片廠商提供3.1.1ARMCortex微控制器軟件接口標準CMSISCMSIS的內(nèi)核外設(shè)函數(shù)包括用于訪問內(nèi)核寄存器以及內(nèi)核外設(shè)寄存器的名稱、地址定義,主要由ARM公司提供。外設(shè)寄存器和中斷向量定義層則提供了核外外設(shè)的地址和中斷定義,主要由芯片廠商提供。3.1.1ARMCortex微控制器軟件接口標準CMSISST官方庫(STM32固件庫)就是根據(jù)這套標準設(shè)計的,CMSIS共分3個基本功能層。(1)核內(nèi)外設(shè)訪問層:ARM公司提供的訪問,定義處理器內(nèi)部寄存器地址以及功能函數(shù)。(2)中間件訪問層:定義訪問中間件通用的API,由ARM公司提供。(3)外設(shè)訪問層:定義硬件寄存器的地址以及外設(shè)的訪問函數(shù)。3.1.1ARMCortex微控制器軟件接口標準CMSISCMSIS向下負責與內(nèi)核和各個外設(shè)直接打交道,向上負責提供實時操作系統(tǒng)用戶程序調(diào)用的函數(shù)接口。另外,CMSIS還對各個外設(shè)驅(qū)動文件的文件名字規(guī)范化、函數(shù)名字規(guī)范化等做了一系列規(guī)定。3.1.1ARMCortex微控制器軟件接口標準CMSISCMSIS位于微控制器外設(shè)和用戶應(yīng)用程序之間,為用戶提供與具體芯片廠商無關(guān)的統(tǒng)一的硬件驅(qū)動接口,通過對用戶屏蔽具體硬件之間的差異,方便軟件的移植。3.1.2STM32的標準外設(shè)庫為什么要用標準外設(shè)庫?3.1.2STM32的標準外設(shè)庫STM32標準外設(shè)庫也稱固件函數(shù)庫或簡稱固件庫,是一個固件函數(shù)包,它由程序、數(shù)據(jù)結(jié)構(gòu)和宏組成,包括了微控制器所有外設(shè)的性能特征。該函數(shù)庫還包括每一個外設(shè)的驅(qū)動描述和應(yīng)用實例,為開發(fā)者訪問底層硬件提供了一個中間API,通過使用固件函數(shù)庫,無需深入掌握底層硬件細節(jié),就可以輕松應(yīng)用每一個外設(shè)。3.1.2STM32的標準外設(shè)庫3.1.2STM32的標準外設(shè)庫ST公司提供的STM32F10x標準外設(shè)庫文檔組織結(jié)構(gòu)3.1.2STM32的標準外設(shè)庫3.1.2STM32的標準外設(shè)庫一般來說,標準外設(shè)庫Libraries文件夾中的文件是不能修改的,對于標準外設(shè)庫中資源的調(diào)配和參數(shù)設(shè)置,應(yīng)該在表3-1中STM32F10x_StdPeriph_Template文件夾中所列出的文件中完成,簡要介紹如下。(1)main.c文件:推薦在此文件中定義main()函數(shù),當然也可以添加其他應(yīng)用代碼。3.1.2STM32的標準外設(shè)庫(2)stm32f10x_conf.h文件:該文件使用#include宏命令包含了所有外設(shè)的頭文件,用戶按需注釋或取消注釋,即可完成所需要的外設(shè)頭文件的配置。需要注意的是,項目使用的外設(shè)驅(qū)動庫頭文件必須被包含,項目未使用的驅(qū)動頭文件也可以被包含,并不影響最后的編譯和運行結(jié)果,只是會占用較長的編譯時間而已。3.1.2STM32的標準外設(shè)庫(3)stm32f10x_it.c和stm32f10x_it.h文件:推薦在該文件中編寫中斷服務(wù)函數(shù),文件中已經(jīng)定義了系統(tǒng)異常中斷服務(wù)函數(shù)的框架,內(nèi)容為空,其他外設(shè)的中斷服務(wù)函數(shù)需要用戶自己添加。需要注意的是,在STM32標準外設(shè)庫中中斷服務(wù)函數(shù)的名稱(接口)已經(jīng)規(guī)定好了,可以在相應(yīng)的啟動文件中找到。如果用戶弄錯了中斷服務(wù)函數(shù)的名稱,編譯器不會報錯,只影響運行結(jié)果。需要說明的是,在實際編程時,中斷服務(wù)函數(shù)也可以放在其他的文件中,并不是強制要求放在stm32f10x_it.c文件中。3.1.2STM32的標準外設(shè)庫(4)system_stm32f10x.c文件:該文件中定義了芯片初始化函數(shù)SystemInit()函數(shù),用來配置系統(tǒng)的時鐘頻率,包括時鐘源、確定PLL電路的倍頻系數(shù)等。注意該文件的原始位置是在CMSIS內(nèi)核文件夾里面,我們編程時應(yīng)該盡量避免對STM32標準庫文件夾中文件的任何形式的修改,所以很多時候會將修改了默認主頻后的此文件存放在用戶應(yīng)用代碼文件夾中。3.1.3STM32的標準外設(shè)庫的命名規(guī)則標準外設(shè)庫中包含了眾多的變量定義和功能函數(shù),掌握他們的命名規(guī)范和使用規(guī)律,可以更加靈活地使用標準外設(shè)庫,也將極大增強程序的規(guī)范性和易讀性,同時,標準外設(shè)庫的命名規(guī)范也值得我們在開發(fā)編程時借鑒。3.1.3STM32的標準外設(shè)庫的命名規(guī)則1.縮寫定義3.1.3STM32的標準外設(shè)庫的命名規(guī)則2.命名規(guī)則(1)PPP表示任意外設(shè)縮寫,全部大寫,例如:ADC。(2)源程序文件和頭文件命名都以“stm32f10x_”開頭。(3)常量僅被應(yīng)用于一個文件的,定義于該文件中;被應(yīng)用于多個文件的,在對應(yīng)頭文件中定義。所有常量都用大寫字母表示。(4)寄存器作為常量處理。他們的名稱都用大寫英文字母表示。在大多數(shù)情況下,他們與縮寫規(guī)范一致。3.1.3STM32的標準外設(shè)庫的命名規(guī)則2.命名規(guī)則(5)外設(shè)函數(shù)的命名以該外設(shè)的縮寫加下劃線開頭??s寫全部大寫,每個單詞的第一個字母大寫,該單詞其余字母小寫,例如:SPI_SendData。在函數(shù)名中,只允許存在一個下劃線,用以分隔外設(shè)縮寫和函數(shù)名的其它部分,下劃線后通常代表函數(shù)的功能,不同外設(shè)的驅(qū)動函數(shù)名稱只要下劃線后面的部分相同,函數(shù)功能基本相同。部分函數(shù)命名如表3-2所示。3.1.3STM32的標準外設(shè)庫的命名規(guī)則3.2STM32嵌入式開發(fā)目標板簡介3.3仿真器仿真器是STM32開發(fā)的必備硬件之一,其作用是連接計算機(開發(fā)工具)和開發(fā)平臺(開發(fā)對象),將在計算機上編譯完成的程序代碼下載到目標板,并且可以實現(xiàn)在計算機上實時硬件調(diào)試,硬件連接關(guān)系如圖3-6所示。3.3.1仿真器分類對于使用Cortex-M內(nèi)核的微控制器而言,目前常用的仿真器有以下幾種。(1)J-LINK仿真器(2)ST-LINK等專用仿真器(3)ULink仿真器(4)CMSIS-DAP仿真器3.3.2JTAG和SWD接口(1)JTAG接口(2)SWD接口3.4軟件集成開發(fā)環(huán)境關(guān)于MDK的安裝,需要注意以下幾點:(1)安裝路徑不能帶中文,必須是英文路徑,否則在使用過程中可能會出現(xiàn)莫名其妙的問題。(2)安裝目錄盡量不同51的KEIL或者KEIL4沖突,三者目錄分開。(3)KEIL5的安裝比起KEIL4多了一個步驟,必須添加器件支持包(MCU庫),不然沒法使用。3.5新建工程模板3.5.1新建本地文件夾3.5.2在MDK中新建項目3.5.3MDK工程項目配置3.5.4編譯和下載程序3.5.1新建本地文件夾3.5.2在MDK中新建項目3.5.3MDK工程項目配置1.在工程中添加組文件夾對文件進行管理3.5.3MDK工程項目配置2.配置工程選項3.5.3MDK工程項目配置2.配置工程選項3.5.4編譯和下載程序1.使用仿真器下載程序(1)硬件連接3.5.4編譯和下載程序1.使用仿真器下載程序(2)仿真器配置3.5.4編譯和下載程序1.使用仿真器下載程序(3)選擇目標板3.5.4編譯和下載程序1.使用仿真器下載程序(4)下載程序3.5.4編譯和下載程序2.使用串口下載程序(1)安裝USB轉(zhuǎn)串口驅(qū)動在電腦中安裝USB轉(zhuǎn)串口驅(qū)動—CH340版本。如果USB轉(zhuǎn)串口驅(qū)動安裝成功,USB線跟板子連接沒有問題,在計算機->管理->設(shè)備管理器->端口中可識別到串口。3.5.4編譯和下載程序2.使用串口下載程序(2)硬件連接3.5.4編譯和下載程序2.使用串口下載程序(3)開始下載第3章STM32嵌入式開發(fā)基礎(chǔ)知識小結(jié) 了解STM32標準庫的結(jié)構(gòu)體系和命名規(guī)則。了解本書開發(fā)板板載資源分布。掌握keilMDK-ARM安裝以及工程創(chuàng)建的步驟方法。 掌握基本調(diào)試器的設(shè)置,程序的下載。謝謝!《嵌入式技術(shù)及應(yīng)用》“教學做一體化”課程學習內(nèi)容嵌入式系統(tǒng)概述1STM32嵌入式C語言編程特點2STM32嵌入式開發(fā)基礎(chǔ)知識3實踐項目1——點亮LED燈4實踐項目2——按鍵檢測5實踐項目3——LCD12864顯示6實踐項目4——中斷按鍵7實踐項目5——SysTick實現(xiàn)精確延時8階段項目——狀態(tài)機編程實現(xiàn)按鍵長按短按操作9實踐項目6——USART實現(xiàn)計算機控制LED燈10實踐項目7——ADC數(shù)據(jù)采集11實踐項目8——利用DMA實現(xiàn)多路ADC數(shù)據(jù)采集12實踐項目9——TIM定時器的PWM控制LED亮度13實踐項目10——LCD彩屏顯示模擬時鐘14實踐項目11——μC/OS-III操作系統(tǒng)15綜合項目——溫濕度測量儀設(shè)計16第4章實踐項目1——點亮LED燈微信E-mail:XS_CHEN@126.com第4章項目實踐1——點亮LED燈學習目標了解STM32芯片的架構(gòu),掌握STM32芯片內(nèi)部部件。掌握存儲器映射的基本概念,了解存儲器區(qū)域功能劃分。掌握寄存器及寄存器映射的概念,了解總線基地址,外設(shè)基地址,外設(shè)寄存器等概念,學會看懂C語言對寄存器的封裝過程。了解GPIO外設(shè)的功能。掌握GPIO外設(shè)初始結(jié)構(gòu)體,會模仿利用庫函數(shù)初始化結(jié)構(gòu)體。第4章項目實踐1——點亮LED燈任務(wù)描述點亮LED燈是學習嵌入式編程的第一個項目,本項目通過GPIO端口控制LED燈亮滅,學習嵌入式編程的基本思路,學會GPIO的初始化方法。第4章項目實踐1——點亮LED燈4.1相關(guān)知識4.2項目實施4.3拓展項目1——LED流水燈4.1相關(guān)知識4.1.1STM32芯片架構(gòu)4.1.2存儲器映射4.1.3寄存器映射4.1.4GPIO簡介4.1.1STM32芯片架構(gòu)芯片(這里指內(nèi)核,或者叫CPU)和外設(shè)之間通過各種總線連接,其中驅(qū)動單元有4個,被動單元也有4個,如圖4-2所示。為了方便理解,我們都可以把驅(qū)動單元理解成是CPU部分,被動單元都理解成外設(shè)。4.1.1STM32芯片架構(gòu)4.1.2存儲器映射1.存儲器映射2.存儲器區(qū)域功能劃分在這4GB的地址空間中,ARM已經(jīng)粗線條的平均分成了8個塊(Block),每塊512MB,并且規(guī)定了它們的用途在這8個Block里面,有3個塊非常重要,也是我們最關(guān)心的。即Block0用來設(shè)計成內(nèi)部FLASH,Block1用來設(shè)計成內(nèi)部RAM,Block2用來設(shè)計成片上的外設(shè),這三個Block里面的具體區(qū)域的功能劃分如表4-2所示。4.1.2存儲器映射1.存儲器映射2.存儲器區(qū)域功能劃分在這4GB的地址空間中,ARM已經(jīng)粗線條的平均分成了8個塊(Block),每塊512MB,并且規(guī)定了它們的用途在這8個Block里面,有3個塊非常重要,也是我們最關(guān)心的。即Block0用來設(shè)計成內(nèi)部FLASH,Block1用來設(shè)計成內(nèi)部RAM,Block2用來設(shè)計成片上的外設(shè),這三個Block里面的具體區(qū)域的功能劃分如表4-2所示。4.1.3寄存器映射1.什么是寄存器及寄存器映射在存儲器Block2這塊區(qū)域,設(shè)計的是片上外設(shè),它們以四個字節(jié)為一個單元,共32bit,每一個單元對應(yīng)不同的功能,當我們控制這些單元時就可以驅(qū)動外設(shè)工作。我們可以找到每個單元的起始地址,然后通過C語言指針的操作方式來訪問這些單元,如果每次都是通過這種地址的方式來訪問,不僅不好記憶還容易出錯,這時我們可以根據(jù)每個單元功能的不同,以功能為名給這個內(nèi)存單元取一個別名,這個別名就是我們經(jīng)常說的寄存器,這個給已經(jīng)分配好地址的有特定功能的內(nèi)存單元取別名的過程就叫寄存器映射。4.1.3寄存器映射1.什么是寄存器及寄存器映射比如,我們找到GPIOB端口的輸出數(shù)據(jù)寄存器ODR的地址是0x40010C0C(至于這個地址如何找到可以先跳過),ODR寄存器是32bit,低16bit有效,對應(yīng)著16個外部IO,寫0/1對應(yīng)的的IO則輸出低/高電平?,F(xiàn)在我們通過C語言指針的操作方式,讓GPIOB的16個IO都輸出高電平,語句如下:*(unsignedint*)(0x40010C0C)=0xFFFF;0x40010C0C在我們看來是GPIOB端口ODR的地址,但是在編譯器看來,這只是一個普通的變量,是一個立即數(shù),要想讓編譯器也認為是指針,我們得進行強制類型轉(zhuǎn)換,把它轉(zhuǎn)換成指針,即(unsignedint*)0x40010C0C,然后再對這個指針進行取內(nèi)容(*)操作。這種通過絕對地址訪問內(nèi)存單元不好記憶且容易出錯,我們可以通過寄存器的方式來操作,具體如下:#defineGPIOB_ODR(unsignedint*)(GPIOB_BASE+0x0C)*GPIOB_ODR=0xFF;為了方便操作,我們干脆把指針操作“*”也定義到寄存器別名里面,具體如下:#defineGPIOB_ODR*(unsignedint*)(GPIOB_BASE+0x0C)GPIOB_ODR=0xFF;4.1.3寄存器映射2.總線基地址片上外設(shè)區(qū)分為三條總線,根據(jù)外設(shè)速度的不同,掛載在不同的總線上,APB1掛載低速外設(shè),APB2和AHB掛載高速外設(shè)。相應(yīng)總線的最低地址稱為該總線基地址,總線基地址也是掛載在該總線上的首個外設(shè)的地址。其中APB1總線的地址最低,片上外設(shè)從這里開始,也叫外設(shè)基地址。STM32F10xx總線基地址如表4-3所示。4.1.3寄存器映射3.外設(shè)基地址總線上掛載著各種外設(shè),這些外設(shè)也有自己的地址范圍,特定外設(shè)的首個地址稱為“XX外設(shè)基地址”,也叫XX外設(shè)的邊界地址。具體有關(guān)STM32F10xx外設(shè)的邊界地址請參考《STM32F10xx參考手冊》相應(yīng)章節(jié)。這里面我們以GPIO這個外設(shè)為例來講解外設(shè)基地址,GPIO屬于高速外設(shè),掛載在APB2總線上,外設(shè)基地址如表4-4所示。4.1.3寄存器映射4.外設(shè)寄存器在外設(shè)的地址范圍內(nèi),分布著的就是該外設(shè)的寄存器。以GPIO外設(shè)為例,GPIO外設(shè)有很多個寄存器,每一個都有特定的功能。每個寄存器為32bit,占4個字節(jié),在該外設(shè)的基地址上按照順序排列,寄存器的位置都以相對該外設(shè)基地址的偏移地址來描述。下面以GPIOB端口為例來說明,如表4-5所示。4.1.3寄存器映射5.C語言對寄存器的封裝以上所有的關(guān)于存儲器映射的內(nèi)容,最終都是為大家更好地理解如何用C語言控制讀寫外設(shè)寄存器做準備。(1)封裝總線和外設(shè)基地址在編程時為了方便理解和記憶,我們把總線基地址和外設(shè)基地址定義成相應(yīng)的宏,總線或者外設(shè)都以他們的名字作為宏名,例如代碼清單4-1所示。4.1.3寄存器映射5.C語言對寄存器的封裝以上所有的關(guān)于存儲器映射的內(nèi)容,最終都是為大家更好地理解如何用C語言控制讀寫外設(shè)寄存器做準備。(2)封裝寄存器我們引入C語言中的結(jié)構(gòu)體語法對寄存器進行封裝,GPIO外設(shè)的寄存器列表封裝具體代碼如代碼清單4-2所示。4.1.3寄存器映射4.1.4GPIO簡介GPIO是通用輸入輸出(GeneralPurposeInput&Output)端口的簡稱,是STM32可控制的引腳,是微控制器中最簡單也是最常用的片上外設(shè),由于資源限制,其他片上外設(shè)往往要與GPIO復(fù)用芯片的引腳。STM32芯片的GPIO引腳與外部設(shè)備連接,從而實現(xiàn)與外部通訊、控制以及數(shù)據(jù)采集的功能。STM32F103微控制器的GPIO資源豐富,根據(jù)芯片封裝不同,最多擁有GPIOA、GPIOB、GPIOC、…、GPIOG共7組GPIO端口,每組GPIO端口最多擁有Pin0~Pin15共16個引腳。根據(jù)連接對象的不同,GPIO端口的每一個引腳都可以獨立設(shè)置成不同的工作模式4.1.4GPIO簡介所有的GPIO引腳都有基本的輸入輸出功能。最基本的輸出功能是由STM32控制引腳輸出高、低電平,實現(xiàn)開關(guān)控制,如把GPIO引腳接入到LED燈,那就可以控制LED燈的亮滅,引腳接入到繼電器或三極管,那就可以通過繼電器或三極管控制外部大功率電路的通斷。最基本的輸入功能是檢測外部輸入電平,如把GPIO引腳連接到按鍵,通過電平高低區(qū)分按鍵是否被按下。4.2項目實施硬件電路實現(xiàn)4.2項目實施
程序設(shè)計思路(1)編程要點①使能GPIO端口時鐘;②初始化GPIO目標引腳為推挽輸出模式;③編寫測試程序,控制GPIO引腳輸出低電平,點亮LED。4.2項目實施
程序設(shè)計思路(2)程序流程圖第4章項目實踐1——點亮LED燈程序下載驗證實驗現(xiàn)象演示拓展項目1要求在本章RGB燈初始化程序的基礎(chǔ)上,配合延時函數(shù),實現(xiàn)如下功能:(1)上電三色燈中的紅燈(D3_R)閃爍3次后進入(2);(2)三色燈按照紅(D3_R)綠(D3_G)藍(D3_B)的順序循環(huán)閃爍的流水燈;(3)讓開發(fā)板上的LED1(PF7),LED2(PF8)加入到流水燈中。拓展項目1硬件電路拓展項目1硬件電路程序下載驗證實驗現(xiàn)象演示謝謝!微信E-mail:XS_CHEN@126.com《嵌入式技術(shù)及應(yīng)用》“教學做一體化”課程學習內(nèi)容嵌入式系統(tǒng)概述1STM32嵌入式C語言編程特點2STM32嵌入式開發(fā)基礎(chǔ)知識3實踐項目1——點亮LED燈4實踐項目2——按鍵檢測5實踐項目3——LCD12864顯示6實踐項目4——中斷按鍵7實踐項目5——SysTick實現(xiàn)精確延時8階段項目——狀態(tài)機編程實現(xiàn)按鍵長按短按操作9實踐項目6——USART實現(xiàn)計算機控制LED燈10實踐項目7——ADC數(shù)據(jù)采集11實踐項目8——利用DMA實現(xiàn)多路ADC數(shù)據(jù)采集12實踐項目9——TIM定時器的PWM控制LED亮度13實踐項目10——LCD彩屏顯示模擬時鐘14實踐項目11——μC/OS-III操作系統(tǒng)15綜合項目——溫濕度測量儀設(shè)計16第5章實踐項目2——按鍵檢測第5章項目實踐2——按鍵檢測學習目標掌握STM32芯片的GPIO外設(shè)的基本結(jié)構(gòu),理解輸入與輸出結(jié)構(gòu)的基本組成。掌握GPIO的工作模式,了解不同模式的典型應(yīng)用場合。掌握GPIO初始化的過程,學會編寫具體對象的GPIO引腳的初始化代碼。了解常用GIO標準外設(shè)庫的常用函數(shù)的功能。掌握項目代碼中所調(diào)用的GPIO標準庫函數(shù)的用法。了解RCC外設(shè)的時鐘控制部分,學會使用相關(guān)庫函數(shù)控制外設(shè)的時鐘。理解時鐘路徑的配置過程。第5章項目實踐2——按鍵檢測任務(wù)描述本項目通過檢測GPIO端口的輸入電平,判斷按鍵按下與否。并實現(xiàn)不同按鍵控制不同的功能。本項目中主要實現(xiàn)控制LED燈亮滅,流水燈流水與否以及其流水速度。第5章項目實踐2——按鍵檢測5.1相關(guān)知識5.2項目實施5.3拓展項目2——按鍵控制LED流水燈5.1相關(guān)知識5.1.1GPIO的基本結(jié)構(gòu)5.1.2GPIO的工作模式5.1.3GPIO的初始化及標準外設(shè)庫函數(shù)5.1.4STM32F10x微控制器的系統(tǒng)時鐘5.1.1GPIO的基本結(jié)構(gòu)STM32F103微控制器的GPIO端口資源豐富,根據(jù)芯片不同的封裝,端口數(shù)量有所差別。但是,每一個端口都擁有相同的結(jié)構(gòu),如圖5-1所示。也就是說,圖5-1所示結(jié)構(gòu)為一個引腳的內(nèi)部結(jié)構(gòu),16個這樣的結(jié)構(gòu)在一起構(gòu)成1組。STM32F103芯片中最多有GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG共7組,112個GPIO端口。5.1.1GPIO的基本結(jié)構(gòu)在涉及GPIO的編程中,實際上就是對框圖中的寄存器進行讀寫操作,并通過寄存器控制相關(guān)電路。GPIO引腳處的兩個保護二極管分別接電源電壓和電源地,當外部電路由于某種原因產(chǎn)生浪涌電壓并被導入GPIO引腳時,如果浪涌電壓高于VDD電源電壓,上方的保護二極管導通,浪涌電壓通過電源電路被濾波電容吸收泄放掉;當導入的浪涌電壓低于電壓地VSS時,下方的保護二極管導通,浪涌電壓同樣被濾波電容吸收泄放掉,從而避免浪涌電壓對芯片內(nèi)部電路造成損害。5.1.1GPIO的基本結(jié)構(gòu)在圖5-1中,上部分的虛線框是GPIO端口的輸入部分。通過程序可以控制圖中的電子開關(guān)使得GPIO端口工作在上拉輸入、下拉輸入或者浮空輸入模式,輸入信號根據(jù)工作模式的不同可以經(jīng)過肖特基施密特觸發(fā)器整形后,送到輸入數(shù)據(jù)寄存器或者復(fù)用輸入,也可以直接送到模擬輸入。在圖5-1中,下部分的虛線框是GPIO端口的輸出部分。其數(shù)據(jù)來源可以是輸出數(shù)據(jù)寄存器,或者是復(fù)用功能輸出。通過程序可以控制圖中的兩個MOS管同時工作,此時GPIO工作在推挽輸出模式;或者P-MOS管截止,只控制N-MOS管,此時工作在開漏輸出模式;或者兩個MOS管都關(guān)閉,輸出功能關(guān)閉。5.1.2GPIO的工作模式STM32F103微控制器GPIO的每一個引腳都可以根據(jù)實際應(yīng)用對象,獨立地配置成不同的工作模式,表5-1列出了GPIO的不同工作模式及典型應(yīng)用場合。5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深海探險起點:船舶租賃合同揭秘
- 飛行員培訓合同合作意向范本
- 車險代理合同書樣本
- 企業(yè)員工培訓合作協(xié)議合同
- 股權(quán)激勵實施合同協(xié)議
- 施工領(lǐng)域農(nóng)民工勞動合同模板
- 汽車購銷合同其一:條款解析
- 小學生心理課件
- 無線廣播電視傳輸中的信號傳輸信道分配考核試卷
- 天然氣儲層滲透性改善技術(shù)考核試卷
- 2024年甘肅天水麥積山石窟藝術(shù)研究所招聘工作人員考試真題
- 2025年山東省榮成市屬事業(yè)單位招聘崗位及歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- 火星表面材料分析-深度研究
- 《職業(yè)技能等級評價規(guī)范編制指南編制說明》
- 《教育強國建設(shè)規(guī)劃綱要(2024-2035年)》解讀講座
- 畜禽養(yǎng)殖場惡臭污染物排放及其處理技術(shù)研究進展
- 超聲內(nèi)鏡引導下穿刺活檢術(shù)的配合及護理
- 新生兒常見的產(chǎn)傷及護理
- 代寫回憶錄合同
- 2024年10月自考00149國際貿(mào)易理論與實務(wù)試題及答案
- 天耀中華合唱簡譜大劇院版
評論
0/150
提交評論