在线问答
直播中

dvd1478

11年用户 586经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器 EMC/EMI设计 光电显示 存储技术 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注

【OK210开发板】裸奔USART 串口

S5PV210_UM_REV1.1.pdf
section 08_connectivity_storage
1 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER
有详细的说明
S5PV210中有4个异步收发器,提供4个独立的异步串行输入/输出(I/O)端口。所有端口可以用于中断模式和DMA模式。UART可以产生一个中断和DMA请求来传输数据给CPU或从CPU传向UART。支持高达3Mbps的位速率。每个UART通道都包含了两个FIFOs来接收和发送数据,256 bytes in ch0, 64 bytes in ch1 and 16 bytes in ch2 and ch3。UART包含了可编程的波特率、红外收发器、1~2位的停止位、5~8位的数据位、校验位。
1.png
1)至于引脚
2.png
3.jpg
4.png
5.jpg
2)关于中断
6.jpg
7.jpg
3)关于编程
使用UART与PC通信时,应该先用过程序来配置相应寄存器的参数,比如数据位、校验位、停止位、模式等等。
具体参考
section 08_connectivity_storage
1 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER
1.6  REGISTER DESCRIPTION
4)具体初配置
1. 将所涉及的UART通道管脚设置成UART功能。根据OK210板子的原理图和说提供的外设接口,这里配置UART2,即 GPA1_0和GPA1_1 分别作为RXD和TXD。
2. 配置时钟,选择时钟源:这里选择默认时钟 (PCLK=66 MHz),在iROM中的BL0中已经配置,可以不用再进行配置,详细的可以参考S5PV210的启动流程
3. 设置传输格式:配置ULCONn寄存器 -- 数据位、停止位、校验位、模式
4. 设置工作模式:配置UCONn寄存器 -- 数据接收和发送模式、时钟源
5. 配置UFCONn: 设置FIFO的启动或者禁止
6. 配置UMCONn:关闭流控制
7. 配偶子UBRDIVn 和 UDIVSLOTn:计算并设置波特率,datasheet上有详细的计算方法和例子
8.png
UDIVSLOT0部分需要查表:
9.png
8. 发送数据: 等待发送器为空,将要发送的8位数据赋给发送缓存寄存器UTXHn
9. 接收数据: 等待接收缓冲区有数据可读,从接收缓存寄存器URXHn中取出数据
5)OK210 硬件相关
10.png
11.png
12.jpg
13.jpg
代码如下
#define MP0_4CON (*(volatile unsigned long *)0xE0200340)
#define MP0_4DAT (*(volatile unsigned long *)0xE0200344)
#define GPD0CON   (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT (*(volatile unsigned long *)0xE02000A4)
#define GPA0CON (*(volatile unsigned long *)0xE0200000)
#define GPA1CON (*(volatile unsigned long *)0xE0200020)
// clock
#define APLL_LOCK (*(volatile unsigned long *)0xE0100000)
#define MPLL_LOCK (*(volatile unsigned long *)0xE0100008)
#define APLL_CON0 (*(volatile unsigned long *)0xE0100100)
#define APLL_CON1 (*(volatile unsigned long *)0xE0100104)
#define MPLL_CON (*(volatile unsigned long *)0xE0100108)
#define CLK_SRC0 (*(volatile unsigned long *)0xE0100200)
#define CLK_SRC1 (*(volatile unsigned long *)0xE0100204)
#define CLK_SRC2 (*(volatile unsigned long *)0xE0100208)
#define CLK_SRC3 (*(volatile unsigned long *)0xE010020c)
#define CLK_SRC4 (*(volatile unsigned long *)0xE0100210)
#define CLK_SRC5 (*(volatile unsigned long *)0xE0100214)
#define CLK_SRC6 (*(volatile unsigned long *)0xE0100218)
#define CLK_SRC_MASK0 (*(volatile unsigned long *)0xE0100280)
#define CLK_SRC_MASK1 (*(volatile unsigned long *)0xE0100284)
#define CLK_DIV0 (*(volatile unsigned long *)0xE0100300)
#define CLK_DIV1 (*(volatile unsigned long *)0xE0100304)
#define CLK_DIV2 (*(volatile unsigned long *)0xE0100308)
#define CLK_DIV3 (*(volatile unsigned long *)0xE010030c)
#define CLK_DIV4 (*(volatile unsigned long *)0xE0100310)
#define CLK_DIV5 (*(volatile unsigned long *)0xE0100314)
#define CLK_DIV6 (*(volatile unsigned long *)0xE0100318)
#define CLK_DIV7 (*(volatile unsigned long *)0xE010031c)
#define CLK_DIV0_MASK 0x7fffffff
#define APLL_MDIV       0x7d
#define APLL_PDIV       0x3
#define APLL_SDIV       0x1
#define MPLL_MDIV 0x29b
#define MPLL_PDIV 0xc
#define MPLL_SDIV 0x1
#define set_pll(mdiv, pdiv, sdiv) (1<<31 | mdiv<<16 | pdiv<<8 | sdiv)
#define APLL_VAL set_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)
#define MPLL_VAL set_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)
//#define PLL_OFF
// UART
#define ULCON3 (*(volatile unsigned long *)0xE2900C00)
#define UCON3 (*(volatile unsigned long *)0xE2900C04)
#define UFCON3 (*(volatile unsigned long *)0xE2900C08)
#define UMCON3 (*(volatile unsigned long *)0xE2900C0C)
#define UFSTAT3 (*(volatile unsigned long *)0xE2900C18)
#define UBRDIV3 (*(volatile unsigned long *)0xE2900C28)
#define UDIVSLOT3 (*(volatile unsigned long *)0xE2900C2C)
#define UTXH3 (*(volatile unsigned long *)0xE2900C20)
#define URXH3 (*(volatile unsigned long *)0xE2900C24)
#define UTRSTAT3 (*(volatile unsigned long *)0xE2900C10)
void clock_init(void)
{
    CLK_SRC0 = 0x0;// close PLL
    APLL_LOCK= 0x0000FFFF;
    MPLL_LOCK = 0x0000FFFF;   
    APLL_CON0 =APLL_VAL; //FOUT= MDIV * FIN / (PDIV*2^(SDIV-1)) = 0x7d*24/(0x3*2^(1-1))=1000 MHz
    MPLL_CON = MPLL_VAL;// FOUT = MDIV*FIN/(PDIV*2^SDIV)=0x29b*24/(0xc*2^1)= 667 MHz
    CLK_SRC0= 0x10001111;// FOUT = MDIV*FIN/(PDIV*2^SDIV)=0x29b*24/(0xc*2^1)= 667 MHz
}
void uart_init()
{
    GPA0CON= 0x22222222;
    GPA1CON= 0x2222;//配置引脚为RX/TX功能
    UFCON3= 0x1;//使能FIFO
    UMCON3= 0x0;//无流控
    ULCON3= 0x3;//数据位8,无校验,停止位1
    UCON3= 0x5; //时钟为PCLK,禁止中断,使能UART收 发
    UBRDIV3= 35;//设置波特率
    UDIVSLOT3= 0x1;
}
static void Delay(long count)
{
     volatile int i, j = 0;
     volatile static int loop = 800000000/10000;
     for(;count > 0;count--)
         for(i=0;i < loop; i++) { j++; }
}
void main(void)
{
     GPD0CON &=~(0xF << 0);
     MP0_4CON = 0x00000000;
     clock_init();
     uart_init(); // com3  115200 8 1
     while(1)
     {
  while (!(UFSTAT3 & 0xFF)==0)
  {
   UTXH3= URXH3; // 将接收的数据发送
  }
     }
}

更多回帖

发帖
×
20
完善资料,
赚取积分