S5P4418裸机开发(六):串口初试,简单回显(轮询模式)

手册上对S5P4418串口的概述

这里写图片描述

  • UART0 ~ 4,五个串口
  • 可编程FIOF
  • UART0,1,2支持DMA
  • IrDA(红外数据组织)SIR ENDEC
UART配置基本流程
  • TX引脚配置为输出模式,RX引脚配置为输入模式
  • 配置UART时钟
  • 配置波特率,数据位,停止位,校验位等
  • 使能
UART0为例,GPIO配置

这里写图片描述

  • TX GPIOD18 AD19 Function1
  • RX GPIOD14 AE19 Function1
时钟
  • UART时钟要求:
    这里写图片描述
  • 相关寄存器:
    这里写图片描述
    这里写图片描述

  • UARTCLKENB 时钟生成使能

  • UARTCLKGEN0L 反转输出,PLL选择,分频设置,时钟输出使能

这里使用PLL0来生成UART时钟,PLL0默认是550MHz,分频系数设置(55 - 1),生成的UART时钟为10MHz。

波特率
  • 波特率配置规则
    这里写图片描述
    分整数部分BRDI,小数部分BRDF
    UARTCLK / (16 * BaudRate) = BRDI + BRDF

  • 相关寄存器:
    这里写图片描述

    • UARTIBRD[15:0] = BRDI
    • UARTFBRD[5:0] = int(BRDF * 2n + 0.5) n等于UARTFBRD寄存器位数,即32
    • 115200的波特率,UARTIBRD[15:0] = int(10MHz / (16 * 115200)) = 5; UARTFBRD[5:0] = int(0.4253472 * 2 * 32 + 0.5) = 27;
数据位,停止位,校验位

这里写图片描述

  • UARTLCR_H[6:5] - WLEN 数据位长度
  • UARTLCR_H[4] - FEN FIFO使能位
  • UARTLCR_H[3] - STP2 停止位,0表示1位,1表示2位停止位
  • UARTLCR_H[1] - PWN 校验位使能
使能

这里写图片描述
这里写图片描述
这里写图片描述

  • UARTCR[0] - UARTEN 串口总使能
  • UARTCR[8] - TXE 发送使能
  • UARTCR[9] - RXE 接收使能
标志位

这里写图片描述
这里写图片描述

  • UARTFR[3] - BUSY 当窗口正在发送数据时置位
  • TXFF TXFE 发送FIFO满,空
  • RXFF RXFE 接收FIFO满,空
  • 轮询模式下,通过读取这几位来判断是否有数据要接收,是否能发送数据;
数据寄存器

这里写图片描述
这里写图片描述
+ 发送数据时写UARTDR[7:0]
+ 接收数据时读UARTDR[7:0]


代码
// uart.c
/*
 * UART0
 * TX GPIOD18 AD19 function1
 * RX GPIOD14 AE19 function1
 */

#include "../gpio.h"
#include "uart.h"

void uart0_init(int baud){

    GPIODALTFN0 &= ~((3 << 28));
    GPIODALTFN1 &= ~((3 << 4));
    GPIODOUTENB &= ~((1 << 18) | (1 << 14));

    GPIODALTFN0 |= ((1 << 28));
    GPIODALTFN1 |= ((1 << 4));
    GPIODOUTENB |= ((1 << 18));

    // 设置UART0时钟
    UARTCLKENB |= (1 << 2);
    UARTCLKGEN0L &= ~((3 << 2) | (0xFF << 5));
    UARTCLKGEN0L |= ((55 - 1) << 5);
    // UARTCLKGEN0L |= ((200 - 1) << 5);

    // 配置波特率 115200
    UARTIBRD &= ~0xFFFF;
    UARTIBRD |= 5;
    UARTFBRD &= ~0x3F;
    UARTFBRD |= 27;

    // 8N1
    UARTLCR_H &= ~((3 << 5) | (0x1F << 0));
    UARTLCR_H |= ((3 << 5));

    // UART TX RX使能
    UARTCR |= ((1 << 0) | (1 << 8) | (1 << 9));
}

char getc(){

    // if((UARTFR >> 6) & 1){
    //     rec = UARTDR & 0xFF;
    // }
    while((UARTFR & (1 << 6)) == 0);
    return UARTDR;
}

void putc(char c){
    while(UARTFR & (1 << 3));
    UARTDR = c;
}
//main.c

while(1){
    ch = getc();
    if(ch == '\n'){
        putc('\r');
    }
    putc(ch);
}

码云_4_uart


时钟问题:
PLLSETREG0 0x100D1302 -> PMS = 3 275 2 = 550MHz

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值