




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式系統(tǒng)導(dǎo)論課程內(nèi)容第01章嵌入式系統(tǒng)設(shè)計(jì)基礎(chǔ)第02章
ARMCortex-M3處理器第03章
Thumb指令系統(tǒng)第04章
STM32微控制器第05章
STM32的GPIO第06章
CM3異常和STM32中斷第07章
STM32的USART第08章
STM32的DMA接口第09章
STM32的定時(shí)器接口第10章
STM32的模擬接口嵌入式系統(tǒng)導(dǎo)論主講教師:第1章嵌入式系統(tǒng)設(shè)計(jì)基礎(chǔ)本章內(nèi)容提要1.1嵌入式系統(tǒng)概述
1.什么是嵌入式系統(tǒng)
2.嵌入式系統(tǒng)的技術(shù)特點(diǎn)
3.嵌入式系統(tǒng)的組成1.2嵌入式系統(tǒng)的開(kāi)發(fā)
1.嵌入式系統(tǒng)的開(kāi)發(fā)模式
2.嵌入式系統(tǒng)開(kāi)發(fā)需要的軟硬件
3.軟件開(kāi)發(fā)流程嵌入式系統(tǒng)產(chǎn)品移動(dòng)終端平板電腦、智能手機(jī)信息家電智能冰箱、洗衣機(jī)、智能空調(diào)、微波爐數(shù)字電視、數(shù)碼相機(jī)與數(shù)碼攝像機(jī)、游戲機(jī)汽車電子車載、車控智能儀器儀表通訊設(shè)備其他Embedded什么是嵌入式系統(tǒng)嵌入式計(jì)算機(jī)系統(tǒng)簡(jiǎn)稱為嵌入式系統(tǒng)常見(jiàn)的定義以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟件硬件可裁剪、以適用于應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗等要求嚴(yán)格的專用計(jì)算機(jī)系統(tǒng)主要的特點(diǎn)與具體應(yīng)用系統(tǒng)緊密結(jié)合,很強(qiáng)的專用性融合計(jì)算機(jī)技術(shù)、電子技術(shù)以及應(yīng)用領(lǐng)域的技術(shù)根據(jù)應(yīng)用需求對(duì)軟硬件高效設(shè)計(jì)、量體載衣嵌入式系統(tǒng)的技術(shù)特點(diǎn)硬件的特點(diǎn)硬件電路高度集成、體積較小低成本、低功耗軟件的特點(diǎn)實(shí)時(shí)性和可靠性軟件剪裁和固化代碼高效嵌入式系統(tǒng)的組成結(jié)構(gòu)嵌入式系統(tǒng)一般由4個(gè)部分組成嵌入式處理器、外圍硬件設(shè)備嵌入式操作系統(tǒng)(可選)、用戶應(yīng)用程序用戶應(yīng)用程序嵌入式操作系統(tǒng)嵌入式硬件平臺(tái)嵌入式處理器外圍硬件設(shè)備嵌入式處理器(EmbeddedProcessor)微控制器MCU
MicrocontrollerUnit(單片機(jī)SCM)
SingleChipMicrocomputer嵌入式微處理器MPU
MicroprocessorUnit數(shù)字信號(hào)處理器DSP
DigitalSignalProcessor片上系統(tǒng)SoC
SystemonChip外圍硬件設(shè)備半導(dǎo)體廠商配套常用接口電路系統(tǒng)基本電路 時(shí)鐘、復(fù)位、供電,以及存儲(chǔ)器等基本接口電路 通用I/O端口、通信接口、定時(shí)器、A/D等
常用支持電路
CAN總線、USB接口、存儲(chǔ)卡接口、以太網(wǎng)接口開(kāi)發(fā)公司提供外圍器件和軟件系統(tǒng)控制具體行業(yè)的儀器設(shè)備嵌入式操作系統(tǒng)工作簡(jiǎn)單、任務(wù)單一的嵌入式系統(tǒng)可以不用操作系統(tǒng),或運(yùn)行簡(jiǎn)單的監(jiān)控程序?qū)崟r(shí)性強(qiáng)、任務(wù)多樣的嵌入式系統(tǒng)需要實(shí)時(shí)操作系統(tǒng)(RTOS)uC/OS-II(現(xiàn)在已發(fā)展為uC/OS-III)VxWorks……功能強(qiáng)大、任務(wù)復(fù)雜的嵌入式系統(tǒng)使用多任務(wù)的操作系統(tǒng)嵌入式Linux(完善的網(wǎng)絡(luò)支持)安卓Android(智能終端操作系統(tǒng))WindowsCE……嵌入式系統(tǒng)的開(kāi)發(fā)人員嵌入式硬件工程師硬件設(shè)計(jì) 器件選擇、PCB板設(shè)計(jì)等,使用HDL語(yǔ)言硬件的軟件接口
Bootloader程序等,使用C與匯編嵌入式軟件程序員系統(tǒng)程序員 嵌入式OS移植、驅(qū)動(dòng)程序移植等,使用C與匯編應(yīng)用程序員
應(yīng)用軟件開(kāi)發(fā),使用C++、java等嵌入式系統(tǒng)的開(kāi)發(fā)模式宿主機(jī)-目標(biāo)機(jī)模式宿主機(jī):通用微型機(jī)(PC機(jī))目標(biāo)機(jī):待開(kāi)發(fā)的嵌入式系統(tǒng)交叉開(kāi)發(fā)宿主機(jī)建立完整的開(kāi)發(fā)環(huán)境交叉編譯產(chǎn)生目標(biāo)機(jī)的可執(zhí)行代碼通過(guò)JTAG、串口、USB接口、網(wǎng)絡(luò)等下載到目標(biāo)機(jī)遠(yuǎn)程調(diào)試軟件模擬(Simulator)在線硬件仿真(ICE:In-CircuitEmulator)宿主機(jī)-目標(biāo)機(jī)開(kāi)發(fā)模式嵌入式系統(tǒng)開(kāi)發(fā)需要的軟硬件開(kāi)發(fā)工具套件Keil微控制器開(kāi)發(fā)工具集(MDK-ARM)ARMDS-5(DevelopmentStudio5)IAR系統(tǒng)(ARMCortex-M的嵌入式工作平臺(tái))GNU編譯器集合(GCC)目標(biāo)板(開(kāi)發(fā)板、評(píng)估板)調(diào)試適配器(仿真器)集成開(kāi)發(fā)環(huán)境IDE下的軟件開(kāi)發(fā)步驟創(chuàng)建工程項(xiàng)目添加工程文件選用啟動(dòng)代碼、頭文件和外設(shè)驅(qū)動(dòng)庫(kù)函數(shù)創(chuàng)建源程序文件、編寫(xiě)程序配置工程選項(xiàng)交叉編譯和連接程序下載(閃存編程)使用調(diào)試仿真器將目標(biāo)代碼下載到閃存(或SRAM)中運(yùn)行運(yùn)行和調(diào)試軟件開(kāi)發(fā)流程嵌入式系統(tǒng)導(dǎo)論主講教師:第2章ARMCortex-M3處理器本章內(nèi)容提要2.1ARM處理器2.2Cortex-M3處理器結(jié)構(gòu)2.3Cortex-M3處理器的寄存器2.4Cortex-M3處理器的存儲(chǔ)器組織參考資料:ARM開(kāi)發(fā)者網(wǎng)站Cortex-M3設(shè)備一般用戶指南
Cortex-M3DevicesGenericUserGuide為軟件開(kāi)發(fā)人員提供的用戶指南提供程序員模型、核心外設(shè)的詳細(xì)信息、指令集的通用信息Cortex-M3技術(shù)參考手冊(cè)
Cortex-M3TechnicalReferenceManual
Cortex-M3處理器產(chǎn)品的技術(shù)規(guī)格書(shū)(TRM)包括諸如指令時(shí)序、部分接口信息等參考資料:STM32網(wǎng)站編號(hào)PM0056的Cortex-M3編程手冊(cè)STM32F10xxxCortex-M3programmingmanual為使用STM32的開(kāi)發(fā)人員提供Cortex-M3基本知識(shí)提供編程模型、指令集和核心外設(shè)的編程知識(shí)/content/st_com/zh.html/ARM(AdvancedRISCMachines)ARM公司著名的處理器設(shè)計(jì)公司,成立于1990年總部位于英國(guó)劍橋ARM處理器ARM公司專注于設(shè)計(jì)、并不制作和銷售處理器芯片授權(quán)轉(zhuǎn)讓設(shè)計(jì)許可、合作公司開(kāi)發(fā)生產(chǎn)芯片ARM技術(shù)體積小、功耗少、成本低、性能高等優(yōu)勢(shì)基于精簡(jiǎn)指令集計(jì)算機(jī)RISC思想2.1ARM處理器ARM處理器體系結(jié)構(gòu)8個(gè)版本的ARM體系結(jié)構(gòu)(Architecture)版本v4開(kāi)始被廣泛應(yīng)用,目前主要使用v7、v8結(jié)構(gòu)授權(quán)廠商生產(chǎn)多種ARM處理器系列(family)基于不同版本的結(jié)構(gòu)版本號(hào)與處理器系列(數(shù)字)并不一致例如,ARM7、ARM9、ARM11等ARMv7、v8結(jié)構(gòu)使用Cortex作為ARM處理器商標(biāo)面向不同應(yīng)用領(lǐng)域劃分成3種系列·Cortex-A·Cortex-R·Cortex-M2021年,ARM宣布ARMv9體系結(jié)構(gòu)ARMCortex處理器Cortex-A(Application)基于ARMv7-A(ARMv8-A)體系結(jié)構(gòu)用于高性能開(kāi)放應(yīng)用程序平臺(tái),支持操作系統(tǒng)Cortex-R(Real-time)基于ARMv7-R(ARMv8-R)體系結(jié)構(gòu)用于實(shí)時(shí)性要求的高端嵌入式系統(tǒng)Cortex-M(Microcontroller)基于ARMv7-M(ARMv8-M)和ARMv6-M體系結(jié)構(gòu)用于運(yùn)行實(shí)時(shí)控制系統(tǒng)的小規(guī)模應(yīng)用程序Cortex-M系列處理器廣泛應(yīng)用于現(xiàn)代微控制器產(chǎn)品、以及片上系統(tǒng)SoC和專用標(biāo)準(zhǔn)產(chǎn)品ASSPCortex-M3是ARM公司的第一個(gè)Cortex系列處理器Cortex-M3和Cortex-M4基于ARMv7-M體系結(jié)構(gòu)Cortex-M0、Cortex-M0+和Cortex-M1
基于ARMv6-M體系結(jié)構(gòu),指令集更小Cortex-M0和Cortex-M0+針對(duì)低成本微控制器產(chǎn)品Cortex-M1專為FPGA應(yīng)用設(shè)計(jì)用于替代傳統(tǒng)的ARM7(甚至ARM9)處理器2.2Cortex-M3處理器結(jié)構(gòu)高性能、低功耗、32位RISC處理器基于ARMv7-M結(jié)構(gòu),只執(zhí)行Thumb-2指令3段指令流水線(取指-譯碼-執(zhí)行)可嵌套向量中斷控制器NVIC4GB地址空間,統(tǒng)一的存儲(chǔ)器地址分配哈佛(存儲(chǔ))結(jié)構(gòu)允許指令和數(shù)據(jù)同時(shí)訪問(wèn)一系列內(nèi)部調(diào)試部件,支持多種調(diào)試接口(可選)存儲(chǔ)器保護(hù)單元MPU……復(fù)雜指令集和精簡(jiǎn)指令集復(fù)雜指令集計(jì)算機(jī)CISC(CISC:ComplexInstructionSetComputer)指令豐富、程序設(shè)計(jì)方便、程序短小、執(zhí)行性能高處理器硬件復(fù)雜,不易使用先進(jìn)的流水線技術(shù),導(dǎo)致其執(zhí)行速度和性能難以進(jìn)一步提高精簡(jiǎn)指令集計(jì)算機(jī)RISC(RISC:ReducedInstructionSetComputer)指令系統(tǒng)很簡(jiǎn)單,只有少數(shù)簡(jiǎn)單、常用的指令處理器硬件簡(jiǎn)單,比較方便地實(shí)現(xiàn)優(yōu)化RISC技術(shù)的主要特點(diǎn)指令條數(shù)較少尋址方式簡(jiǎn)單面向寄存器操作指令格式規(guī)整單周期執(zhí)行先進(jìn)的流水線技術(shù)編譯器優(yōu)化……Load-Store結(jié)構(gòu)Load:從主存讀取數(shù)據(jù)Store:把數(shù)據(jù)寫(xiě)入主存Load-Store結(jié)構(gòu):只有Load和Store指令存取主存數(shù)據(jù),其他運(yùn)算指令的操作數(shù)均在寄存器中馮·諾依曼存儲(chǔ)結(jié)構(gòu)和哈佛存儲(chǔ)結(jié)構(gòu)指令存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器哈弗結(jié)構(gòu)處理器總線總線存儲(chǔ)器指令數(shù)據(jù)馮·諾依曼結(jié)構(gòu)處理器總線馮·諾依曼存儲(chǔ)結(jié)構(gòu)系統(tǒng)只有一個(gè)存儲(chǔ)空間指令和數(shù)據(jù)共存于此占用不同的存儲(chǔ)區(qū)域哈佛存儲(chǔ)結(jié)構(gòu)系統(tǒng)有兩個(gè)存儲(chǔ)空間一個(gè)用于存儲(chǔ)指令一個(gè)用于存儲(chǔ)數(shù)據(jù)Cortex-M3功能模塊Cortex-M3的兩個(gè)操作狀態(tài)工作狀態(tài)(ThumbState)Cortex-M3啟動(dòng)后 執(zhí)行程序代碼(Thumb指令)的工作狀態(tài)調(diào)試狀態(tài)(DebugState)通過(guò)調(diào)試程序的停止請(qǐng)求或者處理器調(diào)試事件 才能進(jìn)入的調(diào)試狀態(tài)停止執(zhí)行指令,只應(yīng)用于調(diào)試操作Thumb狀態(tài)和Debug狀態(tài)Cortex-M3的兩級(jí)特權(quán)層次在工作狀態(tài)時(shí),處理器具有兩級(jí)特權(quán)層次特權(quán)級(jí)(PrivilegedLevel)可以訪問(wèn)所有處理器資源,執(zhí)行所有指令可執(zhí)行異常處理程序和應(yīng)用程序用戶級(jí)(非特權(quán)級(jí),UnprivilegedLevel)不能訪問(wèn)部分受限的存儲(chǔ)區(qū)域和進(jìn)行部分操作只能執(zhí)行應(yīng)用程序特權(quán)級(jí)用戶級(jí)異常程序異常模式非法應(yīng)用程序線程模式線程模式Cortex-M3的兩種操作模式在工作狀態(tài)時(shí),處理器還具有兩種操作模式異常模式(例程模式,HandlerMode)只能在特權(quán)級(jí)下,執(zhí)行異常處理程序線程模式(ThreadMode)特權(quán)級(jí)和用戶級(jí)下,執(zhí)行應(yīng)用程序復(fù)位后,處理器默認(rèn)進(jìn)入工作狀態(tài)的特權(quán)級(jí)下的線程模式執(zhí)行應(yīng)用程序特權(quán)級(jí)用戶級(jí)異常程序異常模式非法應(yīng)用程序線程模式線程模式兩級(jí)特權(quán)層次和兩種操作模式2.3Cortex-M3的寄存器通用寄存器應(yīng)用程序主要使用的寄存器16個(gè),32位,名稱:R0–R15R13是(堆)棧指針寄存器SP(StackPointer)R14是連接寄存器LR(LinkRegister)R15是程序計(jì)數(shù)器PC(ProgramCounter)專用寄存器程序狀態(tài)寄存器PSR(ProgramStatusRegister)中斷/異常屏蔽寄存器控制寄存器CONTROLCortex-M3的通用寄存器Cortex-M3的專用寄存器2.4Cortex-M3的存儲(chǔ)器組織32位地址,支持4GB線性地址空間0x00000000–0xFFFFFFFF哈佛(存儲(chǔ))結(jié)構(gòu),共用存儲(chǔ)器地址空間代碼區(qū)數(shù)據(jù)區(qū)外設(shè)區(qū)處理器系統(tǒng)外設(shè)區(qū)等Cortex-M3的地址空間分配位帶區(qū)(BitBandRegion)數(shù)據(jù)位的常規(guī)操作外設(shè)控制常要針對(duì)字中某個(gè)位(Bit)操作以字節(jié)編址的存儲(chǔ)器地址空間中,需要3步驟1.(從外設(shè))讀取包含該位的字節(jié)數(shù)據(jù)2.設(shè)置該位為0或1、同時(shí)屏蔽其他位(不改)3.將包含該位的字節(jié)數(shù)據(jù)寫(xiě)入(外設(shè))
LDRr0,=0x20000300
LDRr1,[r0] ;讀取數(shù)據(jù)
ORRr1,r1,#0x4
;D2位設(shè)置為1
STRr1,[r0] ;寫(xiě)回結(jié)果數(shù)據(jù)位的位段操作數(shù)據(jù)位若采用位編址(每位具有一個(gè)地址)就可以直接針對(duì)這個(gè)地址讀寫(xiě)代碼會(huì)更加緊湊、執(zhí)行效率更高
LDRr0,=0x22006008MOVr1,#1 ;D2位設(shè)置為1
STRr1,[r0] ;寫(xiě)入結(jié)果0x20000300
0x22006008
位帶區(qū)地址別名映射位帶區(qū)的地址映射0x20000000~0x200FFFFF
0x22000000~0x23FFFFFF
別名地址(32MB)數(shù)據(jù)區(qū)(1MB)0x40000000~0x400FFFFF
0x42000000~0x43FFFFFF
別名地址(32MB)外設(shè)區(qū)(1MB)別名地址
=位帶基址
+字節(jié)偏移量×32+位號(hào)×4地址映射示例字地址0x20000300中位號(hào)2的位位段基址=0x22000000字節(jié)偏移量=0x20000300-0x20000000=0x300別名地址
=0x22000000+0x300×32+2×4
=0x22006008位號(hào)乘以4(二進(jìn)制左移2位)的原因保證每個(gè)別名地址是4字節(jié)地址對(duì)齊其他3個(gè)地址不用字節(jié)偏移量乘以32(二進(jìn)制左移5位)的原因一個(gè)字節(jié)8位共占用32個(gè)地址位帶區(qū)和別名區(qū)關(guān)系對(duì)齊與不對(duì)齊地址訪問(wèn)支持不對(duì)齊地址邊界的數(shù)據(jù)傳輸,使編譯器 更自由的在存儲(chǔ)器中安排程序數(shù)據(jù)更加節(jié)省存儲(chǔ)空間地址邊界對(duì)齊地址邊界不對(duì)齊字節(jié)存儲(chǔ)順序多字節(jié)數(shù)據(jù)默認(rèn)采用小端方式存放也支持大端方式的存儲(chǔ)系統(tǒng)每個(gè)字Word是32位指令字長(zhǎng)有16位(Thumb指令)
還有32位(Thumb-2指令)訪問(wèn)代碼區(qū)必須對(duì)齊偶地址(PC最低位是0)大部分指令要求對(duì)齊地址訪問(wèn)部分指令可以支持非對(duì)齊地址訪問(wèn)1203340256017800地址嵌入式系統(tǒng)導(dǎo)論主講教師:第3章Thumb指令系統(tǒng)本章內(nèi)容提要3.1ARM指令集和Thumb指令集3.2統(tǒng)一匯編語(yǔ)言UAL3.3數(shù)據(jù)尋址3.4常用指令3.5STM32啟動(dòng)代碼3.6開(kāi)發(fā)工具M(jìn)DK3.132位ARM指令和16位Thumb指令傳統(tǒng)的ARM處理器具有兩種指令執(zhí)行狀態(tài)32位ARM狀態(tài):所有32位指令,以獲得高性能16位Thumb狀態(tài):僅16位指令,以提高代碼密度很多應(yīng)用程序混合使用ARM和Thumb代碼ARM和Thumb指令的轉(zhuǎn)換需要進(jìn)行狀態(tài)切換帶來(lái)執(zhí)行時(shí)間和代碼數(shù)量的額外開(kāi)銷增加軟件編譯的復(fù)雜度沒(méi)有經(jīng)驗(yàn)的開(kāi)發(fā)人員很難進(jìn)行軟件優(yōu)化32、16位指令是指令字長(zhǎng)是32、16位Thumb-2技術(shù)Cortex-M系列處理器的指令系統(tǒng)被稱為T(mén)humb包括16位Thumb指令和新的32位Thumb指令Cortex-M3/M4使用Thumb-2技術(shù)允許混合16和32位Thumb指令,無(wú)需狀態(tài)切換簡(jiǎn)化軟件開(kāi)發(fā),提高代碼密度、效率和性能不支持32位ARM指令導(dǎo)致Cortex-M3無(wú)法向后兼容傳統(tǒng)的ARM處理器不過(guò)Cortex-M3完全支持原來(lái)16位Thumb指令大多數(shù)程序使用C語(yǔ)言開(kāi)發(fā),轉(zhuǎn)換比較簡(jiǎn)單Thumb指令系統(tǒng)ARM指令集的發(fā)展動(dòng)態(tài)編譯器支持VFPv3NEONThumb-2(可選)Thumb-2(標(biāo)配)TrustZoneSIMDVFPv2Jazelle僅Thumb-2ARMv5ARMv6ARMv7A&RARMv7M3.2統(tǒng)一匯編語(yǔ)言UALUAL(Unifiedassemblylanguage)ARM和Thumb指令的通用匯編語(yǔ)言語(yǔ)法過(guò)去的語(yǔ)法被稱為:pre-UAL最新的ARM軟件開(kāi)發(fā)工具已經(jīng)支持UALPre-UAL目前仍被大多數(shù)開(kāi)發(fā)工具接受KeilMDK-ARM中,指示符THUMB ;使用UAL語(yǔ)法的Thumb指令CODE16 ;使用pre-UAL語(yǔ)法的Thumb指令A(yù)RM匯編程序的語(yǔ)句格式symbolmnemonicoperand1,operand2,... ;Comments標(biāo)識(shí)符助記符操作數(shù)1,操作數(shù)2,... ;注釋標(biāo)識(shí)符symbol必須起始于第一列(頂格)所有指令不能頂格書(shū)寫(xiě)標(biāo)號(hào)等標(biāo)識(shí)符大小寫(xiě)敏感指令、寄存器可全大寫(xiě)、全小寫(xiě),不要大小寫(xiě)混用匯編語(yǔ)言的程序結(jié)構(gòu)代碼區(qū):定義指令代碼序列匯編后被保存在代碼(CODE)存儲(chǔ)器數(shù)據(jù)區(qū):聲明使用的數(shù)據(jù),還可以提供初始值或常量匯編后在數(shù)據(jù)(DATA)存儲(chǔ)器預(yù)留空間(初值)系統(tǒng)堆棧:在存儲(chǔ)器中保留空間、設(shè)置棧指針SP區(qū)域指示符AREA定義存儲(chǔ)區(qū)段(section):代碼區(qū)或數(shù)據(jù)區(qū)區(qū)段名可以使用兩個(gè)垂線字符括起類型:code(代碼)、data(數(shù)據(jù))屬性主要是一些選項(xiàng):readonly:只讀(CODE區(qū)段的默認(rèn)屬性)readwrite:可讀可寫(xiě)(DATA區(qū)段的默認(rèn)屬性)align=n:地址對(duì)齊2n分配,n=0~31noinit:說(shuō)明DATA區(qū)段沒(méi)有初始值或初始值為0AREA區(qū)段名{,類型}{,屬性}... ;區(qū)段內(nèi)容,指令或數(shù)據(jù)定義過(guò)程指示符PROC/ENDP(FUNCTION/ENDFUNC)定義過(guò)程結(jié)構(gòu)(函數(shù)、子程序)可選{reglist1}是過(guò)程要保護(hù)的寄存器列表過(guò)程名 PROC[{reglist1}] ;開(kāi)始
... ;過(guò)程體(指令序列)
ENDP ;結(jié)束AREAmysect,CODE,readonly,align=2MyFunctPROC ... ENDP起始執(zhí)行指示符 ENTRY ... ;第一條執(zhí)行的指令 ... END ;匯編語(yǔ)言程序結(jié)束匯編結(jié)束指示符地址對(duì)齊指示符 ALIGN{expr}不帶參數(shù)設(shè)置當(dāng)前位置是下一個(gè)字(4個(gè)字節(jié))邊界帶參數(shù)expr對(duì)齊expr字節(jié)邊界expr是2冪次方的值,例如2、4、8、……由于ARM處理器大多數(shù)情況下都要求對(duì)齊地址邊界操作,所以經(jīng)常需要使用ALIGN指令以保證數(shù)據(jù)和代碼對(duì)齊了適合的地址邊界預(yù)留存儲(chǔ)器空間指示符SPACE偽指令預(yù)留內(nèi)容是0的存儲(chǔ)空間SPACE可以使用“%”替代FILL偽指令預(yù)留內(nèi)容是value值的存儲(chǔ)空間label是可選的標(biāo)號(hào)expr是分配存儲(chǔ)器空間的大?。ㄗ止?jié)為單位)value在存儲(chǔ)空間預(yù)留的值,無(wú)表示是0valuesize是value的字節(jié)數(shù)(1、2或4), 無(wú)表示是1{label}SPACEexpr{label}FILLexpr{,value{,valuesize}}數(shù)據(jù)定義指示符DC(DefineConstant),在存儲(chǔ)單元定義固定初值數(shù)據(jù)區(qū)域分配的靜態(tài)數(shù)據(jù),類似共享變量DCB/DCW/DCD/DCQ依次以1/2/4/8字節(jié)分配空間賦初值expr(可以是多個(gè)數(shù)值)DCB的初值expr還可以是括起的字符串沒(méi)有U選項(xiàng),則要求相應(yīng)地址對(duì)齊U選項(xiàng)不要求地址對(duì)齊,但有風(fēng)險(xiǎn)、慎用{label}DCBexpr{,expr}{label}DCW{U}expr{,expr}{label}DCD{U}expr{,expr}{label}DCQ{U}expr{,expr}常量表達(dá)十六進(jìn)制數(shù)像C語(yǔ)言一樣使用0x前綴字符用單引號(hào),字符串用雙引號(hào)字符和字符串中都可以是C語(yǔ)言標(biāo)準(zhǔn)的轉(zhuǎn)義符布爾常量 邏輯真→{TRUE},邏輯假→{FALSE}符號(hào)常量聲明使用等價(jià)EQU指示符
STACK_TOPEQU0x00000400指令中,常量要使用“#”作為前導(dǎo)字母
MOVR0,#0x12 ;R0=0x12立即數(shù)尋址
MOVR0,#0x12 ;R0=0x12在16位Thumb指令中,立即數(shù)只能是8位數(shù)據(jù)32位指令MOVW的立即數(shù)超過(guò)8位、不超過(guò)16位32位指令編碼無(wú)法直接表達(dá)32位立即數(shù):
MOVR5,#0X1FF400 ;=>AssemblyERRORUAL語(yǔ)法支持MOV32偽指令: MOV32{cond}Rd,expr ;一般格式 MOV32R5,#0X1FF400 ;示例MOV32偽指令實(shí)質(zhì)是使用MOV和MOVT指令組合32位數(shù)據(jù)的賦值:使用偽指令LDR
LDRRi,=val ;一般格式
LDRR5,=0X1FF400 ;示例實(shí)際上,這里沒(méi)有立即數(shù),而是類似:
LDRR5,[PC,#18] ;從[PC+18]獲得數(shù)據(jù)數(shù)據(jù)保存在被匯編程序事先創(chuàng)建的存儲(chǔ)區(qū)域(假設(shè)是當(dāng)前PC的偏移位置18處)該偽指令也用于獲得指針(變量地址) MOVRi,#val ;實(shí)際生成的MOV指令
LDRRi,[PC,#n] ;或者生成的LDR指令3.3數(shù)據(jù)尋址立即數(shù)尋址:從指令的機(jī)器代碼中獲得數(shù)據(jù)數(shù)據(jù)本身直接編碼在指令的機(jī)器代碼中,指令執(zhí)行時(shí)可以立即從機(jī)器代碼中獲得立即數(shù)多以常量形式表達(dá),用井號(hào)“#”作為前導(dǎo)寄存器尋址:從處理器的寄存器中訪問(wèn)數(shù)據(jù)存儲(chǔ)器尋址:從主存儲(chǔ)器中訪問(wèn)數(shù)據(jù)寄存器尋址通用寄存器13個(gè):R0~R12R13(SP)和R14(LR)多數(shù)情況下也可以使用但由于他們的特定含義和作用,要小心使用R15(PC),大多數(shù)指令不能使用它因?yàn)樗鼘⒏淖兂绦蛄鞒?、非常危險(xiǎn)改變流程,應(yīng)該使用跳轉(zhuǎn)指令(B、BL、BX等)寄存器移位尋址ARM和Thumb-2指令的特有尋址方法對(duì)第3個(gè)寄存器操作數(shù)實(shí)現(xiàn)移位操作移位(shift)操作有5種LSL(LogicalShiftLeft),邏輯左移LSR(LogicalShiftRight),邏輯右移ASR(ArithmeticShiftRight),算術(shù)右移ROR(RotateRight),循環(huán)右移RRX(RotateRighteXtended),循環(huán)右移擴(kuò)展即帶進(jìn)位標(biāo)志的右移 ANDR0,R1,R2,LSL#3 ;R0←R1&(R2<<3)寄存器移位尋址的MOV指令只有移位、沒(méi)有其他操作的MOV指令寄存器在UAL語(yǔ)法中,直接使用移位關(guān)鍵字為助記符寄存器移位尋址的MOV指令UAL語(yǔ)法MOVRd,Rn,LSLshiftMOVRd,Rn,LSRshiftMOVRd,Rn,ASRshiftMOVRd,Rn,RORshiftMOVRd,Rn,RRXLSLRd,Rn,shiftLSRRd,Rn,shiftASRRd,Rn,shiftRORRd,Rn,shiftRRXRd,Rn訪問(wèn)(存?。┐鎯?chǔ)器操作數(shù)RISC處理器采用Load-Store結(jié)構(gòu)存儲(chǔ)器操作指令只有兩種讀取存儲(chǔ)器操作數(shù)LoadtoRegister
LDRRi,{expr}存儲(chǔ)存儲(chǔ)器操作數(shù)StorefromRegister
STRRi,{expr}操作數(shù)expr有多種形式(尋址方式)存儲(chǔ)器操作數(shù)的寄存器間接尋址
LDRRi,[Rj] ;Ri=[Rj]expr是“[Rj]”形式存儲(chǔ)器地址保存在某個(gè)通用寄存器中ARM不支持直接尋址Indirectaddressing存儲(chǔ)器操作數(shù)的寄存器偏移尋址LDRRi,[Rj,#offset] ;①Ri=[Rj+offset]LDRRi,[Rj,Rk] ;②Ri=[Rj+Rk]LDRRi,[Rj,Rkshift#n] ;③Ri=[Rj+(Rkshift#n)]存儲(chǔ)器地址由通用寄存器內(nèi)容加上一個(gè)位移量(Displacement)、也稱偏移量(Offset)組成位移量可以來(lái)自①立即數(shù)(通常在4KB范圍內(nèi))②寄存器③寄存器移位(LSL、LSR、ASR、ROR、RRX)Indirectaddressingwithdisplacement存儲(chǔ)器操作數(shù)的寄存器后偏移尋址
LDRRi,[Rj],#offset ;Ri=[Rj],Rj=Rj+offset
LDRRi,[Rj],Rk ;Ri=[Rj],Rj=Rj+Rk
LDRRi,[Rj],Rkshift#n ;Ri=[Rj],Rj=Rj+(Rkshift#n)這種尋址方式的指令具有兩個(gè)功能:先用[Rj]間接尋址訪問(wèn)存儲(chǔ)器內(nèi)容賦值Ri之后將Rj加上位移量更新Rj的地址Indirectaddressingwithpost-displacement存儲(chǔ)器操作數(shù)的寄存器前偏移尋址
LDRRi,[Rj,#offset]! ;Rj=Rj+offset,Ri=[Rj]
LDRRi,[Rj,Rk]! ;Rj=Rj+Rk,Ri=[Rj]
LDRRi,[Rj,Rkshift#n]! ;Rj=Rj+(Rkshift#n),Ri=[Rj]這種尋址方式的指令具有兩個(gè)功能:先將Rj加上位移量更新Rj的地址然后用[Rj]間接尋址訪問(wèn)存儲(chǔ)器內(nèi)容賦值RiIndirectaddressingwithpre-displacement3.4Cortex-M3的指令系統(tǒng)存儲(chǔ)器訪問(wèn)指令,批量32位數(shù)據(jù)傳輸指令通用數(shù)據(jù)處理加減運(yùn)算、邏輯運(yùn)算以及硬件除法等指令乘法指令飽和運(yùn)算指令位操作指令跳轉(zhuǎn)、條件分支和功能調(diào)用指令系統(tǒng)控制、操作系統(tǒng)支持等指令A(yù)RM處理器的指令格式花括號(hào)“{}”表示可選opcode指令操作碼:使用助記符表示Rd目的寄存器存儲(chǔ)器讀(除批量讀)指令,是讀入數(shù)據(jù)的寄存器存儲(chǔ)器寫(xiě)(除批量存)指令,該寄存器內(nèi)容寫(xiě)入存儲(chǔ)器Rn(第1個(gè)源操作數(shù))寄存器{,operand2}第2個(gè)源操作數(shù)非存儲(chǔ)器訪問(wèn)指令支持寄存器移位尋址存儲(chǔ)器訪問(wèn)指令支持間接、偏移和前偏移、后偏移尋址opcode{S}{cond}Rd,Rn{,operand2}S后綴:更新APSR沒(méi)有S后綴:不影響APSR中的標(biāo)志有S后綴:更新APSR內(nèi)容opcode{S}{cond}Rd,Rn{,operand2}313029282726:252415:108:0NZCVQICI/ITTICI/IT異常號(hào)APSREPSRIPSRPSR或xPSR應(yīng)用程序狀態(tài)寄存器APSRN(Negative)負(fù)數(shù)標(biāo)志有符號(hào)整數(shù)的結(jié)果是負(fù)數(shù)設(shè)置N標(biāo)志為1結(jié)果是正數(shù)或0設(shè)置N標(biāo)志為0Z(Zero)零標(biāo)志執(zhí)行結(jié)果是0(兩數(shù)比較相等)設(shè)置為1,否則為0C(Carry)進(jìn)位標(biāo)志對(duì)無(wú)符號(hào)相加,無(wú)符號(hào)溢出(進(jìn)位)設(shè)置為1對(duì)無(wú)符號(hào)相減,結(jié)果沒(méi)有借位設(shè)置為1,借位為0V(Overflow)溢出標(biāo)志對(duì)有符號(hào)整數(shù)加減,當(dāng)有符號(hào)溢出時(shí)設(shè)置為1ApplicationProgramStatusRegister{cond}后綴:條件執(zhí)行沒(méi)有cond后綴:總是執(zhí)行有cond后綴:條件成立,執(zhí)行條件不成立,不執(zhí)行opcode{S}{cond}Rd,Rn{,operand2}這樣,大多數(shù)指令都成了條件執(zhí)行指令條件cond后綴標(biāo)志含義EQZ=1Equal,相等NEZ=0NotEqual,不相等MIN=1Minus,負(fù)數(shù)PLN=0Plus,正數(shù)VSV=1oVerflowSet,溢出VCV=0oVerflowClear,未溢出CSHSC=1CarrySet,進(jìn)位HigherorSame,高于或等于CCLOC=0ClearCarry,無(wú)進(jìn)位Lower,低于條件cond(續(xù))后綴標(biāo)志含義HIC=1ANDZ=0unsignedHigher,無(wú)符號(hào)高于LSC=0ORZ=1unsignedLowerorSame,無(wú)符號(hào)低于或等于GEN=VsignedGreaterthanorEqual,有符號(hào)大于或等于LTN≠VsignedLessThan,有符號(hào)小于GTZ=0ANDN=VsignedGreaterThan,有符號(hào)大于LEZ=1ORN≠VsignedLessthanorEqual,有符號(hào)小于或等于處理器內(nèi)的傳送指令寄存器之間傳送、傳送立即數(shù)到寄存器
MOV{S}{cond}Rd,Operand2 ;寄存器傳送
MOV{cond}Rd,#imm16 ;立即數(shù)傳送
MVN{S}{cond}Rd,Operand2 ;源操作數(shù)取反后傳送給目的寄存器(取反)專用寄存器與通用寄存器之間傳送
MRS{cond}Rd,spec_reg ;專用寄存器讀取
MSR{cond}spec_reg,Rn ;專用寄存器寫(xiě)入存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器讀寫(xiě)
LDR{cond}Rd,Rn,Operand2 ;存儲(chǔ)器讀
STR{cond}Rd,Rn,Operand2 ;存儲(chǔ)器寫(xiě)存儲(chǔ)器批量讀寫(xiě)
LDM{cond}Rn{!},reglist ;存儲(chǔ)器批量讀
STM{cond}Rn{!},reglist ;存儲(chǔ)器批量寫(xiě)堆棧操作指令
PUSH{cond}reglist
POP{cond}reglist生成相對(duì)PC的地址
ADR{cond}Rd,label ;Rd=label的地址label是標(biāo)號(hào)匯編程序也支持label加減一個(gè)數(shù)字或者[PC,#number]形式加減運(yùn)算、邏輯運(yùn)算指令A(yù)DD(加法)、ADC(帶進(jìn)位加法)SUB(減法)、SBC(帶進(jìn)位減法)RSB(反轉(zhuǎn)減法,ReverseSubtract)
oprand2–Rn→RdAND(邏輯與)、ORR(邏輯或)、EOR(邏輯異或)BIC(邏輯與非,operand2求反后與Rn相邏輯與)ORN(邏輯或非,operand2求反后與Rn相邏輯或)op{S}{cond}{Rd,}Rn,Operand2
;Rnopoprand2→Rdop{cond}{Rd,}Rn,#imm12;僅ADD和SUB比較測(cè)試指令 CMP{cond}Rn,Operand2 ;Rn-oprand2,類似SUBS、但不保存結(jié)果
CMN{cond}Rn,Operand2;Rn+oprand2,類似ADDS、但不保存結(jié)果
TST{cond}Rn,Operand2;Rn與oprand2,類似ANDS、但不保存結(jié)果
TEQ{cond}Rn,Operand2 ;Rn異或oprand2,類似EORS、但不保存結(jié)果移位指令 op{S}{cond}Rd,Rm,Rs op{S}{cond}Rd,Rm,#n RRX{S}{cond}Rd,Rm操作碼op指邏輯左移LSL、邏輯右移LSR算術(shù)右移ASR、循環(huán)右移RORRs指保存移位位數(shù)的寄存器,只用最低字節(jié)n是移位位數(shù)乘除法指令
MUL{S}{cond}{Rd,}Rn,Rm ;乘法:Rd=(Rn×Rm)低32位
MLA{cond}Rd,Rn,Rm,Ra ;乘加:Rd=(Rn×Rm)低32位+Ra
MLS{cond}Rd,Rn,Rm,Ra ;乘減:Rd=Ra–(Rn×Rm)低32位
SDIV{cond}{Rd,}Rn,Rm ;有符號(hào)數(shù)除法:Rd=Rn÷Rm
UDIV{cond}{Rd,}Rn,Rm ;無(wú)符號(hào)數(shù)除法:Rd=Rn÷Rm長(zhǎng)乘法指令 UMULL{cond}RdLo,RdHi,Rn,Rm;無(wú)符號(hào)數(shù)64位長(zhǎng)乘法:(RdHi,RdLo)=Rn×Rm
SMULL{cond}RdLo,RdHi,Rn,Rm;有符號(hào)數(shù)64位長(zhǎng)乘法:(RdHi,RdLo)=Rn×Rm
UMLAL{cond}RdLo,RdHi,Rn,Rm;無(wú)符號(hào)數(shù)64位長(zhǎng)乘加:
(RdHi,RdLo)=(RdHi,RdLo)+Rn×Rm SMLAL{cond}RdLo,RdHi,Rn,Rm;有符號(hào)數(shù)64位長(zhǎng)乘加:
(RdHi,RdLo)=(RdHi,RdLo)+Rn×Rm跳轉(zhuǎn)調(diào)用指令
B{cond}label ;跳轉(zhuǎn)到label
BL{cond}label ;跳轉(zhuǎn)并連接到label ;調(diào)用label子程序(下條指令地址存入R14)
BX{cond}Rm ;跳轉(zhuǎn)到Rm指定的地址
;子程序返回一般用“BXLR“指令
BLX{cond}Rm ;調(diào)用Rm指定地址的子程序 (下條指令地址存入R14)分支指令
CBZRn,label ;Rn等于0跳轉(zhuǎn)到Label
CBNZRn,label ;Rn不等于0跳轉(zhuǎn)到Label
IT{x{y{z}}}cond ;分支(If-Then)條件指令
;cond說(shuō)明IT塊中第1條指令執(zhí)行的條件
;x、y和z依次說(shuō)明IT塊中第2、3和4條指令執(zhí)行的條件開(kāi)關(guān)T或E:
;如果是T(Then)表示條件成立執(zhí)行
;否則是E(Else)表示條件不成立執(zhí)行。其他指令
NOP{cond} ;空操作指令
BKPT#imm ;斷點(diǎn)(Breakpoint)指令
;引起處理器進(jìn)入調(diào)試狀態(tài)
SVC{cond}#imm ;引起管理員調(diào)用SVC ;(SupervisorCall)異常
WFI{cond} ;等待中斷WaitForInterrupt ;暫停執(zhí)行直到非屏蔽中斷產(chǎn)生并響應(yīng)、
;被PRIMASK屏蔽的中斷被掛起(pending)、
;或者有調(diào)試(DebugEntry)請(qǐng)求3.5STM32啟動(dòng)代碼(StartupCode)用來(lái)初始化硬件電路為高級(jí)語(yǔ)言編寫(xiě)的應(yīng)用程序做好運(yùn)行前準(zhǔn)備通常采用匯編語(yǔ)言編寫(xiě)是處理器上電復(fù)位時(shí)的程序運(yùn)行入口點(diǎn)啟動(dòng)代碼與使用的處理器和硬件設(shè)備有關(guān)過(guò)程大致相同,主要是:堆和棧的定義及初始化異常(中斷)向量表的建立提供默認(rèn)異常(中斷)處理程序調(diào)用函數(shù)配置時(shí)鐘系統(tǒng)最終轉(zhuǎn)向main函數(shù)開(kāi)始執(zhí)行應(yīng)用程序Cortex-M3啟動(dòng)方式通過(guò)boot引腳設(shè)置,有3種啟動(dòng)方式方式1:SRAM區(qū)中斷向量表定位于SRAM區(qū)起始地址和PC指針是0x20000000方式2:Flash區(qū)中斷向量表定位于Flash區(qū)起始地址和PC指針是0x80000000方式3:Bootloader區(qū)中斷向量表定位于內(nèi)置Bootloader區(qū)起始地址必須存放棧頂指針第2個(gè)地址必須存放復(fù)位入口地址STM32啟動(dòng)代碼文件在STM32庫(kù)V3.5.0中,啟動(dòng)代碼的文件名是startup_stm32f10x_??.s“??”表示不同類型STM32微控制器例如,“xl”,指超高密度容量的微控制器芯片啟動(dòng)代碼基本一樣,分成4個(gè)片段:(1)定義堆和棧的大?。?)定義中斷向量表(3)默認(rèn)的中斷處理程序(4)用戶初始化堆和棧分析startup_stm32f10x_hd.sSTM32啟動(dòng)代碼1:定義堆和棧的大小Stack_SizeEQU0x00000400 ;棧大小為0x400
AREASTACK,NOINIT,READWRITE,ALIGN=3 ;定義棧STACK,未初始化、可讀可寫(xiě)、8字節(jié)對(duì)齊Stack_MemSPACEStack_Size ;為棧分配空間__initial_sp ;棧地址標(biāo)號(hào)Heap_SizeEQU0x00000200 ;堆大小為0x200
AREAHEAP,NOINIT,READWRITE,ALIGN=3__heap_base ;堆基地址標(biāo)號(hào)Heap_MemSPACEHeap_Size ;為堆分配空間__heap_limit ;堆容量地址標(biāo)號(hào)
PRESERVE8 ;指定當(dāng)前堆棧8字節(jié)對(duì)齊
THUMB ;使用32位Thumb指令、支持UAL匯編語(yǔ)言STM32啟動(dòng)代碼2:定義中斷向量表
AREARESET,DATA,READONLY ;定義復(fù)位(RESET)區(qū)、數(shù)據(jù)段,只讀
EXPORT__Vectors
;中斷向量地址(程序地址)
EXPORT__Vectors_End
EXPORT__Vectors_Size
;EXPORT定義全局標(biāo)號(hào),表示可在其他文件中使用__Vectors DCD__initial_sp ;地址0x00保存堆棧指針
DCDReset_Handler ;地址0x04保存復(fù)位地址
DCDNMI_Handler ;地址0x08保存非屏蔽地址
…… ;略(所有中斷向量地址)STM32啟動(dòng)代碼3:默認(rèn)中斷處理程序
AREA|.text|,CODE,READONLY
;代碼段、只讀Reset_HandlerPROC ;復(fù)位處理程序
EXPORTReset_Handler[WEAK] ;[WEAK]選項(xiàng):若其他文件也定義該標(biāo)號(hào)(函數(shù)) ;連接時(shí)使用其他文件的地址;否則以此處地址連接
IMPORT__main IMPORTSystemInit ;IMPORT表示標(biāo)號(hào)在其他文件中定義
STM32啟動(dòng)代碼3:默認(rèn)中斷處理程序(續(xù)1) LDRR0,=SystemInit ;把SystemInit的地址給RO
BLXR0 ;調(diào)用SystemInit,初始化STM32的時(shí)鐘系統(tǒng)
LDRR0,=__main ;把__main的地址給RO
BXR0 ;跳轉(zhuǎn)到__main標(biāo)號(hào)
ENDP注1:SystemInit定義在system_stm32f10x.c中注2:__main指向C/C++初始化子程序(初始化堆和棧等),最后跳轉(zhuǎn)到C語(yǔ)言程序的main函數(shù)STM32啟動(dòng)代碼3:默認(rèn)中斷處理程序(續(xù)2) ;默認(rèn)異常(中斷)處理程序(無(wú)限循環(huán)、可被修改)NMI_HandlerPROC ;NMI處理程序
EXPORTNMI_Handler[WEAK] B. ;“.”代表當(dāng)前指令地址 ;“B
.”類似C語(yǔ)言的while(1)語(yǔ)句,無(wú)限循環(huán)
ENDP …… ;略
ALIGN ;按照要求進(jìn)行對(duì)齊注3:V3.5.0前啟動(dòng)代碼沒(méi)有調(diào)用SystemInit,需要用戶在應(yīng)用程序主函數(shù)main中首先調(diào)用STM32啟動(dòng)代碼4:用戶初始化堆和棧
IF:DEF:__MICROLIB ;如果定義了__MICROLIB則為真,否則為假
EXPORT__initial_sp ;為真,讓外部文件使用定義的堆和棧地址
EXPORT__heap_base EXPORT__heap_limitMicroLib是為基于ARM嵌入式應(yīng)用編寫(xiě)的一個(gè)高度優(yōu)化的C語(yǔ)言庫(kù),提供了更緊湊的代碼大小、可應(yīng)用于無(wú)操作系統(tǒng)支持的情況,不支持文件I/O和寬字符、有些函數(shù)速度略慢MicroLib的選擇(目標(biāo)選項(xiàng))STM32啟動(dòng)代碼4:用戶初始化堆和棧(續(xù))
ELSE
;為假,使用默認(rèn)的C語(yǔ)言運(yùn)行庫(kù)
IMPORT__use_two_region_memory EXPORT__user_initial_stackheap__user_initial_stackheap LDRR0,=Heap_Mem ;堆起始地址
LDRR1,=(Stack_Mem+Stack_Size) ;棧大小
LDRR2,=(Heap_Mem+Heap_Size) ;堆大小
LDRR3,=Stack_Mem ;棧頂指針
BXLR ALIGN ENDIF END3.6開(kāi)發(fā)工具M(jìn)DK-ARM流行的Cortex-M處理器商業(yè)開(kāi)發(fā)平臺(tái)包括各種組件:μVision集成開(kāi)發(fā)環(huán)境(IDE)ARM編譯工具(C/C++編譯器、匯編器、連接器等)調(diào)試器和模擬器RTX實(shí)時(shí)操作系統(tǒng)核心超過(guò)1000個(gè)微控制器的參考啟動(dòng)代碼Flash編程算法程序示例KeilMicrocontrollerDevelopmentKitforARM基于MDK的一般開(kāi)發(fā)流程μVision集成界面MDK安裝目錄MDK-ARM5安裝的Keil目錄UV4子目錄(μVision5的文件)ARM子目錄(主要文件)ARMCC\bin是主要的程序文件armcc.exe:C/C++編譯程序armasm.exe:匯編程序armlink.exe:連接程序fromelf.exe:下載生成程序BIN是動(dòng)態(tài)鏈接庫(kù)DLLHlp保存各種幫助文件Pack驅(qū)動(dòng)程序包(庫(kù))的目錄軟件包程序目錄Pack目錄(驅(qū)動(dòng)程序文件)ARM是ARM公司的基本驅(qū)動(dòng)程序Keil保存有ST公司的驅(qū)動(dòng)程序 含啟動(dòng)代碼文件、外設(shè)驅(qū)動(dòng)程序的頭文件和源程序文件等……創(chuàng)建應(yīng)用程序1.新建項(xiàng)目:Project–NewμVisionProject選擇或新建一個(gè)目錄,輸入項(xiàng)目文件名選擇目標(biāo)微控制器(ST公司的STM32F103ZE)根據(jù)項(xiàng)目需求,選擇相應(yīng)的驅(qū)動(dòng)程序修改目標(biāo)名、組名,或增加新組創(chuàng)建應(yīng)用程序2.新建源程序文件:File–New編輯源程序代碼、保存文件加入項(xiàng)目(AddExistingFilestoGroup)intmain(){}創(chuàng)建應(yīng)用程序3.構(gòu)建應(yīng)用程序:Project–BuildTarget編譯、匯編和連接4.調(diào)試應(yīng)用程序:
Debug–Start/StopDebugSession目標(biāo)選項(xiàng)的調(diào)試配置:OptionforTarget使用模擬器UseSimulator啟動(dòng)時(shí)載入應(yīng)用程序
LoadAplicationatStartup運(yùn)行至主函數(shù)Runtomain()目標(biāo)選項(xiàng)的調(diào)試配置【例3-1】簡(jiǎn)化STM32微控制器啟動(dòng)代碼-1Stack_Size EQU0x00000400
AREASTACK,NOINIT,READWRITE,ALIGN=3
SPACEStack_Size__initial_sp
THUMB
AREARESET,DATA,READONLY
DCD__initial_sp;設(shè)置棧指針
DCDReset_Handler;設(shè)置復(fù)位程序入口
AREA|.text|,CODE,READONLY【例3-1】簡(jiǎn)化STM32微控制器啟動(dòng)代碼-2Reset_HandlerPROC
movr0,#10
;R0=10
addr1,r0,r0
;R1=R0+R0
addr1,r1,r1,lsl#2 ;R1=R1+R1×4=R0×10=100
mulr2,r0,r0
;R3=R0×R0=100
B.
;無(wú)限循環(huán)
ENDP
END不要選擇“運(yùn)行至主函數(shù)Runtomain()”單步調(diào)試:Step單步通過(guò):StepOver【例3-2】獨(dú)立的匯編語(yǔ)言程序-1 THUMB ;使用THUMB指令和UAL語(yǔ)法 AREARESET,DATA,READONLY ;數(shù)據(jù)區(qū)、只讀 DCD0x20000460 ;設(shè)置棧指針 DCDstart ;設(shè)置起始執(zhí)行位置 AREA|.text|,CODE,READONLY ;代碼區(qū)、只讀 ENTRY ;程序開(kāi)始執(zhí)行點(diǎn)start movr1,#num ;傳送求和個(gè)數(shù)給R1 ldrr2,=array ;獲取數(shù)組地址給R2 movr0,#0 ;使用R0進(jìn)行累加求和,初始為0【例3-2】獨(dú)立的匯編語(yǔ)言程序-2again ldrr3,[r2],#4 ;取數(shù)組元素值給R3,然后R2增量4 addr0,r0,r3 ;求和 subsr1,r1,#1 ;個(gè)數(shù)減1 bneagain ;個(gè)數(shù)大于0,繼續(xù)求和 ldrr4,=sum strr0,[r4] ;保存求和R0到結(jié)果變量sum b. ;無(wú)限循環(huán)【例3-2】獨(dú)立的匯編語(yǔ)言程序-3 AREA|.rodata|,DATA,READONLY,ALIGN=3 ;數(shù)據(jù)區(qū)、只讀array dcd3,-17,26,-13,101 ;數(shù)組num equ(.-array)/4 ;求得數(shù)組元素個(gè)數(shù) AREA|.data|,DATA,READWRITE,ALIGN=3 ;數(shù)據(jù)區(qū)、可讀寫(xiě)sum dcd0 ;保存求和結(jié)果 END“運(yùn)行(Run)”命令執(zhí)行“停止(Stop)”命令結(jié)束【例3-2】MDK模擬運(yùn)行結(jié)果嵌入式系統(tǒng)導(dǎo)論主講教師:第4章STM32微控制器本章內(nèi)容提要4.1STM32微控制器結(jié)構(gòu)4.2STM32微控制器開(kāi)發(fā)4.3復(fù)位與時(shí)鐘控制(RCC)4.1STM32微控制器結(jié)構(gòu)基于Cortex-M3/M4設(shè)計(jì)微控制器產(chǎn)品的公司意法半導(dǎo)體(STMicroelectronics)愛(ài)特梅爾(Atmel)三星(Samsung)……微控制器包含許多不同的模塊處理器核心存儲(chǔ)器時(shí)鐘電路、系統(tǒng)總線外設(shè)(硬件單元):I/O接口、通信接口、定時(shí)器、ADC和DAC,……基于Cortex-M3的微控制器STM32微控制器應(yīng)用類別STM32系列產(chǎn)品主要特點(diǎn)(核心,時(shí)鐘頻率等)高性能STM32F2系列STM32F4系列STM32F7系列STM32H7系列Cortex-M3、120MHz,基礎(chǔ)產(chǎn)品線Cortex-M4+FPU、180MHz,基礎(chǔ)或先進(jìn)產(chǎn)品線Cortex-M7+FPU、216MHz,極高性能雙核Cortex-M7+M4FPU、480MHz,極高性能主流STM32F0系列STM32G0系列STM32F1系列STM32F3系列STM32G4系列Cortex-M0、48MHz,入門(mén)級(jí),適用于成本敏感的應(yīng)用Cortex-M0+、64MHz,新一代入門(mén)級(jí)、首個(gè)8引腳STM32Cortex-M3、72MHz,基礎(chǔ)產(chǎn)品線Cortex-M4+FPU、72MHz,具有16位ADC等Cortex-M4+FPU、170MHz,具有數(shù)學(xué)加速器等超低功耗STM32L0系列STM32L1系列STM32L4系列STM32L4+系列STM32L5系列STM32U5系列Cortex-M0+、32MHz,低功耗模式+RAM+RTCCortex-M3、32MHz,低功耗模式+RAM+RTCCortex-M4+FPU、80MHz,低功耗模式+RAM+RTCCortex-M4+FPU、80MHz,低功耗模式+RAM+RTCCortex-M33+FPU、110MHz,低功耗模式+RAM+RTCCortex-M33+FPU、160MHz,低功耗模式+RAM+RTCSTM32微控制器STM32F0系列:入門(mén)級(jí)MCU、基于CM0STM32F1系列:主流MCU、基于CM3STM32F2系列:高性能MCU、基于CM3STM32F3系列:具有DSP和FPU的MCU、基于CM4STM32F4系列:具有DSP和FPU的高性能MCU、基于CM4STM32L0系列:低功耗MCU、基于Cortex-M0+STM32L1系列:低功耗MCU、基于Cortex-M3……CM:Cortex-M,CM3:Cortex-M3,CM4:Cortex-M4STM32F10x系列微控制器STM32F10xSTM32F1系列微控制器STM32F10024MHz,具有馬達(dá)控制器和HDMICEC功能STM32F10136MHz,多達(dá)1MBFlash存儲(chǔ)器STM32F10248MHz,支持USB接口STM32F10372MHz,多達(dá)1MBFlash存儲(chǔ)器支持馬達(dá)控制、USB和CAN接口STM32F105/10772MHz,支持以太網(wǎng)、CAN和USB2.0OTG接口STM32F10xSTM32F103系統(tǒng)結(jié)構(gòu)哈佛存儲(chǔ)結(jié)構(gòu)獨(dú)立的指令總線(I-bus),連接Flash總線矩陣(BusMatrix)提供多種數(shù)據(jù)通道數(shù)據(jù)總線(D-bus)系統(tǒng)總線(System)DMA和SRAM通過(guò)AHB-APB橋連接2個(gè)先進(jìn)外設(shè)總線APBAPB2可全速工作于72MHz,但APB1限制在36MHz外設(shè)連接在APB上STM32F103系統(tǒng)結(jié)構(gòu)STM32F103的主要外設(shè)通過(guò)APB連接外設(shè)和I/O接口,共同具有的外設(shè):通用和復(fù)用功能I/O(GPIO和AFIO)通用定時(shí)器(TIMx)實(shí)時(shí)時(shí)鐘(RTC)(Cortex處理器自帶系統(tǒng)時(shí)間片時(shí)鐘SysTick)看門(mén)狗(WatchDog)通用同步異步接收發(fā)送器(USART)串行外設(shè)接口(SPI)I2C接口(I2C)模擬數(shù)字轉(zhuǎn)換器ADC(以及溫度傳感器)更高性能的STM32微控制器還支持更多外設(shè)STM32F10x存儲(chǔ)器結(jié)構(gòu)4GB線性地址空間,全部統(tǒng)一編排地址4GB空間分成8個(gè)512MB(0.5GB)區(qū)域代碼區(qū)(Code),起始于0x00000000Flash組成,程序代碼起始于0x08000000SRAM區(qū),起始于0x20000000型號(hào)不同、容量不同:16KB、48KB、64KB等
外設(shè)區(qū),起始于0x40000000外設(shè)的寄存器訪問(wèn)地址外部區(qū),起始于0x600000001GB用于外部RAM,1GB用于外設(shè)系統(tǒng)外設(shè)區(qū),起始于0xE0000000STM32地址空間4.2STM32微控制器開(kāi)發(fā)基于目標(biāo)機(jī)-宿主機(jī)的交叉編譯系統(tǒng)在集成開(kāi)發(fā)環(huán)境(MDK)的支持下進(jìn)行通常采用高級(jí)語(yǔ)言(C/C++語(yǔ)言)編寫(xiě)Cortex微控制器軟件接口標(biāo)準(zhǔn)CMSIS為基于Cortex-M處理器的系統(tǒng)定義了標(biāo)準(zhǔn)軟件接口是Cortex-M處理器與供應(yīng)商無(wú)關(guān)的硬件抽象層可實(shí)現(xiàn)與處理器和外設(shè)間的一致且簡(jiǎn)單的軟件接口從而簡(jiǎn)化軟件的重用,便于初學(xué)者使用、降低成本目前,CMSIS包含以下組件CMSIS-Core:處理器與外圍寄存器間的接口CMSIS-RTOS:實(shí)時(shí)操作系統(tǒng)的標(biāo)準(zhǔn)化編程接口CMSIS-DSP:60多種DSP函數(shù)庫(kù)CMSIS-SVD:系統(tǒng)視圖描述的XML文件CortexMicrocontrollerSoftwareInterfaceStandard基于CMSIS-Core的開(kāi)發(fā)結(jié)構(gòu)https:///cmsisCMSIS-Core的標(biāo)準(zhǔn)化工作標(biāo)準(zhǔn)化處理器外設(shè)定義標(biāo)準(zhǔn)化訪問(wèn)處理器特性的訪問(wèn)函數(shù)(有些文獻(xiàn)稱之為應(yīng)用程序接口API)標(biāo)準(zhǔn)化訪問(wèn)特殊指令的函數(shù)標(biāo)準(zhǔn)化系統(tǒng)異常處理程序的函數(shù)名標(biāo)準(zhǔn)化系統(tǒng)初始化的函數(shù)(系統(tǒng)初始化使用“SystemInit()”函數(shù))……CortexMicrocontrollerSoftwareInterfaceStandardCMSIS-Core使用很多針對(duì)Cortex-M的軟件產(chǎn)品都兼容CMSISCMSIS文件被集成在設(shè)備驅(qū)動(dòng)程序庫(kù)中有些文件是ARM提供、對(duì)所有微控制器廠商通用有些文件與廠商設(shè)備相關(guān)的MDKV5開(kāi)發(fā)平臺(tái),用戶應(yīng)用程序需要:startup_<device>.s(startup_stm32f10x_hd.s) 設(shè)備的啟動(dòng)代碼,包括復(fù)位處理程序和異常向量system_<device>.c(system_stm32f10x.c)
設(shè)備的基本配置文件,包括時(shí)鐘和總線設(shè)置<device>.h(stm32f10x.h) 用戶代碼需要的包含文件,用于訪問(wèn)設(shè)備嵌入式應(yīng)用程序的開(kāi)發(fā)方式針對(duì)外設(shè)寄存器直接編程需要詳細(xì)掌握各個(gè)寄存器、費(fèi)時(shí)耗力但能夠深入理解原理,通常代碼簡(jiǎn)潔高效適合C51等比較簡(jiǎn)單的8位單片機(jī)(微控制器)基于廠商提供的驅(qū)動(dòng)程序庫(kù)進(jìn)行開(kāi)發(fā)簡(jiǎn)單快捷、兼容性好、便于移植,但代碼略多32位STM32微控制器結(jié)構(gòu)比較復(fù)雜直接從寄存器入手會(huì)很困難建議初學(xué)者從驅(qū)動(dòng)程序庫(kù)入手逐漸深入到寄存器編程STM32驅(qū)動(dòng)程序庫(kù)(標(biāo)準(zhǔn)外設(shè)固件庫(kù))ST公司為使用STM32提供的函數(shù)接口開(kāi)發(fā)人員通過(guò)調(diào)用庫(kù)函數(shù)配置STM32寄存器STM32庫(kù)是以函數(shù)源代碼形式提供的函數(shù)接口庫(kù)函數(shù)是直接對(duì)寄存器編程非常好的實(shí)例通過(guò)閱讀學(xué)習(xí)這些官方庫(kù)函數(shù)不僅能夠深入理解STM32工作原理同時(shí)也是進(jìn)一步熟練掌握C語(yǔ)言的極佳機(jī)會(huì)直接對(duì)寄存器編程,也可利用其頭文件STM32F10xStandardPeripheralsFirmwareLibrarySTM32庫(kù)-基本代碼文件stm32f10x.hSTM32寄存器地址、結(jié)構(gòu)體類型定義的底層頭文件使用STM32庫(kù)的應(yīng)用程序都要引用(包含)該文件system_stm32f10x.c(system_stm32f10x.h)定義核心時(shí)鐘變量、設(shè)置系統(tǒng)時(shí)鐘和總線時(shí)鐘等的源程序文件startup_stm32f10x_??.s啟動(dòng)文件,“??”表示不同類型STM32微控制器MDKV5通過(guò)“運(yùn)行環(huán)境管理”添加到項(xiàng)目中STM32-外設(shè)驅(qū)動(dòng)程序文件StdPeriph_Driver\src子目錄驅(qū)動(dòng)程序的源文件stm32f10x_ppp.cStdPeriph_Driver\inc子目錄驅(qū)動(dòng)程序的頭文件stm32f10x_ppp.hMDKV5通過(guò)“運(yùn)行環(huán)境管理”添加到項(xiàng)目中STM32標(biāo)準(zhǔn)外設(shè)名稱-1縮寫(xiě)ppp
外設(shè)名稱adcbkpcanceccrcdacdbgmcudmaextiflashfsmcA/D轉(zhuǎn)換器備份寄存器CAN控制器局域網(wǎng)消費(fèi)電子控制CRC計(jì)算單元D/A轉(zhuǎn)換器MCU調(diào)試模塊DMA控制器外部中斷/事件控制器閃存靈活的靜態(tài)存儲(chǔ)器控制器STM32標(biāo)準(zhǔn)外設(shè)名稱-2縮寫(xiě)ppp
外設(shè)名稱gpioi2ciwdgpwrrccrtcsdiospitimusartwwdg通用I/O端口I2C總線接口獨(dú)立看門(mén)狗電源控制復(fù)位和時(shí)鐘控制器實(shí)時(shí)時(shí)鐘SD存儲(chǔ)卡接口SPI串行外設(shè)接口定時(shí)器通用同步異步收發(fā)器窗口看門(mén)狗C語(yǔ)言的數(shù)據(jù)類型ARM處理器C數(shù)據(jù)類型C99標(biāo)準(zhǔn)位數(shù)Bytecharint8_tuint8_t8Halfwordshortint16_tuint16_t16Wordint,longint32_tuint32_t32Doublewordlonglongint64_tuint64_t64intN_t有符號(hào)整數(shù),uintN_t無(wú)符號(hào)整數(shù)C語(yǔ)言的位操作
a&=~(1<<6);//位與實(shí)現(xiàn)復(fù)位
//將整型變量a的D6位清零、其他位不變
a|=(1<<6);//位或?qū)崿F(xiàn)置位
//將整型變量a的D6位置位、其他位不變
a^=(1<<6);//位異或?qū)崿F(xiàn)求反
//將整型變量a的D6位取反、其他位不變運(yùn)算符含義示例(假設(shè)為char類型)&位與0x69&0x55→0x41|位或0x69|0x55→0x7D~位非~0x69→0x96^位異或0x69^0x55→0x3CI/O接口和外設(shè)的訪問(wèn)外設(shè)單獨(dú)編排地址主存空間I/O空間FFFFF0FFFF主存部分I/O部分存儲(chǔ)器空間00000FFFFF外設(shè)與存儲(chǔ)器統(tǒng)一編址外設(shè)寄存器的訪問(wèn)I/O接口寄存器通過(guò)存儲(chǔ)器地址訪問(wèn)C語(yǔ)言使用指針訪問(wèn)這些外設(shè)寄存器“volatile”類型修飾符必不可少volatile說(shuō)明的變量表示是隨時(shí)可能發(fā)生變化的每次操作需要直接訪問(wèn)地址單元獲取最新的數(shù)據(jù)編譯器不能進(jìn)行編譯優(yōu)化外設(shè)寄存器的訪問(wèn)都需要進(jìn)行如此限定
/*定義*/#defineGPIOA_CRL(*((volatileunsignedlong*)(0x40010800)))
/*使用*/GPIOA_CRL=0;外設(shè)寄存器的結(jié)構(gòu)類型外設(shè)具有多個(gè)寄存器可以定義成為結(jié)構(gòu)類型每個(gè)寄存器是結(jié)構(gòu)成員定義結(jié)構(gòu)體變量(指針)通過(guò)結(jié)構(gòu)成員訪問(wèn)寄存器/*定義*/typedef
struct{__IOuint32_tCRL;__IOuint32_tCRH;__IOuint32_tIDR;__IOuint32_tODR;__IOuint32_tBSRR;__IOuint32_tBRR;__IOuint32_tLCKR;}GPIO_TypeDef;/*使用*/
GPIO_TypeDef
GPIOx;
GPIOx.CRL=0;
GPIO_TypeDef*GPIOx;
GPIOx->CRL=0;#define__IOvolatile外設(shè)基地址的定義定義外設(shè)基地址后,外設(shè) 被定義為指向這個(gè)基地址的結(jié)構(gòu)類型指針#definePERIPH_BASE((uint32_t)0x40000000)...#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)...#defineGPIOA_BASE(APB2PERIPH_BASE+0x0800)#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)該方法應(yīng)用于微控制器驅(qū)動(dòng)程序庫(kù)中4.3復(fù)位和時(shí)鐘控制(RCC)為了讓STM32微控制器工作,需要提供電源電源上電復(fù)位后,接著就需要提供工作時(shí)鐘為了降低功耗,需要對(duì)時(shí)鐘進(jìn)行靈活控制所以,STM32設(shè)計(jì)的時(shí)鐘系統(tǒng)非常復(fù)雜所有振蕩器、PLL、總線配置等屬于
復(fù)位和時(shí)鐘控制(RCC)(ResetandClockControl)電源控制(PWR)系統(tǒng)復(fù)位后,微控制器默認(rèn)處于運(yùn)行模式需要節(jié)省能耗時(shí),進(jìn)入低功耗模式睡眠模式(Sleep
Mode):CPU時(shí)鐘關(guān)閉,所有外設(shè)(包括Cortex-M3核心外設(shè))保持運(yùn)行停止模式(Stop
Mode):基于CPU時(shí)鐘關(guān)閉的睡眠模式、再關(guān)閉外設(shè)時(shí)鐘備用模式(Standby
Mode):基于睡眠模式,再停止1.8V主電源,微控制器處于最低功耗狀態(tài) (備用模式也
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人主材合同范本
- 醫(yī)院規(guī)范用工合同范本
- 與物業(yè)簽訂廣告合同范本
- 浠水購(gòu)房合同范本
- 銀行居間付款合同范本
- 修建鄉(xiāng)村公路合同范本
- 醫(yī)院日常裝飾維修合同范本
- 協(xié)調(diào)服務(wù)合同范本
- 公房買(mǎi)給個(gè)人合同范本
- 上海吊車租用合同范本
- 2024年江蘇農(nóng)牧科技職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及參考答案
- 患者轉(zhuǎn)運(yùn)意外應(yīng)急預(yù)案
- 大學(xué)生國(guó)防教育教案第四章現(xiàn)代戰(zhàn)爭(zhēng)
- 人教版初中化學(xué)實(shí)驗(yàn)?zāi)夸?總表)
- AS9100航空航天質(zhì)量管理體系-要求培訓(xùn)教材
- 第2課+古代希臘羅馬【中職專用】《世界歷史》(高教版2023基礎(chǔ)模塊)
- Q-GDW 11711-2017 電網(wǎng)運(yùn)行風(fēng)險(xiǎn)預(yù)警管控工作規(guī)范
- 《桃樹(shù)下的小白兔》課件
- 電工儀表與測(cè)量(第六版)中職技工電工類專業(yè)全套教學(xué)課件
- 強(qiáng)調(diào)句(完整版)-高三英語(yǔ)市公開(kāi)課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件
- 2022年4月自考00277行政管理學(xué)試題及答案含解析
評(píng)論
0/150
提交評(píng)論