S3C2440學習三(基礎模塊的使用1)
①如何實現(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 錯誤狀態(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://www.ex-cimer.com/article/201611/316992.htm1. 先必須配置好時鐘頻率,波特率不對就沒法通信。后面給一個時鐘配置模板。首先UART通信口有6根線,兩根電源線,nCTS/nRTS/TXD/RXD這四根線對應PH0-PH3,先通過GPHCON它們設置成第二功能模式。用”mpll_val = (92<<12)|(1<<4)|(1);“通過對MPLLCON設置系統(tǒng)頻率=400MHz,另外通過CLKDIVN時鐘分頻器控制寄存器,UCLK選擇寄存器=0表示UPLL時鐘設為48MHz等于UCLK對USB提供的48MHz,HDIVN=10,同時CAMDIVN[9]=0,表示HCLK=FCL/4,PDIVN=1,表示PCLK=HCLK/2。好了現(xiàn)在的系統(tǒng)提供的頻率:FCLK=400MHz,HCLK=100MHz,PCLK=50MHz,UCLK=48MHz。
其中CAMDIVN是攝像頭時鐘分頻器寄存器,DIVN_UPLL[12]=0,這里FCLK=MPLLclock,HDIVN=FCLK/4=100MHz。
2.接下來要初始化UART,設置UART FIFO控制寄存器,權(quán)限最低并且關(guān)閉FIFO,關(guān)掉UMCON模式0和模式1,通過設置ULCON線性控制寄存器,選擇每幀的數(shù)據(jù)位數(shù)為8位。通過UCON控制寄存器rUCON0 = 0x245; 選擇讀寫UART數(shù)據(jù)緩沖寄存器中斷請求或查詢模式,使能UART對異常產(chǎn)生中斷。當非FIFO模式下發(fā)送緩存變空或在FIFO模式下發(fā)送緩存達到發(fā)送FIFO觸發(fā)水平,則中斷請求。
3.設置波特率,通過UBRDIV0/1/2來分別設置波特率。
4.選擇讀取的串口號,實際上程序里是選擇讀取的。
5.寫數(shù)據(jù)采用WrUTXH0(r); WrUTXH0(data);的調(diào)用方式進行些數(shù)據(jù)。
6.程序接收,采用接中斷標記等待接收數(shù)據(jù)。UTRSTAT0/1/2,移位寄存器移空中斷,再讀取緩沖區(qū)的數(shù)據(jù),通過獲取的數(shù)據(jù)發(fā)送到超級終端,于是就能在終端上看到寫上的數(shù)據(jù)了。
②如何實現(xiàn)PWM調(diào)制輸出?
蜂鳴器是由GPB0控制,改腳復用功能TOUT0即PWM輸出。
1.同上配置好時鐘分頻,頻率太快沒法從蜂鳴器聽到聲音!
2.設置TOUT0輸出,即GPBCON的GPB0為設置為10;然后用TCFG0/TCFG1/TCNTB0/TCMPB0配置PWM輸出頻率,
rTCFG0 &= ~0xff; //這兩條語句設置設置定時器0、1的標定值,周期計數(shù)初值
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf; //這個是選擇MUX輸入到PWM定時器計數(shù)時8分頻
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;//定時器0計數(shù)緩存寄存器,用來裝載到減計數(shù)的初值中,反正定時器是減計數(shù)的
rTCMPB0 = rTCNTB0>>1; // 50%用來和計數(shù)器中的值做比較,也就用于脈寬調(diào)制
rTCON &= ~0x1f; //定時器控制寄存器,關(guān)閉死區(qū),自動重裝,關(guān)掉逆變器,更新TCNTB0/TCMPB0初值,開啟TIMER0
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit不再對TCNTB0/TCMPB0更新.
其實實際工作最勤快的TCNT0計數(shù)器,記錄從PCLK的8分頻脈沖,當TCNT0≤TCMPn時輸出高電平,當TCNT0>TCMPn時輸出低電平。
那么現(xiàn)在的周期到底是多少呢?定時器輸出時鐘頻率=PCLK/{prescaler value+1}/{divider value},PCLK=50MHz,那么divider value就是那個8分頻,進過預分頻器,prescaler=15,所以頻率=50MHz/16/8=390.625KHz。還有那個計數(shù)值是多大,(PCLK>>7)/freq=390625/freq,這里讓freq=10,即T=(1/390625)*39062.5=0.1S,不知道為什么TCNTB這個值設置得達到一定程度就沒有用了,這里忘了這個寄存器16位有效65536,再大也沒有用,改前面的定時器輸出頻率更有效。
③如何實現(xiàn)AD采樣?
先通過ADCCON寄存器來選擇AD通道,AD轉(zhuǎn)換預分頻器使能,寫入AD轉(zhuǎn)換預標定值(相當于這兩項設定AD轉(zhuǎn)換的頻率),通過AN0-AN7/YM/YP/XM/XP,怪異的AD轉(zhuǎn)換,在AD轉(zhuǎn)換開始后,AD開始位會由1->0,AD轉(zhuǎn)換結(jié)束后,AD結(jié)束標記位由0->1,AD轉(zhuǎn)換結(jié)果存放在ADCDATA0寄存器中,S3C2440的AD是10的,可直接從ADCDAT0中取出,那么程序就涉及ADCCON、ADCDATA0,這兩個主要的寄存器,程序的話直接輸入一個通道,返回一個AD值,另外就是AD的時鐘,在配置系統(tǒng)時鐘時選擇分配一個頻率基準。IICCON是I2C總線控制寄存器。
④如何實現(xiàn)IIC讀寫?
I2C無論是硬件還是軟件處理,都是構(gòu)建一個I2C時序,滿足硬件通信,最終實現(xiàn)通信。雖然簡單還是從寄存器和時序分析一下,使用到了IICDS這個寄存器,它是存放寫或讀取的IIC器件的首地址,但是必須在開啟IIC傳輸前賦值;開始IIC通信使用到了IICSTAT寄存器,再通過IICCON使能IIC控制總線,使能IIC總線的ACK功能、同時使能Tx/Rx中斷、設置IICCLK頻率,rIICCON = 0xaf;。目前這個程序是通過一個寄存器來標記狀態(tài),當讀取或?qū)懭牒?,程序就會陷入while等待,那么只能通過中斷,查看具體的狀態(tài),并對那個寄存器的值更新,使得程序跳出while。
⑤ADS如何創(chuàng)建工程,如何新建程序,如何編譯如何仿真?
ADS其實是ARM公司推出的軟件,ADS由命令行開發(fā)工具,ARM時實庫,GUI開發(fā)環(huán)境(Code Warrior和AXD),實用程序獲得支持軟件組成。命令行開發(fā)工具完成源代碼編譯,連接成可執(zhí)行代碼的功能。ARM運行時庫主要是用來支持被編譯的C和C++代碼。CodeWarrior for ARM是一套完整的集成開發(fā)工具,充分發(fā)揮了ARM RISC的優(yōu)勢,該工具專為基于ARM RISC的處理器而設計的。AXD是ARM擴展調(diào)試器。
⑥ “C語言”可變數(shù)目變元??
宏va_arg()、va_start()和va_end()一起使用,便可以完成向函數(shù)傳入數(shù)目可變的變元操作。取可變數(shù)目變元的典型例子是函數(shù)printf()。類型va_list是在
評論