/* 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,要大胆尝试,试一试就出来了
s3c6410 uart 裸机 轮询 非fifo
最新推荐文章于 2016-09-04 20:12:00 发布