新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > S3C2440學(xué)習(xí)三(基礎(chǔ)模塊的使用1)

S3C2440學(xué)習(xí)三(基礎(chǔ)模塊的使用1)

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
如果一個(gè)人學(xué)習(xí)一樣?xùn)|西或做一件事,達(dá)到忘我的境界,那么他將變得成功。

①如何實(shí)現(xiàn)UART輸出的?UART使用到的寄存器如下,(1)UART線性控制寄存器ULCONn,(2)UART控制寄存器UCONn,(3)UART FIFO控制寄存器UFCONn,(4)UART MODEM控制寄存器UMCONn,(5)UART 接收發(fā)送狀態(tài)寄存器UTRSTATn,(6)UART 錯(cuò)誤狀態(tài)寄存器UERSTATn,(7)UART FIFO狀態(tài)寄存器UFSTATn,(8)UART MODEM狀態(tài)寄存器UMSTATn,(9)UART發(fā)送緩存寄存器UTXHn,(10)UART接收緩沖寄存器URXHn,(11)UART波特率除數(shù)寄存器UBRDIVn。

本文引用地址:http://m.butianyuan.cn/article/201611/316992.htm

1. 先必須配置好時(shí)鐘頻率,波特率不對(duì)就沒(méi)法通信。后面給一個(gè)時(shí)鐘配置模板。首先UART通信口有6根線,兩根電源線,nCTS/nRTS/TXD/RXD這四根線對(duì)應(yīng)PH0-PH3,先通過(guò)GPHCON它們?cè)O(shè)置成第二功能模式。用”mpll_val = (92<<12)|(1<<4)|(1);“通過(guò)對(duì)MPLLCON設(shè)置系統(tǒng)頻率=400MHz,另外通過(guò)CLKDIVN時(shí)鐘分頻器控制寄存器,UCLK選擇寄存器=0表示UPLL時(shí)鐘設(shè)為48MHz等于UCLK對(duì)USB提供的48MHz,HDIVN=10,同時(shí)CAMDIVN[9]=0,表示HCLK=FCL/4,PDIVN=1,表示PCLK=HCLK/2。好了現(xiàn)在的系統(tǒng)提供的頻率:FCLK=400MHz,HCLK=100MHz,PCLK=50MHz,UCLK=48MHz。

其中CAMDIVN是攝像頭時(shí)鐘分頻器寄存器,DIVN_UPLL[12]=0,這里FCLK=MPLLclock,HDIVN=FCLK/4=100MHz。

2.接下來(lái)要初始化UART,設(shè)置UART FIFO控制寄存器,權(quán)限最低并且關(guān)閉FIFO,關(guān)掉UMCON模式0和模式1,通過(guò)設(shè)置ULCON線性控制寄存器,選擇每幀的數(shù)據(jù)位數(shù)為8位。通過(guò)UCON控制寄存器rUCON0 = 0x245; 選擇讀寫(xiě)UART數(shù)據(jù)緩沖寄存器中斷請(qǐng)求或查詢模式,使能UART對(duì)異常產(chǎn)生中斷。當(dāng)非FIFO模式下發(fā)送緩存變空或在FIFO模式下發(fā)送緩存達(dá)到發(fā)送FIFO觸發(fā)水平,則中斷請(qǐng)求。

3.設(shè)置波特率,通過(guò)UBRDIV0/1/2來(lái)分別設(shè)置波特率。

4.選擇讀取的串口號(hào),實(shí)際上程序里是選擇讀取的。

5.寫(xiě)數(shù)據(jù)采用WrUTXH0(r); WrUTXH0(data);的調(diào)用方式進(jìn)行些數(shù)據(jù)。

6.程序接收,采用接中斷標(biāo)記等待接收數(shù)據(jù)。UTRSTAT0/1/2,移位寄存器移空中斷,再讀取緩沖區(qū)的數(shù)據(jù),通過(guò)獲取的數(shù)據(jù)發(fā)送到超級(jí)終端,于是就能在終端上看到寫(xiě)上的數(shù)據(jù)了。

②如何實(shí)現(xiàn)PWM調(diào)制輸出?

蜂鳴器是由GPB0控制,改腳復(fù)用功能TOUT0即PWM輸出。

1.同上配置好時(shí)鐘分頻,頻率太快沒(méi)法從蜂鳴器聽(tīng)到聲音!

2.設(shè)置TOUT0輸出,即GPBCON的GPB0為設(shè)置為10;然后用TCFG0/TCFG1/TCNTB0/TCMPB0配置PWM輸出頻率,

rTCFG0 &= ~0xff; //這兩條語(yǔ)句設(shè)置設(shè)置定時(shí)器0、1的標(biāo)定值,周期計(jì)數(shù)初值

rTCFG0 |= 15; //prescaler = 15+1

rTCFG1 &= ~0xf; //這個(gè)是選擇MUX輸入到PWM定時(shí)器計(jì)數(shù)時(shí)8分頻

rTCFG1 |= 2; //mux = 1/8

rTCNTB0 = (PCLK>>7)/freq;//定時(shí)器0計(jì)數(shù)緩存寄存器,用來(lái)裝載到減計(jì)數(shù)的初值中,反正定時(shí)器是減計(jì)數(shù)的

rTCMPB0 = rTCNTB0>>1; // 50%用來(lái)和計(jì)數(shù)器中的值做比較,也就用于脈寬調(diào)制

rTCON &= ~0x1f; //定時(shí)器控制寄存器,關(guān)閉死區(qū),自動(dòng)重裝,關(guān)掉逆變器,更新TCNTB0/TCMPB0初值,開(kāi)啟TIMER0

rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0

rTCON &= ~2; //clear manual update bit不再對(duì)TCNTB0/TCMPB0更新.

其實(shí)實(shí)際工作最勤快的TCNT0計(jì)數(shù)器,記錄從PCLK的8分頻脈沖,當(dāng)TCNT0≤TCMPn時(shí)輸出高電平,當(dāng)TCNT0>TCMPn時(shí)輸出低電平。

那么現(xiàn)在的周期到底是多少呢?定時(shí)器輸出時(shí)鐘頻率=PCLK/{prescaler value+1}/{divider value},PCLK=50MHz,那么divider value就是那個(gè)8分頻,進(jìn)過(guò)預(yù)分頻器,prescaler=15,所以頻率=50MHz/16/8=390.625KHz。還有那個(gè)計(jì)數(shù)值是多大,(PCLK>>7)/freq=390625/freq,這里讓freq=10,即T=(1/390625)*39062.5=0.1S,不知道為什么TCNTB這個(gè)值設(shè)置得達(dá)到一定程度就沒(méi)有用了,這里忘了這個(gè)寄存器16位有效65536,再大也沒(méi)有用,改前面的定時(shí)器輸出頻率更有效。

③如何實(shí)現(xiàn)AD采樣?

先通過(guò)ADCCON寄存器來(lái)選擇AD通道,AD轉(zhuǎn)換預(yù)分頻器使能,寫(xiě)入AD轉(zhuǎn)換預(yù)標(biāo)定值(相當(dāng)于這兩項(xiàng)設(shè)定AD轉(zhuǎn)換的頻率),通過(guò)AN0-AN7/YM/YP/XM/XP,怪異的AD轉(zhuǎn)換,在AD轉(zhuǎn)換開(kāi)始后,AD開(kāi)始位會(huì)由1->0,AD轉(zhuǎn)換結(jié)束后,AD結(jié)束標(biāo)記位由0->1,AD轉(zhuǎn)換結(jié)果存放在ADCDATA0寄存器中,S3C2440的AD是10的,可直接從ADCDAT0中取出,那么程序就涉及ADCCON、ADCDATA0,這兩個(gè)主要的寄存器,程序的話直接輸入一個(gè)通道,返回一個(gè)AD值,另外就是AD的時(shí)鐘,在配置系統(tǒng)時(shí)鐘時(shí)選擇分配一個(gè)頻率基準(zhǔn)。IICCON是I2C總線控制寄存器。

④如何實(shí)現(xiàn)IIC讀寫(xiě)?

I2C無(wú)論是硬件還是軟件處理,都是構(gòu)建一個(gè)I2C時(shí)序,滿足硬件通信,最終實(shí)現(xiàn)通信。雖然簡(jiǎn)單還是從寄存器和時(shí)序分析一下,使用到了IICDS這個(gè)寄存器,它是存放寫(xiě)或讀取的IIC器件的首地址,但是必須在開(kāi)啟IIC傳輸前賦值;開(kāi)始IIC通信使用到了IICSTAT寄存器,再通過(guò)IICCON使能IIC控制總線,使能IIC總線的ACK功能、同時(shí)使能Tx/Rx中斷、設(shè)置IICCLK頻率,rIICCON = 0xaf;。目前這個(gè)程序是通過(guò)一個(gè)寄存器來(lái)標(biāo)記狀態(tài),當(dāng)讀取或?qū)懭牒?,程序就?huì)陷入while等待,那么只能通過(guò)中斷,查看具體的狀態(tài),并對(duì)那個(gè)寄存器的值更新,使得程序跳出while。

⑤ADS如何創(chuàng)建工程,如何新建程序,如何編譯如何仿真?

ADS其實(shí)是ARM公司推出的軟件,ADS由命令行開(kāi)發(fā)工具,ARM時(shí)實(shí)庫(kù),GUI開(kāi)發(fā)環(huán)境(Code Warrior和AXD),實(shí)用程序獲得支持軟件組成。命令行開(kāi)發(fā)工具完成源代碼編譯,連接成可執(zhí)行代碼的功能。ARM運(yùn)行時(shí)庫(kù)主要是用來(lái)支持被編譯的C和C++代碼。CodeWarrior for ARM是一套完整的集成開(kāi)發(fā)工具,充分發(fā)揮了ARM RISC的優(yōu)勢(shì),該工具專為基于ARM RISC的處理器而設(shè)計(jì)的。AXD是ARM擴(kuò)展調(diào)試器。

⑥ “C語(yǔ)言”可變數(shù)目變?cè)浚?/p>

宏va_arg()、va_start()和va_end()一起使用,便可以完成向函數(shù)傳入數(shù)目可變的變?cè)僮?。取可變?shù)目變?cè)牡湫屠邮呛瘮?shù)printf()。類型va_list是在中定義的。創(chuàng)建一個(gè)能獲取可變數(shù)目變?cè)暮瘮?shù)的通用過(guò)程:在函數(shù)定義中,可變參數(shù)表之前必須有一個(gè)或多個(gè)已知參數(shù),其中最右者為last_parm。在調(diào)用va_start()時(shí),last_parm名被用作第二個(gè)參數(shù)。任何可變長(zhǎng)度的變?cè)辉L問(wèn)之前,必須先用va_start()初始化變?cè)羔榓rgptr。初始化argptr后,經(jīng)過(guò)對(duì)va_arg()的調(diào)用,以作為下一個(gè)參數(shù)類型的參數(shù)類型,返回參數(shù)。最后取完所有參數(shù)并從函數(shù)返回之前。必須調(diào)用va_end()。由此確保堆棧的正確恢復(fù)。如果未正確使用va_end(),程序可能癱瘓。



關(guān)鍵詞: S3C2440基礎(chǔ)模

評(píng)論


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

關(guān)閉