




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第2章LPC1700系列微控制器硬件體系結構第2章-LPC1700系列微控制器硬件體系結構1.處理器簡介芯片引腳介紹3.4.功率控制5.引腳連接模塊本章內容第一節 LPC1700系列微控制器簡介概述 LPC1700系列芯片是恩智浦推出的基于ARM Cortex-M3內核的微控制器,用于處理要求高度集成和低功耗的嵌入式應用。LPC1700系列微控制器的操作頻率可達100MHz。LPC1700系列微控制器的外設組件包含:高達512KB的Flash存儲器、64KB的數據存儲器、以太網MAC、USB主機/從機/OTG接口、8通道DMA控制器、4個UART、2條CAN通道、2個SSP控制器、1個SPI接
2、口、3個I2C接口、2輸入和2輸出的I2S接口、8通道的12位ADC、10位DAC、LPC1700系列微控制器的外設組件包含:電機控制PWM、正交編碼器接口、4個通用定時器、6輸出的通用PWM、帶有獨立電池供電的超低功耗RTC多達70個的通用IO管腳。表2-1 LPC1700系列器件選型列表第二節 LPC1768芯片引腳介紹概述 要了解控制器必須先從其引腳分布入手,在LPC1700系列微控制器中,LPC1768是功能相對最全的一款微控制器,一共100個引腳,大部分引腳都有第二,第三和第四功能。LPC1768處理器的全部引腳描述見P17-P26表2-1所示所有100個引腳可以分為5類: 1. 1
3、. 電源引腳電源引腳 電源引腳主要分為數字電源VDD(3V3)和數字地VSS、模擬電源VDDA和模擬地VSSA、ADC部分參考電壓VREFP和VREFN、調節器電源VREG(3V3)、RTC電源引腳VBAT。這些引腳應該接對應的電源電壓,模擬電源和數字電源應該獨立供電。 2. . 復位引腳復位引腳 復位引腳主要有兩個,一個是RESET,用于外部復位輸入,該引腳為低電平時將器件復位,并使I/O口和外設恢復默認狀態,處理器從地址0開始執行。另一個是RSTOUT,該引腳上的低電平表示LPC1700系列微控制器處于復位狀態。所有100個引腳可以分為5類: 3. . 時鐘引腳時鐘引腳 時鐘引腳主要有兩類
4、:一個是主振蕩器的時鐘引腳:XTAL1和XTAL2;另一個是RTC振蕩器的時鐘引腳:RTCX1和RTCX2。還有一個引腳CLKOUT和復用,可以輸出處理器內部的各種時鐘,方便用戶調試使用。 4. . 仿真引腳仿真引腳 仿真引腳也是分成了三類:一類是常用的JATG接口,使用TDO、TDI、TMS、TRST、TCK和RTCK這幾個引腳;一類是SWD接口,使用SWO、SWDIO和SWDCLK這三個引腳;一類是跟蹤接口,使用TRACEDA3、TRACEDA2、TRACEDA1、TRACEDA0和TRACECLK這幾個引腳。所有100個引腳可以分為5類: 5. GPIO. GPIO引腳引腳 對于LPC1
5、768芯片而言,一共有70個GPIO引腳,通常和其他外設功能共用,分成了P0、P1、 P2、P3和P4等5組。其中和作為USB的數據口,在作為普通的GPIO接口時,其方向只能設置為同向,要么同時為輸出方向,要么同時為輸入方向,不能單獨設置。 注意:注意:在LPC1700微控制器中,一共有三個I2C接口,其中I2C0為標準的的I2C總線接口(開漏引腳),而I2C1和I2C2則使用的標準的GPIO引腳。因此當用戶要將I2C0的兩個引腳(SDA0引腳和SCL0引腳)作為GPIO使用時,必須要外接上拉電阻,否則無法輸出高電平。 第三節 時鐘管理概述 時鐘是計算機系統的脈搏,處理器核在一拍接一拍的時鐘驅
6、動下完成指令執行、狀態變換等動作。 外設部件在時鐘的驅動下進行著各種工作,比如串口數據的收發、A/D轉換、定時器計數等。 所以時鐘對于一個計算機系統是至關重要的,通常時鐘系統出現問題也是最致命的,比如振蕩器不起振、振蕩不穩、停振等。 LPC1700系列的時鐘系統結構圖 整個系統時鐘包含三個獨立振蕩器,分別為主振蕩器、內部RC振蕩器和RTC振蕩器。 復位后,處理器自動選擇內部RC振蕩器作為系統的時鐘源,這使得系統能在沒有外部晶振的情況下運行。用戶可以通過軟件方式修改時鐘源選擇寄存器,從而選擇3種振蕩器中的一種作為系統主時鐘源。注意:在切換前必須保證即將使用的時鐘源已經可用。注意:在切換前必須保證
7、即將使用的時鐘源已經可用。三個時鐘源 主振蕩器(外部晶體振蕩器)可作為CPU的時鐘源(不管是否使用PLL0)或者USB模塊的時鐘源。 主振蕩器工作在1MHz25MHz下。該頻率可通過主PLL(PLL0)來提高至CPU操作頻率的最大值。 主振蕩器的輸出稱為OSC_CLK。PLL0輸入引腳上的時鐘稱為PLLCLKIN,ARM處理器的工作時鐘頻率稱為CCLK,當使用主晶振提供時鐘并不激活PLL時,PLLCLKIN和CCLK的值直接相等。主振蕩器 由于芯片操作總是從內部RC振蕩器開始,且主振蕩器在某些應用中并沒有使用,因此主振蕩器只能由軟件請求來啟動。通過把SCS寄存器的OSCEN置位可實現這種操作。
8、 SCS寄存器提供了一個狀態標志(SCS寄存器中的OSCSTAT位),程序可據此得知振蕩器何時可用。待確定振蕩器運行穩定后,軟件可控制切換為主振蕩器模式使其作為系統時鐘源。在啟動主振蕩器之前,頻率范圍必須通過配置SCS寄存器中的OSCRANGE位來選擇。主振蕩器配置系統控制和狀態寄存器(SCS) 內部RC振蕩器(IRC)可用作看門狗定時器的時鐘源,也可以用作驅動PLL0和CPU的時鐘源。 如果使用USB功能或者CAN通信模塊的通信波特率高于100Kbit/s時,IRC的精度達不到要求,因使用外部晶體振蕩器作為系統時鐘源。 IRC的頻率為4MHz,在上電或任何片上復位時,處理器自動選擇IRC作為
9、時鐘源。此后,軟件可將其切換為另一種可用的時鐘源。內部RC振蕩器 1、 LPC1700系列微控制器有三個時鐘源,分別是內部RC振蕩器、主振蕩器和RTC振蕩器,這三個時鐘源都可以來驅動PLL0從而給CPU和片內外設提供時鐘。只有當PLL0斷開連接時,系統才可以安全的切換時鐘源。 2、提供給USB的時鐘源可以是內部RC振蕩器、主振蕩器和RTC振蕩器,可以通過PLL0或者PLL1(只能為主振蕩器)配置頻率。 3、看門狗定時器的時鐘可以由片內外設時鐘PCLK,RTC振蕩器或者主振蕩器或者片內RC振蕩器提供。綜上所述:PLL0時鐘源選擇寄存器 (CLKSRCSEL) LPC1700系列微控制器內部有兩個
10、鎖相環模塊,分別為PLL0和PLL1。 其中PLL0接受輸入的時鐘范圍是32kHz50MHz,而PLL1僅支持10MHz50MHz范圍的輸入時鐘頻率,主要提供給USB使用。鎖相環模塊概述鎖相環位置示意圖鎖相環功能框圖PLL的鎖定過程 CCO的輸出頻率受到“相位頻率檢測”部件的控制,輸出所需頻率的過程不是一蹴而就的,而是一個拉鋸反復的過程。時間(t)輸出頻率(f)預期頻率鎖定CCO的輸出頻率在高低起伏一段時間后漸漸穩定在了預期的頻率值 輸出頻率穩定后即“鎖定”成功 鎖相環計算公式 從上圖我們可以看到,當整個閉環控制系統達到穩定后“相位頻率檢測”部件的兩路輸入信號可以近似看成一樣,因此可以得到下面
11、這個等式: FPLLIN /N = FCCO /2M 講義 式中FPLLIN表示鎖相環的輸入時鐘頻率,FCCO表示電流控制振蕩器(CCO)的輸出頻率,N和M分別是分頻和倍頻系數。鎖相環模塊寄存器描述 與PLL相關的寄存器有四個,其中三個為控制寄存器,還有一個是狀態寄存器。名稱名稱描述描述訪問訪問PLLCONPLL控制寄存器。最新的PLL控制位的保持寄存器。寫入該寄存器的值在有效的PLL饋送序列執行之前不起作用。R/WPLLCFGPLL配置寄存器。最新的PLL配置值的保持寄存器。寫入該寄存器的值在有效的PLL饋送序列執行之前不起作用。R/WPLLSTATPLL狀態寄存器。PLL控制和配置信息的讀
12、回寄存器。如果曾對PLLCON或PLLCFG執行了寫操作,但沒有產生PLL饋送序列,這些值將不會反映PLL的當前狀態。讀取該寄存器提供讀取該寄存器提供了控制了控制PLLPLL和和PLLPLL狀態的真實值。狀態的真實值。ROPLLFEEDPLL饋送寄存器。該寄存器使能裝載PLL控制和配置信息,該配置信息從PLLCON和PLLCFG寄存器裝入實際影響PLL操作的映像寄存器。WO PLL0控制寄存器(PLL0CON) PLL0CON寄存器可以用于使能和連接PLL0,使能PLL0鎖定到當前倍頻器和分配器值設定的頻率上,連接PLL0將使處理器和大多數片內功能都根據PLL0的輸出來工作。 對PLL0CON
13、的更改只有在執行了正確的PLL饋送序列后才生效。PLL0控制寄存器(PLL0CON)PLLC和PLLE的四種組合PLLCPLLCPLLEPLLEPLLPLL功能功能00PLL被關閉,并斷開連接。01PLL被激活但是尚未連接??梢栽赑LOCK0置位后連接。10與00組合相同。避免PLL已連接,當還沒有使能的情況。11PLL已經使能,并連接到處理器作為系統時鐘源。PLL0配置寄存器(PLL0CFG) PLL0CFG寄存器包含PLL0倍頻和分頻值。對PLL0CFG寄存器的更改只有在執行了正確的PLL饋送序列后才生效。PLL0配置寄存器(PLL0CFG)PLL0狀態寄存器(PLL0STAT) PLL0
14、STAT寄存器提供了當前生效的PLL0的工作參數和狀態,這是一個只讀寄存器。 PLL0STAT可能與PLL0CON和PLL0CFG中的值不同,這是因為對PLL0CON和PLL0CFG寄存器的更改只有在執行了正確的PLL饋送序列后才生效。PLL0狀態寄存器(PLL0STAT)PLL0饋送寄存器(PLL0FEED) 必須將正確的饋送序列寫入PLL0FEED寄存器才能使PLL0CON和PLL0CFG寄存器的更改生效。 饋送序列:先寫入0 xAA,再寫入0 x55。時鐘分頻設置 PLL0的輸出經過分頻后供CPU和USB子系統使用(如果使用PLL1,可通過PLL1配置USB的時鐘)。USB子系統總是需要
15、占空比為50%的48MHz時鐘。 CPU時鐘配置寄存器(CCLKCFG) 功能: PLL0輸出時鐘必須要經過分頻才能提供給CPU使用,PLL0輸出的分頻由CCLKCFG寄存器進行控制。當PLL0被旁路時,相當于1分頻。當PLL0正在運行時,輸出必須經過分頻以使CPU時鐘頻率(CCLK)工作在限定的范圍內。CPU時鐘配置寄存器(CCLKCFG)USB時鐘配置寄存器(USBCLKCFG) 功能: USBCLKCFG寄存器控制對PLL0輸出時鐘的分頻,然后提供給USB子系統使用。PLL0的輸出必須被分頻以使USB的時鐘頻率為48MHz,占空比為50%。注意:注意: 該寄存器僅在該寄存器僅在PLL1P
16、LL1禁止時使用。如果禁止時使用。如果PLL1PLL1使能,使能,則則PLL1PLL1的輸出自動用作的輸出自動用作USBUSB時鐘源,且必須配置時鐘源,且必須配置PLL1PLL1為為USBUSB子系統提供正確的子系統提供正確的48MHz48MHz時鐘。時鐘。USB時鐘配置寄存器(USBCLKCFG)PLL0頻率的計算在PLL0計算的過程中主要涉及以下幾個參數:計算步驟確定應用是否需要USB口,并且USB是否由PLL0提供時鐘,USB需要一個準確的50%占空比48MHz的時鐘信號,這就意味著FCCO必須是48MHz的整倍數并且FCCO要相當準確;確定處理器的時鐘頻率CCLK,這可以根據對處理 器
17、的整體要求來確定,外圍器件的時鐘頻率一般低于處理器的頻率,大多數情況取四分之一的處理器頻率; 計算步驟(3) 選擇PLL輸入頻率FIN的值;(4) 計算M和N的值,以產生一個有效且精確的FCCO的頻 率。選取原則:先根據FIN的值以及FCCO的范圍確 定的FCCO值,盡量選取最小的FCCO,以便降低系統 的功耗。然后一一般從一個較小的N值開始,試算M值, 要求得到的N和M值應該是整數,這樣才能保證輸出 頻率的準確性。最后將所需的M值減1(即M-1)寫 入PLL0CFG寄存器的MSEL0字段,將所需的N值減1 (即N-1)寫入PLL0CFG寄存器的NSEL0字段。 相關計算公式 由式我們可以推導
18、出PLL0的輸出頻率公式為: F FCCOCCO = =( 2 2 M M F FININ)/ N (2.2)/ N (2.2)其中:FCCO的范圍: 275MHz550MHz ;FIN的范圍: 32kHz50KHz ; 可通過求解式來得到其它的PLL參數: M = M =(F FCCOCCO N N)/ /(2 2 F FININ) (2.3) (2.3) N = N =(2 2 M M F FININ)/ F/ FCCOCCO (2.4) (2.4) F FIN IN = =(F FCCOCCO N N)/ /(2 2 M M) (2.5) (2.5) 【例【例1 1】 假設在應用中使能P
19、LL0產生CPU時鐘,不用做USB時鐘,PLL0操作范圍:275MHz550MHz,預期的CPU工作頻率為100MHz;使用外部12MHz晶振作為系統時鐘源。請計算M和N的值。 分析:分析:PLL0PLL0操作范圍:操作范圍:275MHz275MHz550MHz550MHz,由于,由于CPUCPU的時鐘為的時鐘為100MHz100MHz,因此輸出的,因此輸出的F FCCOCCO必須是必須是100100的整數倍才方便后面的分頻,的整數倍才方便后面的分頻,F FCCOCCO的取值只有的取值只有300MHz300MHz,400MHz400MHz和和500MHz. 500MHz. 我們盡量從最低的我們
20、盡量從最低的F FCCOCCO開始開始,以減少系統的功耗,同時從,以減少系統的功耗,同時從N=1N=1(一般從一個較小的(一般從一個較小的N N值開始測試值開始測試,看是否,看是否MM能得到整數值。能得到整數值。解:解:當N=1時,將FCCO=300,FIN=12帶入式(2.3) ,得到M=12.5;當N=2時,將FCCO=300,FIN=12帶入式(2.3) ,得到M=25; 在N=2時就得到了整數值M=25,因此最終結果N=2,M=25,將M-1寫入PLL0CFG寄存器的MSEL0字段,將N-1寫入PLL0CFG寄存器的NSEL0字段,即最后PLL0CFG = 0 x00010018。同時
21、CCLK輸出的分頻系數設置為3(寫入寄存器的值為2)即可完成配置?!纠纠? 2】假設在應用中使用USB接口并且由PLL0驅動。在PLL操作范圍(275MHz550MHz)內,96MHz的最小整數倍頻值為288MHz;預期的CPU工作頻率為96MHz;使用外部12MHz晶振作為系統時鐘源。請計算M和N的值。 分析:由于要通過由于要通過PLL0PLL0提供提供USBUSB接口的時鐘,接口的時鐘,USBUSB接口的時鐘要求接口的時鐘要求為為48MHz48MHz,而且只有三種分頻選擇:,而且只有三種分頻選擇:6 6分頻(分頻(F FCCOCCO為為288MHz288MHz),),7 7分頻分頻(F
22、FCCOCCO為為384MHz384MHz)和)和8 8分頻(分頻(F FCCOCCO為為480MHz480MHz),同時),同時CPUCPU的時鐘為的時鐘為96MHz96MHz,因此的輸出頻率,因此的輸出頻率F FCCOCCO必須是必須是9696的整數倍,綜合二者考慮,的整數倍,綜合二者考慮,我們只有三個我們只有三個F FCCOCCO的值選擇:的值選擇:288MHz288MHz、384MHz384MHz和和480MHz480MHz,我們從最,我們從最低的頻率低的頻率288MHz288MHz開始測試。開始測試。解:解:當N=1時,將FCCO=288,FIN=12帶入式(2.3) ,得到M=12
23、;在N=1時就得到了整數值M=12,因此最終結果N=1,M=12。 將M-1寫入PLL0CFG寄存器的MSEL0字段,將N-1寫入PLL0CFG寄存器的NSEL0字段,即最后PLL0CFG = 0 x0000000B。同時CCLK輸出的分頻系數設置為3 (寫入寄存器的值為2) ,USBCLK輸出的分頻系數設置為6即可完成配置(寫入寄存器的值為5)。 功能: CCLK經過外設時鐘分頻器分頻后再供給各個外設使用,由于每個外設都有各自獨立的分頻器,因此不同的外設可以工作在不同的頻率下,這樣就使用戶可以根據實際需要降低某些外設的工作頻率,達到最佳的性能和功耗比。在外設時鐘選擇寄存器中,每兩位控制一個外
24、設的時鐘分頻設置。 外設時鐘選擇寄存器(PCLKSEL0和PCLKSEL1)外設時鐘選擇寄存器(PCLKSEL0和PCLKSEL1)分頻設置 概述: 為了便于系統測試和開發,LPC1700系列微控制器的任何一個內部時鐘均可作為外部時鐘源輸出,通過CLKOUT講義引腳測試。輸出外部時鐘源選擇(CLKOUTCFG)時鐘輸出配置寄存器( CLKOUTCFG )注意:對于大多數時鐘源可進行1分頻。當選擇CPU時鐘且該時鐘高于50MHz時,輸出必須經過分頻,使得頻率在適當的范圍內。時鐘設置初始化流程時鐘設置初始化程序實例#define CLOCK_SETUP 1 / 時鐘配置使能#define SCS_
25、Val 0 x00000020 / 主振蕩器使能,頻率范圍1MHz20MHz#define CLKSRCSEL_Val 0 x00000001 / 選擇主振蕩器為PLL0時鐘源#define PLL0_SETUP 1 / PLL0配置使能#define PLL0CFG_Val 0 x00010018 / N=2,M=25#define PLL1_SETUP 1 / PLL1配置使能#define PLL1CFG_Val 0 x00000023 / P=2,M=4#define CCLKCFG_Val 0 x00000002 / PLL0輸出3分頻后給CPU=100MHz#define USBC
26、LKCFG_Val 0 x00000005 / PLL0輸出6分頻后給USB,注意:該 / 配置只有在PLL1沒有使能的情況才有用時鐘設置初始化程序實例#define PCLKSEL0_Val 0 x00000000 / 外設時鐘采用默認值為,CPU時鐘的4分頻#define PCLKSEL1_Val 0 x00000000 #define PCONP_Val 0 x042887DE / 采用默認的功率控制值#define CLKOUTCFG_Val 0 x00000000 / 不使用CLKOUT引腳輸出內部時鐘#define XTAL (1202X000UL) / 主振蕩器12MHz #de
27、fine RTC_CLK ( 32768UL) / RTC時鐘32768Hz#define IRC_OSC ( 4000000UL) / 片內RC振蕩器4MHz注意:UL表示unsigned long 表示32位字長,還有ULL表示unsigned long long 表示64位字長,在MDK中unsigned long 和unigned int 都表示32位字長 時鐘設置初始化程序實例void SystemInit (void) #if (CLOCK_SETUP) / 宏定義是否使能時鐘配置 LPC_SC-SCS = SCS_Val; / 選擇主振蕩器為PLL0時鐘源 if (LPC_SC-
28、SCS & (1 SCS & (1CCLKCFG = CCLKCFG_Val; / 設置CPU時鐘分頻系數 LPC_SC-PCLKSEL0 = PCLKSEL0_Val; / 設置外設時鐘分頻系數 LPC_SC-PCLKSEL1 = PCLKSEL1_Val; LPC_SC-CLKSRCSEL = CLKSRCSEL_Val; / 選擇PLL0的時鐘源為主振蕩器 時鐘設置初始化程序實例#if (PLL0_SETUP) / PLL0配置使能 LPC_SC-PLL0CFG = PLL0CFG_Val; / 設置PLL0參數 LPC_SC-PLL0FEED = 0 xAA; / 送入饋送序列,使修改
29、生效 LPC_SC-PLL0FEED = 0 x55; LPC_SC-PLL0CON = 0 x01; / 使能PLL0 LPC_SC-PLL0FEED = 0 xAA; / 送入饋送序列,使修改生效 LPC_SC-PLL0FEED = 0 x55; while (!(LPC_SC-PLL0STAT & (1PLL0CON = 0 x03; / 使能PLL0并連接PLL0 LPC_SC-PLL0FEED = 0 xAA; / 送入饋送序列,使修改生效 LPC_SC-PLL0FEED = 0 x55; / 讀回PLL0狀態位,判斷是否PLL0使能并連接 while (LPC_SC-PLL0STA
30、T & (125) | (124) != (125) | (1PLL1CFG = PLL1CFG_Val; / 設置PLL1參數 LPC_SC-PLL1FEED = 0 xAA; / 送入饋送序列,使修改生效 LPC_SC-PLL1FEED = 0 x55; LPC_SC-PLL1CON = 0 x01; / 使能PLL1 LPC_SC-PLL1FEED = 0 xAA; / 送入饋送序列,使修改生效 LPC_SC-PLL1FEED = 0 x55; while (!(LPC_SC-PLL1STAT & (1PLL1CON = 0 x03; / 使能PLL0并連接PLL0 LPC_SC-PLL
31、1FEED = 0 xAA; / 送入饋送序列,使修改生效 LPC_SC-PLL1FEED = 0 x55; / 讀回PLL1狀態位,判斷是否PLL1使能并連接 while (LPC_SC-PLL1STAT & (1 9) | (1 8) != (1 9) | (1USBCLKCFG = USBCLKCFG_Val;: #endif時鐘設置初始化程序實例 LPC_SC-PCONP = PCONP_Val; / 片內外設的功率控制配置 LPC_SC-CLKOUTCFG = CLKOUTCFG_Val; / CLKOUT引腳輸出內部時鐘的配置 #endif計算具體時鐘程序 /* * Determi
32、ne clock frequency according to clock register values */ if (LPC_SC-PLL0STAT 24)&3)=3) /* If PLL0 enabled and connected */ switch (LPC_SC-CLKSRCSEL & 0 x03) case 0: /* Internal RC oscillator = PLL0 */ case 3: /* Reserved, default to Internal R*/ /計算實際系統主時鐘:96MHZ SystemFrequency = (IRC_OSC * (2 * (LP
33、C_SC-PLL0STAT & 0 x7FFF) + 1) / / M=16 (LPC_SC-PLL0STAT 16) & 0 xFF) + 1) / / N=1 (LPC_SC-CCLKCFG & 0 xFF)+ 1); / 主時鐘分頻 4分頻 break; 計算具體時鐘程序case 1: /* Main oscillator = PLL0 */ SystemFrequency = (OSC_CLK * (2 * (LPC_SC-PLL0STAT & 0 x7FFF) + 1) / (LPC_SC-PLL0STAT 16) & 0 xFF) + 1) / (LPC_SC-CCLKCFG &
34、0 xFF)+ 1); break; case 2: /* RTC oscillator = PLL0 */ SystemFrequency = (RTC_CLK * (2 * (LPC_SC-PLL0STAT & 0 x7FFF) + 1) / (LPC_SC-PLL0STAT 16) & 0 xFF) + 1) / (LPC_SC-CCLKCFG & 0 xFF)+ 1); break; 計算具體時鐘程序else switch (LPC_SC-CLKSRCSEL & 0 x03) case 0: /* Internal RC oscillator = PLL0 */ case 3: /*
35、Reserved,default to Internal RC*/ SystemFrequency = IRC_OSC / (LPC_SC-CCLKCFG & 0 xFF)+ 1); break; case 1: /* Main oscillator = PLL0 */ SystemFrequency = OSC_CLK / (LPC_SC-CCLKCFG & 0 xFF)+ 1); break; case 2: /* RTC oscillator = PLL0 */ SystemFrequency = RTC_CLK / (LPC_SC-CCLKCFG & 0 xFF)+ 1); break
36、; 補充:頭文件對寄存器的封裝 typedef struct _IO uint32_t FLASHCFG; /* Flash Accelerator Module */ uint32_t RESERVED031; _IO uint32_t PLL0CON; /* Clocking and Power Control */ _IO uint32_t PLL0CFG; _I uint32_t PLL0STAT; _O uint32_t PLL0FEED; uint32_t RESERVED14; _IO uint32_t PLL1CON; _IO uint32_t PLL1CFG; _I uint
37、32_t PLL1STAT; _O uint32_t PLL1FEED; LPC_SC_TypeDef;回顧:結構體定義方式: 方式1:先定義結構體名,再定義變量struct 結構名結構名成員表列成員表列如:struct stuint num;char name20;int age;然后用結構體名去定義變量:struct stu boy1,boy2;回顧:結構體定義方式: 方式2:定義結構體名的同時定義結構體變量struct stuint num;char name20;int age;boy1,boy2; 或者:不定義結構體名直接定義結構體變量structint num;char name2
38、0;int age;boy1,boy2; 補充:頭文件對寄存器的封裝 由于在結構體變量內部的存儲空間是連續的,成員變量都是以32位來定義,及每個變量占用內存空間四個字節,因此假設首地址為0 x100001000,則后面的地址依次加4個字節。 該結構體的第一個成員變量FLASHCFG寄存器的地址為0 x400FC000,占用空間0 x400FC000-0 x400FC003然后保留了一個長度為31的數組,數組中每個元素為4字節,該數組占用空間從0 x400FC0040 x400FC07F,下一個成員變量的地址從0 x400FC080開始,剛好是PLL0CON寄存器的物理地址。 在PLL0FEED
39、寄存器和PLL1CON寄存器的物理地址之間相差16個字節,因此在結構體定義里面用uint32_t RESERVED14,保留16個字節空間完成地址的填充。補充:頭文件對寄存器的封裝#define LPC_SC_BASE (LPC_APB1_BASE + 0 x7C000)#define LPC_APB1_BASE (0 x40080000UL)#define LPC_SC (LPC_SC_TypeDef *) LPC_SC_BASE )LPC_SC_BASE=0 x400FC000,剛好是FLASHCFG寄存器的物理地址, (LPC_SC_TypeDef *) LPC_SC_BASE 實際表示
40、一個指針變量,這個指針變量指向的地址為0 x400FC000,或者理解為強制類型轉換,將這個地址變換為指向結構體的指針。補充:頭文件對寄存器的封裝其定義相當于:LPC_SC_TypeDef *P;/ 定義一個指向結構體 / 的指針 P=0 x400FC000; 然后利用 P-成員變量名來訪問各個成員變量 補充:頭文件對寄存器的封裝理解時注意以下四點:1、結構體變量的存儲空間是連續的,變量為32位,每個變量占用四個地址空間;2、用Typedef定義了一個標識符及關鍵字的別名,定義后可以用LPC_SC_Typedef來定義結構體或者結構體指針,它是語言編譯過程的一部分,不分配內存空間;補充:頭文件
41、對寄存器的封裝理解時注意以下四點:3、結構體在類型定義時不分配內存空間,里面的成員變量名稱可以是任意命名,這樣組合的目的主要是在定義變量后形成一個連續的間隔地址。4、定義指針時必須說明指針指向的類型,確保指針在移動時或者讀取值好變化或者讀取所指向的對應類型所占用的字節數,如p+等,而結構體內部的成員變量的地址在結構體首地址確定時就確定了。 補充:頭文件對寄存器的封裝 要使得編譯器能夠識別硬件寄存器的定義,必須要對硬件寄存器進行重新定義。硬件寄存器占用的是一個地址空間,訪問這個地址,一般采用指針的方法。比如,定義PLL0控制器寄存器PLL0CON就采用如下的方法:#define PLL0CON *(volatile unsigned long *
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025倉庫租賃合同書(范本)
- 室內設計交流分享
- T/IAC 8-2017保險業公有云資源管理基本要求
- 浙江省寧波市余姚市余姚中學2024-2025學年高二化學第二學期期末教學質量檢測試題含解析
- 樂都縣第一中學2025屆物理高二第二學期期末學業質量監測試題含解析
- 武漢體育學院體育科技學院《流行病學原理與方法》2023-2024學年第二學期期末試卷
- 南通市重點中學2025屆高二物理第二學期期末調研模擬試題含解析
- 云南省馬關縣第二中學2025年高二化學第二學期期末調研試題含解析
- 四川電子機械職業技術學院《建筑設計基礎別墅》2023-2024學年第二學期期末試卷
- 上海財經大學浙江學院《機械制造技術基礎》2023-2024學年第二學期期末試卷
- 2024年山西高考地理試題及答案 (3) - 副本
- 2023-2024學年人教版八年級下冊數學期末復習試題
- 2024年地理中考重點綜合題答題模板
- 卒中中心宣教管理制度
- 2023年高考語文試卷及答案(浙江卷)
- 2023年一般行業安全負責人和安全員考試題庫
- 《水電水利工程施工監理規范》
- 汽車租賃服務投標方案(技術方案2)
- 工作場所有害因素職業接觸限值-第2部分-物理因素
- 普通家庭裝修預算表(全面細致)
- 畜牧業的動物福利與保護
評論
0/150
提交評論