s3c6410 uart 裸机 轮询 非fifo

7 篇文章 0 订阅
/* uart 非中断模式R,轮询,不用fifo
*/

#include <stdio.h>
#include "uart.h"
#include "gpio.h"
#include "sysc.h"

#define UART0		( ( volatile UART_REGS * ) (UART_BASE))

u32 Inp32(u32 xx)
{
	return  xx;
}



void GpioInit()
{
// 设置gpio ,使用uart0
	u32 TEMP;
	TEMP = GPIO->rGPIOACON;
	TEMP &= ~(0XFF);
	TEMP |= 0X22;
	GPIO->rGPIOACON = TEMP;
	
		
}


// SEND 8byte,1 stop bit, no parity
void UartInit()
{
u32 TEMP;
 TEMP = Inp32(UART0->rULCON);
 TEMP |= 0X03;
 UART0->rULCON=TEMP;
 
 // SET RT MODE ,polling mode 
 TEMP = Inp32(UART0->rUCON);
 TEMP &=~(0xf);
 TEMP |= 0X5;
 UART0->rUCON=  TEMP;
 }
 char Getchar()
 {
 u8 TEMP;
	while(!(UART0->rUTRSTAT &0X1));
	TEMP = UART0->rURXH;
	return TEMP;
 }
 
 void Sendchar(char x)
 {
	while(!(UART0->rUTRSTAT & 0X4));
	UART0->rUTXH = x;
 }
 
 void BaudInit(u32 Baudrate)
 {
 //设置波特率  ,公式给出,参照datasheet
	u32 TEMP,temp;
	SYSC_GetClkInform();
	TEMP = (g_PCLK /(Baudrate*16))-1;
	temp = TEMP;
	TEMP = (int)TEMP;
	UART0->rUBRDIV = TEMP;
	
	temp -= TEMP;
	temp = (int)(temp*16);
	switch(temp){
	case 0: TEMP = 0X0000; break;
	case 1: TEMP = 0X0080; break;
	case 2: TEMP = 0X0808; break;
	case 3: TEMP = 0X0888; break;
	case 4: TEMP = 0X2222; break;
	case 5: TEMP = 0X4924; break;
	case 6: TEMP = 0X4a52; break;
	case 7: TEMP = 0X54aa; break;
	case 8: TEMP = 0X5555; break;
	case 9: TEMP = 0Xd555; break;
	case 10: TEMP = 0Xd5d5; break;
	case 11: TEMP = 0Xddd5; break;
	case 12: TEMP = 0Xdddd; break;
	case 13: TEMP = 0Xdfdd; break;
	case 14: TEMP = 0Xdfdf; break;
	case 15: TEMP = 0Xffdf; break;
	}
	UART0->rUDIVSLOT = TEMP;
 }
 
 
 int main()
 {
	u8 ch;
	UartInit();
	BaudInit(9600);

while(1)
{
	Sendchar('x');
	ch= Getchar();
	if(ch == 'x')
		Sendchar('y');
	}		
 }
 
 
 
可以参照datasheet,要大胆尝试,试一试就出来了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值