新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 32位單片機(jī)LPC11C14學(xué)習(xí)

32位單片機(jī)LPC11C14學(xué)習(xí)

作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò) 收藏
功能:(設(shè)置GPIO口方向),參數(shù)(端口號(hào),位,輸入或輸出(0入1出))
GPIOSetDir( PORT0, 1, 0 );
GPIOSetValue() 一個(gè)是設(shè)置端口方向,一個(gè)是設(shè)置輸出的值,直接調(diào)用就可以了。
如果在片內(nèi)RAM當(dāng)中運(yùn)行代碼并且應(yīng)用程序需要調(diào)用中斷,那么必須將中斷向量重新映射到Flash地址0x0。這樣做是因?yàn)樗械漠惓O蛄慷嘉挥诘刂?x0及以上。通過(guò)將寄存器MEMMAP(位于系統(tǒng)控制模塊當(dāng)中)配置為用戶RAM模式來(lái)實(shí)現(xiàn)這一點(diǎn)。
#ifdef __DEBUG_RAM
LPC_SYSCON->SYSMEMREMAP = 0x1;
#else
#ifdef __DEBUG_FLASH
LPC_SYSCON->SYSMEMREMAP = 0x2;
#endif
#endif
ARM 微控制器有一個(gè)顯著的特點(diǎn),就是都可以把時(shí)鐘頻率倍頻到很高,具體到多高,每個(gè)系列的微控制器都有一個(gè)指標(biāo),我們現(xiàn)在要學(xué)的Cortex-M0內(nèi)核處理器 LPC1114最高能到50MHz,當(dāng)然,其它的ARM內(nèi)核微處理器可以倍頻到更高,現(xiàn)在好多手機(jī)都采用了ARM內(nèi)核處理器,比如賣的很火的諾基亞 5233就是采用了ARM11處理器,ARM11的處理器的主頻為433MHz,比Cortex-M0的50MHz高多了吧!所以Cortex-M0處理器被ARM稱為入門級(jí)的內(nèi)核!
要實(shí)現(xiàn)對(duì)系統(tǒng)時(shí)鐘的配置,時(shí)鐘配置圖是必須要看懂的!因?yàn)樗任淖指哂袇⒖純r(jià)值,看上這張圖配置時(shí)鐘,絕對(duì)不會(huì)出現(xiàn)漏洞!(我建議你把這張圖打印出來(lái)貼到你的墻上,我就是這么做的,你看著辦吧?。┙酉聛?lái),我將一步一步引領(lǐng)你徹底看懂這張“時(shí)鐘配置圖”。
注意了,要開(kāi)始講圖了?。ㄟ@張圖就是數(shù)據(jù)手冊(cè)說(shuō)的時(shí)鐘產(chǎn)生單元:CGU(Clock generationunit))
LPC1114 內(nèi)部含有3個(gè)時(shí)鐘振蕩器:系統(tǒng)振蕩器,IRC振蕩器,看門狗振蕩器。系統(tǒng)振蕩器就是需要配合外部晶振工作的振蕩器(這是任何一款單片機(jī)都有的);IRC振蕩器就是內(nèi)部RC振蕩器,就是我在上面“總覽LPC1114”中提到的那個(gè)LPC1114一上電就默認(rèn)選擇的12MHz時(shí)鐘振蕩器,它的精度沒(méi)有配合外部晶振的系統(tǒng)振蕩器高;看門狗振蕩器就是給看門狗提供的時(shí)鐘振蕩器!這么說(shuō)大家明白了吧,在接下來(lái)的敘述里面,一提到系統(tǒng)振蕩器就是指利用外部晶振的時(shí)鐘振蕩器,IRC振蕩器就是指LPC1114的內(nèi)部時(shí)鐘振蕩器,可不要搞混了哦!
我們先從圖的中心點(diǎn)看起,找到“主時(shí)鐘”三個(gè)字,看“主時(shí)鐘”的左面,有四條線到了“主時(shí)鐘”的框上,這四條線就是“主時(shí)鐘”的來(lái)源,它們分別是:IRC振蕩器,看門狗振蕩器,倍頻之前的時(shí)鐘(sys_pllclkin)和倍頻之后的時(shí)鐘(sys_pllclkout)。也就是主時(shí)鐘可以在這四個(gè)時(shí)鐘源當(dāng)中選擇一個(gè)做為主時(shí)鐘!通過(guò)操縱(人家專業(yè)名詞不叫“操縱”,叫“訪問(wèn)”)“主時(shí)鐘源選擇寄存器(MAINCLKSEL)”實(shí)現(xiàn)。這個(gè)32位的主時(shí)鐘源選擇寄存器MAINCLKSEL只用到了兩位(誰(shuí)讓兩位就可以表示四種狀態(tài)呢?。?,剩下的全都是保留位,如下:
位(bit) 符號(hào) 值 描述 復(fù)位值
1:0 SEL 00 選擇IRC振蕩器 00
01 選擇輸入到PLL之前的時(shí)鐘
10 選擇看門狗振蕩器
11 選擇PLL之后的時(shí)鐘
31:2 - - 保留 0
看復(fù)位值,系統(tǒng)默認(rèn)情況下就是選擇IRC振蕩器作為系統(tǒng)的主時(shí)鐘的。我們?yōu)榱俗孡PC1114發(fā)揮出它最大的性能,就喜歡選擇PLL(PLL就是倍頻的意思)后的時(shí)鐘,在程序中這樣寫:
SYSCON->MAINCLKSEL = 0x00000003;//主時(shí)鐘源選擇PLL后的時(shí)鐘
接下來(lái)看圖上,找到“系統(tǒng)PLL”方框,看它左面倒梯形方框的左面,有三條線,這三條線就是可以做為倍頻時(shí)鐘源的時(shí)鐘源。這三個(gè)時(shí)鐘源分別是:IRC振蕩器,系統(tǒng)振蕩器,看門狗振蕩器。這不就是LPC1114的三個(gè)時(shí)鐘振蕩器么,原來(lái)它們都可以做為PLL的時(shí)鐘源!該選擇誰(shuí)捏?這就要操縱“系統(tǒng)倍頻時(shí)鐘源選擇寄存器(SYSPLLCLKSEL)”了。這個(gè)32位的寄存器也是只用到了兩位:
(兩位就可以表示四種狀態(tài)了,三個(gè)狀態(tài)當(dāng)然是綽綽有余?。?/div>
位(bit) 符號(hào) 值 描述 復(fù)位值
1:0 SEL 00 選擇IRC振蕩器 00
01 選擇系統(tǒng)振蕩器
10 選擇看門狗振蕩器
11 保留
31:2 - - 保留 0
看復(fù)位值,系統(tǒng)默認(rèn)情況下就是選擇IRC振蕩器作為PLL輸入時(shí)鐘源的。既然我們外部安插了精確的12M晶振,就是想把它做為時(shí)鐘源的,選擇上面表格當(dāng)中的 01,就是選擇了外部12M晶振?。ㄎ以谙惹疤岬竭^(guò),“系統(tǒng)振蕩器”就是代表外部的晶振,為了防止看的不仔細(xì)的朋友存在,我還是再說(shuō)一遍吧!)
程序中這樣寫:
SYSCON->SYSPLLCLKSEL = 0x00000001;//PLL時(shí)鐘源選擇“系統(tǒng)振蕩器”
當(dāng)然,操作順序應(yīng)該是先選擇PLL的時(shí)鐘源,再選擇主時(shí)鐘源!
到現(xiàn)在,“主時(shí)鐘”左面的部分就看完了,接下來(lái)看“主時(shí)鐘”右面的!
右面部分從上往下看,首先呢,是“系統(tǒng)時(shí)鐘分頻器”方框,方框的右面橫線上寫著“系統(tǒng)時(shí)鐘”四個(gè)字。怎么樣!迷惑了吧!這里方框中所提到的“系統(tǒng)時(shí)鐘分頻器”其實(shí)就是“系統(tǒng)AHB時(shí)鐘分頻器(SYSAHBCLKDIV)”。這個(gè)寄存器的名字會(huì)把好多人迷惑的!因?yàn)檫@個(gè)分頻器可不僅僅給 AHB(LPC1114的AHB只有GPIO,關(guān)于什么是AHB,什么是APB,去百度搜一下吧!介紹需要兩頁(yè)紙哦?。┨峁r(shí)鐘的,它除了給AHB提供時(shí)鐘,還給內(nèi)核,存儲(chǔ)器以及APB提供時(shí)鐘。一定意義上說(shuō),它就是“系統(tǒng)時(shí)鐘分頻器”了,給這個(gè)寄存器寫0,LPC1114就不工作了;給這個(gè)寄存器寫 1,LPC1114的系統(tǒng)時(shí)鐘就是主時(shí)鐘除以1;寫2,LPC1114的系統(tǒng)時(shí)鐘就是主時(shí)鐘除以2,以此類推!假如把外部晶振倍頻了4倍作為主時(shí)鐘,主時(shí)鐘就是48MHz,對(duì)SYSAHBCLKDIV寫4,系統(tǒng)時(shí)鐘就是12MHz。這時(shí)候有人就會(huì)有疑問(wèn)了:“神經(jīng)病??!既然都倍頻起來(lái)了,還要縮小”!其實(shí)這是因?yàn)橛袝r(shí)候我們的電路板上的其它芯片不能夠在很快的頻率下工作,否則就會(huì)出錯(cuò),比如無(wú)線通信芯片NRF24L01的速率就不能超過(guò)10MHz,所以某些時(shí)候,需要多分頻了。規(guī)定最多可以分頻255,所以你就可以想到,這個(gè)寄存器只用8位就可以了:
位(bit) 符號(hào) 值 描述 復(fù)位值
7:0 DIV 00000000 關(guān)閉系統(tǒng)時(shí)鐘 00000001
00000001 用1除
00000010 用2除
......
......
11111111 用255除
31:8 - - 保留 0
一般情況下,我們寫1,程序如下:(這條語(yǔ)句可以不用寫,因?yàn)槟J(rèn)值就是1)
SYSCON->SYSAHBCLKDIV = 0x01;//AHB時(shí)鐘分頻值為1
再往下看圖,數(shù)一下,有6個(gè)分頻器,這6個(gè)分頻器是:SSP0分頻器,SSP1分頻器,UART分頻器,SysTick分頻器,看門狗分頻器和CLKOUT引腳分頻器。
這些分頻器寄存器和SYSAHBCLKDIV是一樣的,都是用了8位,都是可以最多分頻255,我這里就不把表格畫出來(lái)了,唯一不同的是,這6個(gè)分頻器寄存器的復(fù)位值為0,而不是1。也就是說(shuō),在默認(rèn)情況下,這些外設(shè)都是不工作的(沒(méi)有時(shí)鐘怎么工作?。┻@完全是為了節(jié)能做貢獻(xiàn),不用就不讓它浪費(fèi)電,用的時(shí)候再開(kāi)!
看最后兩個(gè)分頻器!通過(guò)上面的介紹,你現(xiàn)在也可以看懂了,圖上說(shuō):看門狗的時(shí)鐘源可以有3個(gè)來(lái)源,不僅僅只有“看門狗振蕩器”可以給它提供,還可以用主時(shí)鐘或是IRC振蕩器!多么靈活的LPC1114呀!
LPC1114上的第四引腳是:PIO0_1/CLKOUT/CT32B0MAT2。這個(gè)腳可以當(dāng)做P0.1腳,CLKOUT引腳和32位定時(shí)器的輸出腳。CLKOUT引腳,顧名思義,它是用來(lái)輸出時(shí)鐘的,輸出時(shí)鐘有什么用?
用處1:給別的需要時(shí)鐘的芯片提供時(shí)鐘;
用處2:用示波器觀察此引腳上的頻率可以判斷你寫的時(shí)鐘配置程序是否正確。
這個(gè)引腳在默認(rèn)的情況下是P0.1腳,假如你要看看到底有沒(méi)有把外部的12MHz晶振倍頻到48MHz,你可以把這只腳配置為CLKOUT引腳,用示波器觀察觀察!
由圖中可知,它可以選擇IRC振蕩器,系統(tǒng)振蕩器,看門狗振蕩器以及主時(shí)鐘源作為時(shí)鐘源,選擇誰(shuí)作為它的時(shí)鐘源,你就可以看到誰(shuí)的頻率到底是多少了。
(在下面會(huì)給出實(shí)現(xiàn)的程序,不要急哦!)我曾經(jīng)用這個(gè)腳觀察了一下IRC振蕩器的頻率,值在12.01MHz和12.00MHz之間來(lái)回跳!后來(lái)又看了一下外部晶振的頻率,穩(wěn)穩(wěn)的顯示12.00MHz。
到現(xiàn)在,這張圖就看完了,你也應(yīng)該看懂了!
除了上面提到的“選擇寄存器”,還需要有“使能寄存器”的配合才能使選擇的時(shí)鐘源起作用。下面是一個(gè)典型的時(shí)鐘配置函數(shù):

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 32位單片機(jī)LPC11C1

評(píng)論


技術(shù)專區(qū)

關(guān)閉