天天看點

S3C2440序列槽學習

序列槽是嵌入式中常用的通信方式,他使用逐位發送,逐位接收。串行通信。序列槽有許多功能,諸如列印調試,連接配接各種子產品。他安全可靠,連接配接簡易是以被廣泛使用。

序列槽通訊的基本定義:

1.波特率

2.格式:資料位,停止位,校驗位,流量控制。

3.發送機與接收機用TX與RX相連接配接

USART的邏輯電平:

原來TX(即發送控制端)為高電平,ARM給予拉低并且保持1Bit的時間。PC機在低電平時開始計時,因為發送機于接收機之間有約定好的波特率,即按照約定好的波特率每隔一段時間讀取一次發送引腳的電平。(一般是讀取一個Bit中間時間的值),這樣循環八次就完成了一個位元組的接收。在接受完一個位元組之後,以一個約定好的停止位結束本次位元組的接收(停止位一般為1-2位資料)。在有些情況下,在八位資料與停止位的中間還會帶有一個校驗位。(一般為奇數偶數校驗位,即一個位元組中高電平的個數)。

序列槽存儲:

因為是逐位發送的,在每接收到一位資料後會存入晶片中的FIFIO等待記憶體把他取出,取出之後再存入。

序列槽發送速度:

例如115200的波特率,一秒發送的Bit數目為115200/10=11520Bit

接下來我們開始分析編寫USART的代碼:

1.首先我們先從資料手冊分析檢視寄存器的配置:

GPH2與GPH3分别可以可以配置為序列槽0的TX與RX(即發送接收模式)

所需的條件是GPFCON[5:4]=10與GPFCON[7:6]=10

S3C2440序列槽學習

上面說過,序列槽不工作的時候引腳的電平預設為高電平

S3C2440序列槽學習

我們這裡将GPH引腳初始化為高電平,即GPHUP[2]為1;

這樣我們的引腳初始化就完成了。

2.接着我們來設定波特率

首先我們在手冊中找到波特率的計算公式:

S3C2440序列槽學習

UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1

由此可以計算得到UBRDOVn= 50000000/(115200*16)-1=26

是以向UBRDIV0寫入26

S3C2440序列槽學習

由模式設定寄存器中查的應向UCON0寄存器中寫入0x00000005

3.設定完這些後,接下來我們設定序列槽的資料模式

由資料手冊的清單中

S3C2440序列槽學習

中得到:ULCON0 = 0x00000003;

接下來寫序列槽輸出與輸入函數,這裡就不多介紹了很簡單的邏輯,這裡羅列出來

int putchar(int c)
{
	/* UTRSTAT0 */
	/* UTXH0 */

	while (!(UTRSTAT0 & (1<<2)));
	UTXH0 = (unsigned char)c;
	
}

int getchar(void)
{
	while (!(UTRSTAT0 & (1<<0)));
	return URXH0;
}

           

接着來寫一個列印函數,這裡也羅列出來:

int puts(const char *s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
}在這裡插入代碼片
           

到這裡就基本完成整個實驗了,可以下載下傳到開發闆裡面去試試開機的時候序列槽是否有列印出Hello World

備注:

實驗代碼:

在這裡#include "s3c2440_soc.h"


/* 115200,8n1 */
void uart0_init()
{
	/* 設定引腳用于序列槽 */
	/* GPH2,3用于TxD0, RxD0 */
	GPHCON &= ~((3<<4) | (3<<6));
	GPHCON |= ((2<<4) | (2<<6));

	GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 */
	

	/* 設定波特率 */
	/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
	 *  UART clock = 50M
	 *  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
	 */
	UCON0 = 0x00000005; /* PCLK,中斷/查詢模式 */
	UBRDIV0 = 26;

	/* 設定資料格式 */
	ULCON0 = 0x00000003; /* 8n1: 8個資料位, 無較驗位, 1個停止位 */

	/*  */

}

int putchar(int c)
{
	/* UTRSTAT0 */
	/* UTXH0 */

	while (!(UTRSTAT0 & (1<<2)));
	UTXH0 = (unsigned char)c;
	
}

int getchar(void)
{
	while (!(UTRSTAT0 & (1<<0)));
	return URXH0;
}

int puts(const char *s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
}
插入代碼片
           

繼續閱讀