JZ2440裸ボード開発の練習#4シリアルUART

予備

ハードウェア

ほとんどのコンピュータを使用して負論理電圧(負のレベルは論理1を表し、正の電圧が論理0を表す)、12V、:RS232レベル

TTL / CMOSレベル:正論理電圧(正及び負の電圧が論理0を表し、1)より、5V、およびマイクロコントローラを使用して、他の埋め込み装置

(ほとんどRS232 9ピンソケット、TTL / CMOSレベル変換チップデバイスは、ハードウェアポート、スロット、一般にチップ組み込み装置に組み込まれているRS232レベル装置、9つのホール232と通信する必要があるが、今以下の変数、徐々にチップを必要とする、USBにより置換)がUSBにTTL / CMOSチップとなります

TXD、RXD、GND:TXDピンがTX-RX接続にTXとRXに接続しなければならないピン、送信端と受信端を受けるように、RXDが送信されます。共通接地GND用の装置は、(議論するために、基準電圧と電位)一貫した論理レベルを確保します。

ソフトウェア

データ形式:スタートビット、データビット、パリティ、ストップビット

非同期シリアルプロトコルデータ転送プロトコルは、各送信が追加同期情報により転送を開始する必要があります。この形式は、一般的に反映するために、スタート、ストップビットに同期されます。一方、データの正確性を確保するために、また、現在のデータ伝送が、正しい一般パリティチェックとして使用されているかどうかを決定するために、本シリアルプロトコルパリティビットとすることができる、チェックは、他の方法をも有することができます。データの残りの数ビット。

アイドルここTXDとRXDシリアルプロトコル抵抗、引っ張ら引っ張らローレベルにするときハイレベル、ハイレベルとして構成され、(0)スタートビットとみなされ、ストップビットとは反対でしたローからハイ(1)に。一般的に、8N1、即ち、8個のデータビット、1スタートビット、1ストップビット、パリティなしのビット、すなわちを使用して、送信データを1バイト10ビット伝送を送信します。

ボーレート:良好な受信側と1伝送されたデータ・ビットの数を意味送信データ終了ネゴシエーションの伝送速度、。

分析

例のS3C2440シリアルブロック図において、データニーズがTransmitBufferRegisterすなわち、送信バッファレジスタ通過周辺バスを介してメモリから、データを送信し、その後、ビットシフトレジスタによるデータビットは、送信バッファに送信される送信されます。受信側は、抽出を待って、バッファにビットシフトレジスタによって受信されたデータビットを受信して​​記憶されています。ボーレートジェネレータの影響によるシフトレジスタの割合は、これは我々が良い率は、上記の設定を事前に送信または受信するために必要なものであることは、送信者と受信者は、情報の正確さを保証することに合意したが必要です。

 

プログラム

いつものように、私たちは同じ機能を使用する必要がある、あなたはその後、所望の機能を完了するために、ビジネスロジックと結合された機能を有効にするレジスタ、コンフィギュレーション・レジスタを見つけ、適切なピンを見つけるために、模式的に見る必要があります。概略的な回路基板のUART、USB接続で見てTXD0 RXD0あり、GPH2 GPH3ピンに接続され、UART機能の両方のピンが有効であることが必要であり、その後、構成レジスタ関連するUART 。

 

 将来の再利用を容易にするため、レジスタに加算UART s3c2440.hを使用する必要があります。

s3c2440.h
--------------------------------------------------------------
#ifndef __S3C2440_H
#define __S3C2440_H

#include <stdint.h>

/* CLOCK --------------------------------------------------*/
#define MPLLCON	 (*((volatile uint32_t*)0x4C000004))
#define UPLLCON	 (*((volatile uint32_t*)0x4C000008))

#define CLKDIVN	(*((volatile uint32_t*)0x4C000014))


/* WATCH DOG --------------------------------------------------*/
#define WTCON	(*((volatile uint32_t*)0x53000000))

/* GPIO --------------------------------------------------*/
#define GPGCON	(*((volatile uint32_t*)0x56000060))
#define GPGDAT	(*((volatile uint32_t*)0x56000064))
#define GPGUP	(*((volatile uint32_t*)0x56000068))

#define GPFCON	(*((volatile uint32_t*)0x56000050))
#define GPFDAT	(*((volatile uint32_t*)0x56000054))
#define GPFUP	(*((volatile uint32_t*)0x56000058))

#define GPHCON	(*((volatile uint32_t*)0x56000070))
#define GPHDAT	(*((volatile uint32_t*)0x56000074))
#define GPHUP	(*((volatile uint32_t*)0x56000078))

/* UART --------------------------------------------------*/
//uart0
#define ULCON0	(*((volatile uint32_t*)0x50000000))
#define UCON0	(*((volatile uint32_t*)0x50000004))
#define UFCON0	(*((volatile uint32_t*)0x50000008))
#define UMCON0	(*((volatile uint32_t*)0x5000000C))
#define UTRSTAT0	(*((volatile uint32_t*)0x50000010))
#define UERSTAT0	(*((volatile uint32_t*)0x50000014))
#define UFSTAT0	(*((volatile uint32_t*)0x50000018))
#define UMSTAT0	(*((volatile uint32_t*)0x5000001C))
#define UBRDIV0	(*((volatile uint32_t*)0x50000028))

#define UTXH0 (*((volatile uint8_t*)0x50000020))
#define URXH0 (*((volatile uint8_t*)0x50000024))

//uart1
#define ULCON1	(*((volatile uint32_t*)0x50004000))
#define UCON1	(*((volatile uint32_t*)0x50004004))
#define UFCON1	(*((volatile uint32_t*)0x50004008))
#define UMCON1	(*((volatile uint32_t*)0x5000400C))
#define UTRSTAT1	(*((volatile uint32_t*)0x50004010))
#define UERSTAT1	(*((volatile uint32_t*)0x50004014))
#define UFSTAT1	(*((volatile uint32_t*)0x50004018))
#define UMSTAT1	(*((volatile uint32_t*)0x5000401C))
#define UBRDIV1	(*((volatile uint32_t*)0x50004028))

#define UTXH1 (*((volatile uint8_t*)0x50004020))
#define URXH1 (*((volatile uint8_t*)0x50004024))

//uart2
#define ULCON2	(*((volatile uint32_t*)0x50008000))
#define UCON2	(*((volatile uint32_t*)0x50008004))
#define UTRSTAT2	(*((volatile uint32_t*)0x50008010))
#define UERSTAT2	(*((volatile uint32_t*)0x50008014))
#define UFSTAT2	(*((volatile uint32_t*)0x50008018))
#define UBRDIV2	(*((volatile uint32_t*)0x50008028))

#define UTXH2 (*((volatile uint8_t*)0x50004020))
#define URXH2 (*((volatile uint8_t*)0x50008024))


void HardwareInitAll(void);
void Delay(uint32_t time);

#endif

GPIOはRXDとTXDに構成され、通信がPCLK(50MHzの)を使用して、8データビット、パリティなし、1ストップビットに設定されているUARTボーレートによってUARTとしてクロックをUART関連レジスタを設定しています115200は、UARTクロック分周器を与えるために、リファレンスマニュアルを提供するために、式に代入します。次のとおりです。

uart.h
----------------------------------------------------
#ifndef __UART_H
#define __UART_H

#include <stdint.h>

void UartInit(void);

void putc(uint8_t character);
uint8_t getc(void);

#endif
uart.c
------------------------------------------

#include "uart.h"


#include "s3c2440.h"


void UartInit(void)
{
	//GPIO init
	GPHCON &= ~((3<<6) | (3<<4));
	GPHCON |= (2<<6) | (2<<4);

	//UART init
	ULCON0 = 3;  //8n1
	UCON0 = (1<<2) | (1<<0);
	UBRDIV0 = (int32_t)( 50000000/ (115200 * 16) ) -1;
}


static uint8_t IsReadyToSend(void)
{
	return UTRSTAT0 & (1<<1);
}


static uint8_t IsReadyToReceive(void)
{
	return UTRSTAT0 & (1<<0);
}

void putc(uint8_t character)
{
	while(!IsReadyToSend());
	UTXH0 = character;
	if(character==(uint8_t)('\r'))
	{
		while(!IsReadyToSend());
		UTXH0 = (uint8_t)'\n';
	}
}

uint8_t getc(void)
{
	while(!IsReadyToReceive());
	return URXH0;
}

ステータスながら、最終的なビジネス・コードを得るために必要なロジックを増加させる、指定された機能パッケージの関数として、関連するステータス・ビットをレジスタ:PUTCとGETC、効果を、入力文字をエコーするために、シリアルポートコミュニケーションツールを使用します。

main.c
--------------------------------------------

#include <stdint.h>

#include "s3c2440.h"
#include "led.h"
#include "uart.h"

int main()
{
	HardwareInitAll();
	UartInit();
	
	uint8_t tmp;

	while(1)
	{
		tmp = getc();
		putc(tmp);
	}
}

このように、簡単なラフシリアルエコー手続きが完了しています。

公開された19元の記事 ウォン称賛7 ビュー6925

おすすめ

転載: blog.csdn.net/G_METHOD/article/details/104288739