1. 程式人生 > >mini2440裸機試煉之——Uart與pc端實現文件、字符傳輸

mini2440裸機試煉之——Uart與pc端實現文件、字符傳輸

調試工具 CP lib 開發 ons htm sub 設置 沒有

1、? 波特率(Baud rate)即調制速率,1波特即指每秒傳輸1個符號。

2、? 非FIFO模式,即數據傳輸不利用FIFO緩存,一個字節一個字節地傳輸。

3、? 接收到的數據是放到接收緩存器URXHn中。要發送數據時,是把數據放入發送緩存器UTXHn中。因為UART是通過字節方式數據傳輸的。因此要區分是大端模式還是小端模式,也就是說這兩個寄存器在這兩種模式下,所在的地址是不同。為了了解當前數據傳輸的各種狀態,還須要一些狀態寄存器。傳輸狀態寄存器UTRSTATn很實用,它的第0位能夠用來推斷接受緩存器內是否有可接收的數據。第

1位和第2位能夠用來推斷發送緩存器中是否為空,為空時能夠發送數據。因為在這裏我們不進行數據傳輸時錯誤的推斷。因此錯誤狀態寄存器UERSTATn不須要。FIFO狀態寄存器UFSTATnMODEM狀態寄存器UMSTATn在這裏也不須要。

本來是想使用中斷方式接收和發送的,可是僅僅實現發送接收一個字符。

之後試下查詢方式,結果能行。

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端實現文件、字符傳輸