S5PV210 UART编程流程 协议类模块操作

 协议类编程(常用的协议类模块有:UART,IIC,SPI,NAND Falsh,LCD)

一.需掌握知识:
应该掌握怎么通过UART来和PC机进行交互。

二.程序效果:

UART作用:今天编写uart程序,预期的实验结果是,在S5PV210开发板上实现用串口实现接受和发送功能,实现和PC机通讯。


三. 常用概念

UART:universal asyncrecive transmit通用异步收发器。               

用于PC机和开发板之间的通讯,数据传输,控制。

1.   串口的接线:RSTXD,RSRXD(读写数据线),RSCTS,RSRTS(流量控制线),GND地线。

2.   异步:你不知道什么时候S5PV210什么时候会传数据。

3.   协议:你说的别人要听的懂。(收发数据的格式)

4.   双方时序:你的语速要让别人跟的上。(波特率)

5.   UART如何传数据?

1)约定协议 :起始位,停止位,数据位,奇偶校验位。PC机通过软件设置串口协议,S5PV210通过设置控制串口控制器。

2)约定时序: 波特率,每发一次数据需要多少时间等。


四.编程思路

1.查看原理图,确定串口和CPU的连线GPIO,将特定的GPIO设置为UART输出;

2. 首先看芯片手册UART章节,查看UART寄存器的功能描述,查看我们具体需要设置那些寄存器。

3.根据对寄存器的了解,写初始化函数,接受和发送函数


五。相关寄存器

1.初始化相关的寄存器     

1)GPA0:设置引脚状态位UART

2)ULCON0:红外线模块,奇偶校验,停止位,传输数据位宽。

3)UCON0:(T/R)DMA,clock Selection(PCLK/SCLK_UART),(T/R)interrput Type中断必须脉冲-查询必须电平,(T/R)Mode(中断,查询)。

4)UBRDIV0,UDIVSLOT:分别设置UBRDIV和UDIVSLOTn

DIV_VAL =(PCLK / (bps x 16)) −1                           求出DIV_VAL,PLCK一般为66.7MHZ

UBRDIVn =DIV_VAL的整数部分( integer part of DIV_VAL )       求出UBRDIV,(去DIV_VAL整数)

DIV_VAL =UBRDIVn + (num of 1's in UDIVSLOTn)/16         求出UDIVSLOTn,四舍五入,查表。

5)UMCON0,UFCON0:设为0x0

2.接受发送相关寄存器

1)URXH0,UTXH0:发送和接受寄存器。

2)UTRSTAT0:确定(R/T)buf的状态,再发送和接受。

3.中断相关的寄存器

UINTP0,UINTSP0,UINTM0:和中断有关。


六.主程序和相关函数

int xmain()

{

      int ch = -1;

      close_buzzer();

      init_uart();

      init_led();

      *rGPJ2DAT = 0xff;

      while(1)

      {

           ch = recv_uart();

           if(-1 != ch)

           {         

                 *rGPJ2DAT = ~(*rGPJ2DAT);

                 send_uart((unsigned int)ch);

           }

      }

      return 0;

}

 

void init_uart()

{

      //将特定的GPIO口设置为UART模式。

      *GPA0CON = 0x22; 

      *UFCON0 = 0x0;

      *UMCON0 = 0x0;

     

      *ULCON0 =(3<<0)|(0<<2)|(0<<5)|(0<<6);     

      *UCON0 =(1<<0)|(1<<2)|(1<<8)|(1<<9)|(0<<10);     

      //(66700000/(115200*16)  -1)

      *UBRDIV0 = 35;

      *UDIVSLOT = 0x888;          

}

int recv_uart()

{

      int ch;

      if((*UTRSTAT0 & 0x01) == 0x01)

      {   

           ch = *URXH0;

           return ch;

      }

      else

      {

           return -1;

      }

     

}

voidsend_uart(unsigned int ch)

{

      while((*UTRSTAT0 & 0x04) == 0x00);

      *UTXH0 = ch;

}

你可能感兴趣的:(嵌入式裸机开发)