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