uart串口發(fā)送---那些年我們一起玩mini2440(arm9)裸機(jī)
Uart工作原理:
數(shù)據(jù)通信方式為:并行通信與串行通信兩種:
§并行通信:利用多條數(shù)據(jù)線將數(shù)據(jù)的各位同時(shí)傳送。
它的特點(diǎn)是:傳輸速度快,是用于短距離通信;
§串行通信:利用一條數(shù)據(jù)線將數(shù)據(jù)一位位地順序傳送。
特點(diǎn)是通信線路簡單,利用簡單的線纜就實(shí)現(xiàn)通信,低成本,是用于遠(yuǎn)距離通信。
異步通信:
a異步通信:以一個(gè)字符為傳輸單位,通過兩個(gè)字符間的時(shí)間間隔是不固定的,然而同一字符中的兩個(gè)相鄰位之間的時(shí)間間隔是固定的。
a通信協(xié)議:是指通信雙方約定的一些規(guī)則。在異步通訊時(shí),對數(shù)據(jù)格式有如下約定:規(guī)定有空閑位、起始位、資料位、奇偶校驗(yàn)位、停止位。
起始位:先發(fā)一個(gè)邏輯“0”信號(hào),表示傳輸字符的開始;
數(shù)據(jù)位:緊接在起始位之后。數(shù)據(jù)位的個(gè)數(shù)可以是4、5、6、7、8等,從最低位開始傳送,靠時(shí)鐘定位。
奇偶校驗(yàn)位:數(shù)據(jù)位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗(yàn))或(奇校驗(yàn)),以此校驗(yàn)數(shù)據(jù)傳送的正確性。
停止位:它是一個(gè)字符數(shù)據(jù)的結(jié)束標(biāo)志。
空閑位:處于邏輯“1”狀態(tài),表示當(dāng)前線路沒有數(shù)據(jù)傳送。
波特率:
是衡量數(shù)據(jù)傳送率的指標(biāo):記錄每秒中傳送的二進(jìn)制位數(shù)。例如:數(shù)據(jù)傳送速率為120字符、每秒。而每一個(gè)字符為10位,則其傳送的波特率為10*120=1200位/秒=1200波特率
UART基本原理
通用異步收發(fā)器,簡稱UART,即“Universal Asynchronous Receiver Transmitter”,它用來傳輸串行數(shù)據(jù);
發(fā)送數(shù)據(jù)時(shí):
CPU將并行數(shù)據(jù)寫入U(xiǎn)ART,UART按照一定的格式在一根電線上串行發(fā)出;
接收數(shù)據(jù)時(shí):
UART檢測另一根電線上的信號(hào),將串行數(shù)據(jù)放在緩沖區(qū)中,CPU可讀取UART獲得的這些數(shù)據(jù)。
UART驅(qū)動(dòng)程序設(shè)計(jì)
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時(shí)鐘為40MHZ
UBRDIV =(int) (40MHZ /(115200*16))-1
二.設(shè)置數(shù)據(jù)傳輸格式(ULCON)
在s3c2440中,通過ULCON(page341),可以設(shè)置傳輸格式(有多少個(gè)數(shù)據(jù)位、是否使用校驗(yàn)位、是奇校驗(yàn)還是偶校驗(yàn),有多少個(gè)停止位、是否使用流量控制)
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會(huì)將保存到緩沖區(qū)中,并自動(dòng)發(fā)出去。
UTXH0、UTXH1、UTXH2
接收數(shù)據(jù):
當(dāng)UART收到數(shù)據(jù)時(shí)(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í)函數(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ù),實(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ù)位、停止位、校驗(yàn)位*/ 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的時(shí)鐘頻率 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 =