串口

来源:互联网 发布: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;                               //写数据
}

 

0 0