串口
来源:互联网 发布:svoice是什么软件 编辑:程序博客网 时间:2024/04/29 08:19
#include "uart.h"
int main()
{
char c;
init_uart(); /*波特率,数据位,停止位。。。。。。。*/
while (1)
{
c = getchar();
putchar(c+1);
}
return 0;
}
/***********************uart.c**********************/
#define ULCON0 (*((volatile unsigned long *)0x7F005000))
#define UCON0 (*((volatile unsigned long *)0x7F005004))
#define UFCON0 (*((volatile unsigned long *)0x7F005008))
#define UMCON0 (*((volatile unsigned long *)0x7F00500C))
#define UTRSTAT0 (*((volatile unsigned long *)0x7F005010))
#define UFSTAT0 (*((volatile unsigned long *)0x7F005018))
#define UTXH0 (*((volatile unsigned char *)0x7F005020))
#define URXH0 (*((volatile unsigned char *)0x7F005024))
#define UBRDIV0 (*((volatile unsigned short *)0x7F005028))
#define UDIVSLOT0 (*((volatile unsigned short *)0x7F00502C))
#define GPACON (*((volatile unsigned long *)0x7F008000))
void init_uart(void)
{
GPACON &= ~0xff; //bit0~7全部清零
GPACON |= 0x22; //设置为0010,0010
/* ULCON0 */
ULCON0 = 0x3; /* 数据位:8位, 无较验, 停止位: 1, 8n1 *//// 6:正常模式 5~3:校验模式 2:停止位个数 1~0:数据位
UCON0 = 0x5; /* 使用PCLK,使能UART发送、接收 */ //11~10:时钟源选择 9:tx中断类型 8:rx中断类型 5:回环模式(测试时使用) 3~2:发送模式 1~0:接收模式
UFCON0 = 0x01; /* FIFO ENABLE *///FIFO模式:一次性发送或接收64位数据(串口传输数据较慢,一般都使能FIFO)
UMCON0 = 0; //流量控制寄存器(不使用)
/* 波特率 */
/* DIV_VAL = (PCLK / (bps x 16 ) ) - 1
* bps = 57600
* DIV_VAL = (66500000 / (115200 x 16 ) ) - 1
* = 35.08
*/
UBRDIV0 = 35;
/* x/16 = 0.08
* x = 1
*/
UDIVSLOT0 = 0x1; //只要该寄存器里有1个一
}
char getchar(void)
{
while ((UFSTAT0 & (1<<6)) == 0 && (UFSTAT0 & 0x3f) == 0); //((UFSTAT0 & 0x7f)== 0)有数据时,退出死循环 ;如果RX FIFO空,等待
return URXH0; //读URXH0寄存器,获得数据
}
void putchar(char c)
{
while ((UFSTAT0 & (1<<14)) ); //如果TX FIFO满,等待
UTXH0 = c; //写数据
}