mini2440裸機試煉之——Uart與pc端實現文件、字符傳輸
1、? 波特率(Baud rate)即調制速率,1波特即指每秒傳輸1個符號。
2、? 非FIFO模式,即數據傳輸不利用FIFO緩存,一個字節一個字節地傳輸。
3、? 接收到的數據是放到接收緩存器URXHn中。要發送數據時,是把數據放入發送緩存器UTXHn中。因為UART是通過字節方式數據傳輸的。因此要區分是大端模式還是小端模式,也就是說這兩個寄存器在這兩種模式下,所在的地址是不同。為了了解當前數據傳輸的各種狀態,還須要一些狀態寄存器。傳輸狀態寄存器UTRSTATn很實用,它的第0位能夠用來推斷接受緩存器內是否有可接收的數據。第
本來是想使用中斷方式接收和發送的,可是僅僅實現發送接收一個字符。
之後試下查詢方式,結果能行。
Uart方框圖
1、使用非FIFO模式時,接收、發送緩存寄存器僅僅存一個字節
2、時鐘源使用PCLK(50000000)。波特率為115200;
? ? ? UBRDIVn= (int)( UART時鐘 / ( 波特率 ×16) ) – 1? ?配置GPH
?
rGPHCON|=((2<<4)|(2<<6));??? //設置GPH2、GPH3為TXD0、RXD0功能
rGPHUP=0x00;?????????????? //上拉電阻使能
設置Uart寄存器
rUFCON0 = 0x0;????????????? //禁止FIFO
rUMCON0 = 0x0;???????????? //禁止AFC
?
UCONn控制寄存器:
rUCON0=0x05;??????????????? //發送模式和接收模式都使用查詢模式
?
ULCONn控制寄存器:
rULCON0|=0x03;????????????? //設置UART0數據發送8個數據位
趙老師的一段話(關於中斷的。作為筆記):
最後還要強調幾點關於非FIFO模式下UART中斷的一些註意事項: 1.對於s3c2440來說。接收數據是被動的,發送數據是主動的。因此一般來說。接收數據用中斷方式,發送數據用查詢方式較好; 2. 在中斷方式下,當接收到數據時,雖然可能該數據無用,但也一定要讀取它,否則下次再接收數據時,不會再引起中斷,因為接收數據緩存器被上次接收到的數據所霸占。僅僅要沒有讀取它,它就永遠在那裏; 3. 因為UART中斷涉及到SUBSRCPND寄存器,因此在中斷處理程序中不僅要清SRCPND寄存器,還要清SUBSRCPND寄存器,它們的順序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否則就會引起一個中斷兩次響應的問題。因為是否中斷由SRCPND寄存器決定,而SRCPND寄存器的相關狀態位由SUBSRCPND寄存器決定。假設先清SRCPND寄存器,而還沒有清SUBSRCPND寄存器的話,SRCPND寄存器的相關位還是會被置1,而一旦被置1,則一定還會引起中斷。
總結:
使用查詢方法確實能夠通過PC端的串口工具發送文件或者字符串,再通過uart0接收文件或字符串發送給PC端的串口工具和存儲於文件uart.txt中,可是過程中會出現字符丟失(發送回PC端串口工具和文件裏都是一樣的情況)的情況。如今感覺可能是串口工具同步的問題或者機器之間的延遲問題,時間的延遲並不會影響串口之間數據傳輸
代碼區:
Main.c
#define GLOBAL_CLK 1 #include "def.h" #include "option.h" #include "2440addr.h" #include "2440lib.h" //函數聲明 #include "2440slib.h" #include "mmu.h" #include "profile.h" extern void Uart(void); void Main(void) { U32 mpll_val = 0,consoleNum; Port_Init(); mpll_val = (92<<12)|(1<<4)|(1); //init FCLK=400M, ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); ChangeClockDivider(14, 12); //the result of rCLKDIVN [0:1:0:1] 3-0 bit cal_cpu_bus_clk(); //HCLK=100M PCLK=50M MMU_Init(); //地址映射初始化 Beep(2000, 100); Uart(); //實現串口傳送文件 字符串到開發板。並顯示在串口終端(調試成功!) }
Uart.c
#include "2440addr.h" #include "def.h" #include "2440lib.h" #include <stdio.h> //文件庫函數 void Uart_init(){ //下面使用uart0 rGPHCON&=~((3<<4)|(3<<6)); //GPH2--TXD0;GPH3--RXD0 rGPHCON|=((2<<4)|(2<<6)); //設置GPH2、GPH3為TXD0、RXD0功能 //手冊中GPH2、GPH3描寫敘述例如以下: //GPHCON Bit Description //GPH3 [7:6] 00 = Input 01 = Output // 10 = RXD0 11 = reserved //GPH2 [5:4] 00 = Input 01 = Output // 10 = TXD0 11 = Reserved rGPHUP=0x00; //上拉電阻使能 rUFCON0 = 0x0; //禁止FIFO rUMCON0 = 0x0; //撤銷nRTS rULCON0|=0x03; //設置UART0數據發送8個數據位 rUCON0=0x05; //發送模式和接收模式都使用查詢模式 //設置波特率,當中波特率作為一個參數傳遞到該初始化函數 rUBRDIV0=(int)((50000000/(115200*16))-1); Delay( 10 ) ; } void Uart(){ int i=0; char ch; FILE *FP; //文件指針 FP=fopen("uart.txt","w"); //以寫方式打開uart.txt文件 Uart_init(); //uart初始化函數 while(1){ if(rUTRSTAT0&1) { //假設接收數據緩存器接收到有效數據 ch = rURXH0; //ch存儲接收字節數據 rUTXH0=ch; //PC機將接收的字符通過串口調試工具顯示在屏幕上 fputc(ch,FP); //將ch字符內容存進文件裏 i++; if(i>200) fclose(FP); //假設有200個字節關閉文件 } } }
結果截圖:
1、PC端串口工具
2、Uart.txt是存儲於項目2440test_Data\DebugRel_bin文件夾下。與bin文件同一文件夾
mini2440裸機試煉之——Uart與pc端實現文件、字符傳輸