32位單片機LPC11C14學習
GPIOSetDir( PORT0, 1, 0 );
GPIOSetValue() 一個是設置端口方向,一個是設置輸出的值,直接調用就可以了。
如果在片內RAM當中運行代碼并且應用程序需要調用中斷,那么必須將中斷向量重新映射到Flash地址0x0。這樣做是因為所有的異常向量都位于地址0x0及以上。通過將寄存器MEMMAP(位于系統控制模塊當中)配置為用戶RAM模式來實現這一點。
#ifdef __DEBUG_RAM
LPC_SYSCON->SYSMEMREMAP = 0x1;
#else
#ifdef __DEBUG_FLASH
LPC_SYSCON->SYSMEMREMAP = 0x2;
#endif
#endif
ARM 微控制器有一個顯著的特點,就是都可以把時鐘頻率倍頻到很高,具體到多高,每個系列的微控制器都有一個指標,我們現在要學的Cortex-M0內核處理器 LPC1114最高能到50MHz,當然,其它的ARM內核微處理器可以倍頻到更高,現在好多手機都采用了ARM內核處理器,比如賣的很火的諾基亞 5233就是采用了ARM11處理器,ARM11的處理器的主頻為433MHz,比Cortex-M0的50MHz高多了吧!所以Cortex-M0處理器被ARM稱為入門級的內核!
要實現對系統時鐘的配置,時鐘配置圖是必須要看懂的!因為它比文字更具有參考價值,看上這張圖配置時鐘,絕對不會出現漏洞?。ㄎ医ㄗh你把這張圖打印出來貼到你的墻上,我就是這么做的,你看著辦吧?。┙酉聛?,我將一步一步引領你徹底看懂這張“時鐘配置圖”。
注意了,要開始講圖了?。ㄟ@張圖就是數據手冊說的時鐘產生單元:CGU(Clock generationunit))
LPC1114 內部含有3個時鐘振蕩器:系統振蕩器,IRC振蕩器,看門狗振蕩器。系統振蕩器就是需要配合外部晶振工作的振蕩器(這是任何一款單片機都有的);IRC振蕩器就是內部RC振蕩器,就是我在上面“總覽LPC1114”中提到的那個LPC1114一上電就默認選擇的12MHz時鐘振蕩器,它的精度沒有配合外部晶振的系統振蕩器高;看門狗振蕩器就是給看門狗提供的時鐘振蕩器!這么說大家明白了吧,在接下來的敘述里面,一提到系統振蕩器就是指利用外部晶振的時鐘振蕩器,IRC振蕩器就是指LPC1114的內部時鐘振蕩器,可不要搞混了哦!
我們先從圖的中心點看起,找到“主時鐘”三個字,看“主時鐘”的左面,有四條線到了“主時鐘”的框上,這四條線就是“主時鐘”的來源,它們分別是:IRC振蕩器,看門狗振蕩器,倍頻之前的時鐘(sys_pllclkin)和倍頻之后的時鐘(sys_pllclkout)。也就是主時鐘可以在這四個時鐘源當中選擇一個做為主時鐘!通過操縱(人家專業名詞不叫“操縱”,叫“訪問”)“主時鐘源選擇寄存器(MAINCLKSEL)”實現。這個32位的主時鐘源選擇寄存器MAINCLKSEL只用到了兩位(誰讓兩位就可以表示四種狀態呢?。?,剩下的全都是保留位,如下:
位(bit) 符號 值 描述 復位值
1:0 SEL 00 選擇IRC振蕩器 00
01 選擇輸入到PLL之前的時鐘
10 選擇看門狗振蕩器
11 選擇PLL之后的時鐘
31:2 - - 保留 0
看復位值,系統默認情況下就是選擇IRC振蕩器作為系統的主時鐘的。我們為了讓LPC1114發揮出它最大的性能,就喜歡選擇PLL(PLL就是倍頻的意思)后的時鐘,在程序中這樣寫:
SYSCON->MAINCLKSEL = 0x00000003;//主時鐘源選擇PLL后的時鐘
接下來看圖上,找到“系統PLL”方框,看它左面倒梯形方框的左面,有三條線,這三條線就是可以做為倍頻時鐘源的時鐘源。這三個時鐘源分別是:IRC振蕩器,系統振蕩器,看門狗振蕩器。這不就是LPC1114的三個時鐘振蕩器么,原來它們都可以做為PLL的時鐘源!該選擇誰捏?這就要操縱“系統倍頻時鐘源選擇寄存器(SYSPLLCLKSEL)”了。這個32位的寄存器也是只用到了兩位:
(兩位就可以表示四種狀態了,三個狀態當然是綽綽有余?。?/div>
位(bit) 符號 值 描述 復位值
1:0 SEL 00 選擇IRC振蕩器 00
01 選擇系統振蕩器
10 選擇看門狗振蕩器
11 保留
31:2 - - 保留 0
看復位值,系統默認情況下就是選擇IRC振蕩器作為PLL輸入時鐘源的。既然我們外部安插了精確的12M晶振,就是想把它做為時鐘源的,選擇上面表格當中的 01,就是選擇了外部12M晶振?。ㄎ以谙惹疤岬竭^,“系統振蕩器”就是代表外部的晶振,為了防止看的不仔細的朋友存在,我還是再說一遍吧?。?/div>
主站蜘蛛池模板:
信阳市|
宜宾市|
商丘市|
吉首市|
九江市|
肃南|
凤城市|
拜城县|
恭城|
斗六市|
淮南市|
奉化市|
天长市|
海兴县|
大厂|
贵港市|
平舆县|
安陆市|
阿克|
武强县|
吴川市|
和林格尔县|
广元市|
盘山县|
蒙自县|
安泽县|
额尔古纳市|
仙游县|
和硕县|
诸城市|
疏附县|
新绛县|
金华市|
灵宝市|
保山市|
遵义县|
甘孜县|
晋宁县|
简阳市|
祁东县|
南部县|
程序中這樣寫:
SYSCON->SYSPLLCLKSEL = 0x00000001;//PLL時鐘源選擇“系統振蕩器”
當然,操作順序應該是先選擇PLL的時鐘源,再選擇主時鐘源!
到現在,“主時鐘”左面的部分就看完了,接下來看“主時鐘”右面的!
右面部分從上往下看,首先呢,是“系統時鐘分頻器”方框,方框的右面橫線上寫著“系統時鐘”四個字。怎么樣!迷惑了吧!這里方框中所提到的“系統時鐘分頻器”其實就是“系統AHB時鐘分頻器(SYSAHBCLKDIV)”。這個寄存器的名字會把好多人迷惑的!因為這個分頻器可不僅僅給 AHB(LPC1114的AHB只有GPIO,關于什么是AHB,什么是APB,去百度搜一下吧!介紹需要兩頁紙哦!)提供時鐘的,它除了給AHB提供時鐘,還給內核,存儲器以及APB提供時鐘。一定意義上說,它就是“系統時鐘分頻器”了,給這個寄存器寫0,LPC1114就不工作了;給這個寄存器寫 1,LPC1114的系統時鐘就是主時鐘除以1;寫2,LPC1114的系統時鐘就是主時鐘除以2,以此類推!假如把外部晶振倍頻了4倍作為主時鐘,主時鐘就是48MHz,對SYSAHBCLKDIV寫4,系統時鐘就是12MHz。這時候有人就會有疑問了:“神經病啊!既然都倍頻起來了,還要縮小”!其實這是因為有時候我們的電路板上的其它芯片不能夠在很快的頻率下工作,否則就會出錯,比如無線通信芯片NRF24L01的速率就不能超過10MHz,所以某些時候,需要多分頻了。規定最多可以分頻255,所以你就可以想到,這個寄存器只用8位就可以了:
位(bit) 符號 值 描述 復位值
7:0 DIV 00000000 關閉系統時鐘 00000001
00000001 用1除
00000010 用2除
......
......
11111111 用255除
31:8 - - 保留 0
一般情況下,我們寫1,程序如下:(這條語句可以不用寫,因為默認值就是1)
SYSCON->SYSAHBCLKDIV = 0x01;//AHB時鐘分頻值為1
再往下看圖,數一下,有6個分頻器,這6個分頻器是:SSP0分頻器,SSP1分頻器,UART分頻器,SysTick分頻器,看門狗分頻器和CLKOUT引腳分頻器。
這些分頻器寄存器和SYSAHBCLKDIV是一樣的,都是用了8位,都是可以最多分頻255,我這里就不把表格畫出來了,唯一不同的是,這6個分頻器寄存器的復位值為0,而不是1。也就是說,在默認情況下,這些外設都是不工作的(沒有時鐘怎么工作?。┻@完全是為了節能做貢獻,不用就不讓它浪費電,用的時候再開!
看最后兩個分頻器!通過上面的介紹,你現在也可以看懂了,圖上說:看門狗的時鐘源可以有3個來源,不僅僅只有“看門狗振蕩器”可以給它提供,還可以用主時鐘或是IRC振蕩器!多么靈活的LPC1114呀!
LPC1114上的第四引腳是:PIO0_1/CLKOUT/CT32B0MAT2。這個腳可以當做P0.1腳,CLKOUT引腳和32位定時器的輸出腳。CLKOUT引腳,顧名思義,它是用來輸出時鐘的,輸出時鐘有什么用?
用處1:給別的需要時鐘的芯片提供時鐘;
用處2:用示波器觀察此引腳上的頻率可以判斷你寫的時鐘配置程序是否正確。
這個引腳在默認的情況下是P0.1腳,假如你要看看到底有沒有把外部的12MHz晶振倍頻到48MHz,你可以把這只腳配置為CLKOUT引腳,用示波器觀察觀察!
由圖中可知,它可以選擇IRC振蕩器,系統振蕩器,看門狗振蕩器以及主時鐘源作為時鐘源,選擇誰作為它的時鐘源,你就可以看到誰的頻率到底是多少了。
(在下面會給出實現的程序,不要急哦?。┪以浻眠@個腳觀察了一下IRC振蕩器的頻率,值在12.01MHz和12.00MHz之間來回跳!后來又看了一下外部晶振的頻率,穩穩的顯示12.00MHz。
到現在,這張圖就看完了,你也應該看懂了!
除了上面提到的“選擇寄存器”,還需要有“使能寄存器”的配合才能使選擇的時鐘源起作用。下面是一個典型的時鐘配置函數:
關鍵詞:
32位單片機LPC11C1
評論