32位單片機(jī)LPC11C14學(xué)習(xí)
void SysCLK_config(void)
{
uint8 i;
SYSCON->PDRUNCFG &= ~(1<< 5);//系統(tǒng)振蕩器上電
SYSCON->SYSOSCCTRL = 0x00000000;//振蕩器未被旁路,1~20Mhz頻率輸入
for (i = 0; i < 200; i++) __nop();//等待振蕩器穩(wěn)定
SYSCON->SYSPLLCLKSEL = 0x00000001;//PLL時(shí)鐘源選擇“系統(tǒng)振蕩器”
SYSCON->SYSPLLCLKUEN = 0x01;//更新PLL選擇時(shí)鐘源
SYSCON->SYSPLLCLKUEN = 0x00;//先寫(xiě)0,再寫(xiě)1達(dá)到更新時(shí)鐘源的目的
SYSCON->SYSPLLCLKUEN = 0x01;
while (!(SYSCON->SYSPLLCLKUEN &0x01)); //確定時(shí)鐘源更新后向下執(zhí)行
SYSCON->SYSPLLCTRL = 0x00000023; //設(shè)置M=4;P=2;FCLKOUT=12*4=48Mhz
SYSCON->PDRUNCFG &= ~(1<< 7); //PLL上電
while (!(SYSCON->SYSPLLSTAT &0x01)); //確定PLL鎖定以后向下執(zhí)行
SYSCON->MAINCLKSEL = 0x00000003;//主時(shí)鐘源選擇PLL后的時(shí)鐘
SYSCON->MAINCLKUEN = 0x01; //更新主時(shí)鐘源
SYSCON->MAINCLKUEN = 0x00;//先寫(xiě)0,再寫(xiě)1達(dá)到更新時(shí)鐘源的目的
SYSCON->MAINCLKUEN = 0x01;
while (!(SYSCON->MAINCLKUEN &0x01)); //確定主時(shí)鐘鎖定以后向下執(zhí)行
SYSCON->SYSAHBCLKDIV = 0x01;//AHB時(shí)鐘分頻值為1,使AHB時(shí)鐘設(shè)置為48Mhz
}
程序詳解:
在看程序詳解之前,你最好先看一遍程序。
(如果你是一位剛剛從51單片機(jī)接觸ARM單片機(jī)的朋友,你會(huì)發(fā)現(xiàn)這個(gè)函數(shù)里面的語(yǔ)句書(shū)寫(xiě)方式完全和以前寫(xiě)51程序不一樣啊,以前給51的寄存器寫(xiě)值,是用這么一種形式:
SBUF = 0X88;
而現(xiàn)在是用這么一種形式:
SYSCON->MAINCLKSEL=0X00000001;
這里為什么不直接寫(xiě)成:
MAINCLKSEL=0X00000001;
這其實(shí)是因?yàn)樵贜XPLPC11XX.H文件中對(duì)系統(tǒng)寄存器的定義采用了結(jié)構(gòu)體(Struct)的形式?,F(xiàn)在,你可以在打開(kāi)51單片機(jī)寄存器的定義文件REG51.H文件看一下,它對(duì)寄存器的地址定義是這樣的:
sfr SBUF = 0x99;
現(xiàn)在你再打開(kāi)一下LPC1114對(duì)寄存器地址定義的NXPLPC11XX.H文件!全都是結(jié)構(gòu)體的定義,而且是純C語(yǔ)言寫(xiě)的,再也找不到“sfr”這樣的C51語(yǔ)言了。關(guān)于NXPLPC11XX.H文件請(qǐng)看瑞嵌制作的《NXPLPC11XX.H文件詳解》。)
(在以后的程序中,我們會(huì)經(jīng)??吹?=~(1<<3)和|=(1<<3);這樣的句子,這些句子是對(duì)位操作用的。因?yàn)槲覀兘?jīng)常要對(duì)32位寄存器的某一位操作,還同時(shí)不影響其它位的值,所以才有了上面這樣的形式。比如我們說(shuō)我們要對(duì)某個(gè)寄存器的bit5(注意:可不是第5位,位是從0開(kāi)始的)寫(xiě)0,這樣寫(xiě):
寄存器&=~(1<<5);
對(duì)寄存器的bit5寫(xiě)1,這樣寫(xiě):
寄存器|=(1<<5);
現(xiàn)在運(yùn)用你的C語(yǔ)言知識(shí)分析一下,把十進(jìn)制的1寫(xiě)成二進(jìn)制32位數(shù)就是:
00000000000000000000000000000001
(1<<5)就是把1右移5下,左面補(bǔ)零,執(zhí)行完這句話(huà)以后數(shù)就變成:
00000000000000000000000000100000
~(1<<5)就是再把這個(gè)數(shù)反相:
11111111111111111111111111011111
最后呢!再把這個(gè)數(shù)&給寄存器,&的操作即是遇到0與1等于0,1與0或1都還是1,所以執(zhí)行完以后,除了bit5被改成了0,其它的位都沒(méi)有變。按照相同的方法,你可以分析一下對(duì)bit5寫(xiě)1的操作。)
現(xiàn)在,我們首先來(lái)看一下函數(shù)里的第一個(gè)語(yǔ)句是對(duì)PDRUNCFG寄存器操作,如果你的英語(yǔ)好的話(huà),一眼就看出來(lái)這個(gè)寄存器是干嘛的了,就是“掉電配置寄存器”,之所以不叫“上電配置寄存器”是因?yàn)樗菍?duì)某位寫(xiě)“1”掉電,寫(xiě)“0”上電。這個(gè)寄存器的描述請(qǐng)看官方數(shù)據(jù)手冊(cè)第三章。看這個(gè)寄存器的bit5,該位控制著系統(tǒng)振蕩器的上電與掉電,默認(rèn)是1,就是掉電狀態(tài),我們既然已經(jīng)決定了要用外部晶振作為時(shí)鐘源,那么現(xiàn)在就該把它上電了,于是就有了這條語(yǔ)句。
接下來(lái)這條語(yǔ)句是對(duì)SYSOSCCTRL寄存器操作,這個(gè)寄存器叫做“系統(tǒng)振蕩器控制寄存器”。(在后面的學(xué)習(xí)中,你會(huì)經(jīng)??吹?,系統(tǒng)內(nèi)部的模塊需要好幾道門(mén)檻配置以后才能用,除了上電,還得控制,有的還需要再允許一下。這樣做看似麻煩,其實(shí)靈活?。┫到y(tǒng)控制寄存器只用了2個(gè)bit,bit0控制著系統(tǒng)振蕩器有沒(méi)有被旁路,bit1要根據(jù)外部晶振的值是多少來(lái)寫(xiě)1或0。先說(shuō)bit0,“被旁路”的意思就是“讓它不起作用”;“未被旁路”的意思就是“沒(méi)有讓它不起作用”。寫(xiě)0表示“未被旁路”,寫(xiě)1表示“被旁路”。那么什么時(shí)候被旁路呢?答:在有外部的“直接時(shí)鐘源”的時(shí)候。如果你51單片機(jī)學(xué)的很棒的話(huà),你現(xiàn)在就應(yīng)該明白了,不明白的那就聽(tīng)我給你解釋吧。其實(shí)51單片機(jī)也有不利用外部晶振而是利用“直接時(shí)鐘源”的時(shí)候,電路圖是這個(gè)樣子的:
這里我們不需要旁路晶振,所以對(duì)該位寫(xiě)0。bit1是根據(jù)外部晶振的值來(lái)定的,對(duì)該位寫(xiě)0表示外部晶振頻率值在1~20MHz范圍內(nèi),寫(xiě)1表示外部晶振頻率值在15~50MHz范圍內(nèi)。在我們的開(kāi)發(fā)板上用的晶振為12MHz,所以對(duì)該位寫(xiě)0。
再往下是一條短暫延時(shí)程序,利用__nop();實(shí)現(xiàn)。給它一點(diǎn)時(shí)間完成任務(wù)。
再接下來(lái)的5條語(yǔ)句你可以把它看成一個(gè)整體,對(duì)PLL時(shí)鐘源的更新都是這個(gè)樣子的。關(guān)于SYSPLLCLKSEL寄存器,前面已經(jīng)講過(guò)了。 SYSPLLCLKUEN是PLL時(shí)鐘源更新允許寄存器,根據(jù)官方數(shù)據(jù)手冊(cè)上的規(guī)定,要想實(shí)現(xiàn)更新,需要對(duì)該寄存器toggle一下,也就是對(duì)該寄存器先寫(xiě)0,再寫(xiě)1。while語(yǔ)句等待我們剛才寫(xiě)的1運(yùn)輸?shù)絊YSPLLCLKUEN里面。時(shí)鐘源的更新往往是需要一定時(shí)間的。
接下來(lái),就該把選擇的時(shí)鐘源翻倍了。SYSPLLCTRL是系統(tǒng)倍頻控制寄存器,通過(guò)它可以確定倍頻的倍數(shù)。倍頻器是一個(gè)很有特點(diǎn)的東西。它除了可以用在單片機(jī)當(dāng)中,還可以用在好多需要它的地方,比如射頻無(wú)線(xiàn)芯片當(dāng)中可以用它來(lái)提高發(fā)射功率。倍頻器運(yùn)用了模擬電子技術(shù)和數(shù)字電子技術(shù)。有時(shí)集成到芯片當(dāng)中,有時(shí)單獨(dú)做成一塊芯片!關(guān)于LPC1114的倍頻器(PLL)的詳細(xì)描述,請(qǐng)看官方數(shù)據(jù)手冊(cè)第三章第九節(jié)。SYSPLLCTRL的bit0~bit4確定M 值,bit5和bit6確定P值,bit7是DIRECT位,bit8是BYPASS位。其它位保留。bit7和bit8我們現(xiàn)在還不深究(要深究的話(huà),還需要好好學(xué)習(xí)倍頻器的結(jié)構(gòu)),只需要知道它倆是來(lái)控制PLL的工作模式的,我們一般讓PLL工作在“普通模式”下,保持這倆位的默認(rèn)值就可以。那么現(xiàn)在只剩M和P了。在普通模式下,PLL輸出頻率的計(jì)算公式如下所示:
看到上式,你可能會(huì)產(chǎn)生一個(gè)疑問(wèn):直接用M乘以PLL的輸入頻率Fclkin不行嗎?答案當(dāng)然不行!為什么要確定P值呢?這個(gè)是PLL的機(jī)構(gòu)決定的,在普通模式下,輸出頻率實(shí)際上是由FCCO產(chǎn)生的,而為了能讓PLL正常工作,F(xiàn)CCO需要在156~320MHz之間?,F(xiàn)在,我們知道PLL的輸入頻率 Fclkin的值為12MHz,LPC1114的允許最大工作頻率為50MHz,現(xiàn)在我們只能把它倍頻四倍到48MHz了,所以M值定位4。根據(jù)數(shù)據(jù)手冊(cè)上的規(guī)定,P可以定為四個(gè)值,即1,2,4,8。這里只有當(dāng)P=2的時(shí)候,F(xiàn)CCO的值為48*2*2=192,在156~320之間。所以,我們一般情況下,就選M=4,P=2了。SYSPLLSTAT是倍頻狀態(tài)寄存器,專(zhuān)門(mén)用來(lái)看PLL有沒(méi)有鎖定的,它是一個(gè)只讀寄存器。
再往下的5條語(yǔ)句是更新主時(shí)鐘用的。和上面提到的更新PLL時(shí)鐘的語(yǔ)句如出一轍,我就不多講了,相信大家現(xiàn)在已經(jīng)能看懂了!
該函數(shù)的最后一句話(huà),就是給SYSAHBCLKDIV寫(xiě)1,確定分頻值為1。這個(gè)寄存器在前面已經(jīng)很詳細(xì)的講過(guò)了,這里就不啰嗦了!
到此!這個(gè)函數(shù)就都講完了。很好理解吧!這個(gè)函數(shù)就是每個(gè)工程里main函數(shù)里都會(huì)出現(xiàn)的初始化函數(shù)了。而且是必須的!為了使用方便,我已經(jīng)把這個(gè)函數(shù)放到了NXPLPC11XX.C文件里面,在你寫(xiě)的main函數(shù)里直接調(diào)用函數(shù)名就可以了。
關(guān)鍵詞:
32位單片機(jī)LPC11C1
相關(guān)推薦
技術(shù)專(zhuān)區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車(chē)電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論