OK6410:UART

  串口又叫UART,通过异步实现(没有时钟,有时钟就是同步)
  串口一般为调试位
  串口的其中3条线,其功能是:发送、接收、接地线
  发送的数据是由开始位,数据位,停止位组成。开始停止均为高电平


  PC端先检测发送线是否为低电平,为低电平表示对方要发数据
  等待一段时间,然后开始检测数据,一般检测位的中间


  每一位占据多长时间:波特率(一秒钟之内要传输多少位),为115200
  开始位、数据位、停止位各占多少: 校验位为空,开始位没有设置,默认为1、数据位:8、停止位:1




  把数据写到一个缓冲器里面,硬件会自动发送数据
  读也一样。然后通过读寄存器获取数据


  先初始化串口,设置一些串口的参数,如波特率,数据位,停止位...
  GPA设置为串口的输入输出,设置为0010(专门给UART使用的)GPA0接收,GPA1发送


  设置串口0,这设置ULCON0


  红外模式:正常则设置0
  校验位:不使用,设置为000
  停止位: 0为1个
  数据位:8




  ULCON0 = 0x3 8n1 数据位8 无校验n 停止位1

OK6410:UART_第1张图片

  UCON0设置
  先设置时钟源,使用PCLK
  回环模式:内部接收和发送连在一起,测试用
  设置发送和接收模式


  可以使用Buffer,因为串口比较慢,最好用缓存区

  UFCON0最后一位使能,则使用

  UMCON0流量控制,先设置为0


  串口波特率配置寄存器UBRDIV0
  PCLK = 66.5MHz

  b = 115200

  UBRDIVO的计算公式:

  Div_val = 66.5 * 10^6 / 115200 /16 - 1 = 35.08 = UBRDIVO + VDIVSLOTO的1个数 / 16 = 35 + 0.8
得1的个数为1



  读数据函数:

  读取UFSTAT0最后三位while(UFSTATO & 0x7f == 0);

  如果RX FIFO为空,等待

  6位为1则缓存器满,
  有数据则读取URXH0,即返回


  写数据函数
  读取while(UFSTATO & (1 << 14)); 如果TX FIFO满,等待
  把数据送到UTXHO

  注意URXHO、UTXHO为unsigned char因为数据位八位


  下面把代码贴出来:

  

#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 short *)0x7F008000)) void init_uart(void) { GPACON &= ~0xff; GPACON |= 0x22; /* ULCON0 */ ULCON0 = 0x3; /* 数据位:8, 无较验, 停止位: 1, 8n1 */ UCON0 = 0x5; /* 使能UART发送、接收 */ UFCON0 = 0x01; /* FIFO ENABLE */ 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; } char getc(void) { while ((UFSTAT0 & (1<<6)) == 0 && (UFSTAT0 & 0x3f) == 0); return URXH0; } void putc(char c) { while (UFSTAT0 & (1<<14)); UTXH0 = c; }

你可能感兴趣的:(OK6410:UART)