uart串口發(fā)送---那些年我們一起玩mini2440(arm9)裸機
Uart工作原理:
數(shù)據(jù)通信方式為:并行通信與串行通信兩種:
§并行通信:利用多條數(shù)據(jù)線將數(shù)據(jù)的各位同時傳送。
它的特點是:傳輸速度快,是用于短距離通信;
§串行通信:利用一條數(shù)據(jù)線將數(shù)據(jù)一位位地順序傳送。
特點是通信線路簡單,利用簡單的線纜就實現(xiàn)通信,低成本,是用于遠距離通信。
異步通信:
a異步通信:以一個字符為傳輸單位,通過兩個字符間的時間間隔是不固定的,然而同一字符中的兩個相鄰位之間的時間間隔是固定的。
a通信協(xié)議:是指通信雙方約定的一些規(guī)則。在異步通訊時,對數(shù)據(jù)格式有如下約定:規(guī)定有空閑位、起始位、資料位、奇偶校驗位、停止位。
起始位:先發(fā)一個邏輯“0”信號,表示傳輸字符的開始;
數(shù)據(jù)位:緊接在起始位之后。數(shù)據(jù)位的個數(shù)可以是4、5、6、7、8等,從最低位開始傳送,靠時鐘定位。
奇偶校驗位:數(shù)據(jù)位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗)或(奇校驗),以此校驗數(shù)據(jù)傳送的正確性。
停止位:它是一個字符數(shù)據(jù)的結(jié)束標志。
空閑位:處于邏輯“1”狀態(tài),表示當前線路沒有數(shù)據(jù)傳送。
波特率:
是衡量數(shù)據(jù)傳送率的指標:記錄每秒中傳送的二進制位數(shù)。例如:數(shù)據(jù)傳送速率為120字符、每秒。而每一個字符為10位,則其傳送的波特率為10*120=1200位/秒=1200波特率
UART基本原理
通用異步收發(fā)器,簡稱UART,即“Universal Asynchronous Receiver Transmitter”,它用來傳輸串行數(shù)據(jù);
發(fā)送數(shù)據(jù)時:
CPU將并行數(shù)據(jù)寫入UART,UART按照一定的格式在一根電線上串行發(fā)出;
接收數(shù)據(jù)時:
UART檢測另一根電線上的信號,將串行數(shù)據(jù)放在緩沖區(qū)中,CPU可讀取UART獲得的這些數(shù)據(jù)。
UART驅(qū)動程序設(shè)計
UART初始化:1.發(fā)送數(shù)據(jù);2.接收數(shù)據(jù);
UART初始化:1.設(shè)置波特率;2.設(shè)置數(shù)據(jù)傳輸格式;3.選擇通道工作模式;
一.設(shè)置波特率:(UBRDIV)
在s3c2440中,通過UBRDIV(p352)寄存器可以設(shè)定UART的波特率。Uart0、Uart1、Uart2分別對應(yīng)UBRDIV0,UBRDIV1、UBRDIV2
到底UBRDIV寄存器中的值與波特率有何關(guān)系?
UBRDIV=(int)(UART clock/ (buad rate *16))-1
(UART clock:PCLK or FCLK/ n or UEXTCLK)
如波特率為115200bps,UART時鐘為40MHZ
UBRDIV =(int) (40MHZ /(115200*16))-1
二.設(shè)置數(shù)據(jù)傳輸格式(ULCON)
在s3c2440中,通過ULCON(page341),可以設(shè)置傳輸格式(有多少個數(shù)據(jù)位、是否使用校驗位、是奇校驗還是偶校驗,有多少個停止位、是否使用流量控制)
Uart0、Uart1、Uart2分別對應(yīng)ULCON0、ULCON1、ULCON2.
三.設(shè)置通道工作模式(UCON)
在s3c2440中,通過UCON(page342),可以設(shè)置UART通道的工作模式,(中斷模式、查詢模式、或DMA模式)
Uart0、Uart1、Uart2分別對應(yīng)UCON0、UCON1、UCON2.
這三步都屬于初始化:初始化完成之后à發(fā)送或/接收數(shù)據(jù)
發(fā)送數(shù)據(jù):
將要發(fā)送的數(shù)據(jù)寫UTXHn, UART會將保存到緩沖區(qū)中,并自動發(fā)出去。
UTXH0、UTXH1、UTXH2
接收數(shù)據(jù):
當UART收到數(shù)據(jù)時(UTRSTATn寄存器bit[0]被置1),CPU讀取URXHn寄存器,即可獲得數(shù)據(jù)。
URXH0、URXH1、URXH2寄存器中讀取數(shù)據(jù)
Main.c
#defineGLOBAL_CLK1
#include
#include
#include"def.h"
#include"option.h"
#include"2440addr.h"
#include"2440lib.h"
#include"2440slib.h"
#include"mmu.h"
#include"profile.h"
#include"memtest.h"
staticvoidcal_cpu_bus_clk(void);
voidSet_Clk(void);
/*************************************************
Functionname:delay
Parameter:times
Description:延時函數(shù)
Return:void
Argument:void
Autor&date:Daniel
**************************************************/
voiddelay(inttimes)
{
inti,j;
for(i=0;i for(j=0;j<400;j++); } /************************************************* Functionname:Main Parameter:void Description:主功能函數(shù),實現(xiàn)了串口的收發(fā)功能 首先想串口發(fā)送十次“helloworld”, Return:void Argument:void Autor&date:Daniel **************************************************/ voidMain(void) { inti; intScom=0; Set_Clk(); beep_init(); /*設(shè)置波特率、數(shù)據(jù)位、停止位、校驗位*/ Uart_Init(0,115200); Uart_Select(Scom); for(i=0;i<10;i++) Uart_Printf("nHelloWorld!n"); while(1) { while(Uart_GetKey()=='r') { for(i=0;i<10;i++) beep_run(); Uart_Printf("nBeepQuit!n"); } } } /************************************************* Functionname:Set_Clk() Parameter:void Description:設(shè)置CPU的時鐘頻率 Return:void Argument:void Autor&date:Daniel **************************************************/ voidSet_Clk(void) { inti; U8key; U32mpll_val=0; i=2;//don'tuse100M! //boot_params.cpu_clk.val=3; switch(i){ case0://200 key=12; mpll_val=(92<<12)|(4<<4)|(1); break; case1://300 key =