X210串口配置与stdio移植

串口控制器初始化关键步骤
  (1)初始化串口的Tx和Rx引脚所对应的GPIO(查原理图可知Rx和Rx分别对应GPA0_1和GPA0_0)
  (2)GPA0CON(0xE0200000),bit[3:0] = 0b0010 bit[7:4] = 0b0010
  (3)初始化这几个关键寄存器UCON0 ULCON0 UMCON0 UFCON0 UBRDIV0 UDIVSLOT0
主要的几个寄存器
  (1)ULCON0 = 0x3 // 0校验位、8数据位、1停止位
  (2)UCON = 0x5 // 发送和接收都是polling mode
  (3)UMCON0 = 0x0 // 禁止modem、afc
  (4)UFCON0 = 0x0 // 禁止FIFO模式
  (5)UBRDIV0和UDIVSLOT0和波特率有关,要根据公式去算的

波特率的计算和设置
  (1)第一步,用PCLK_PSYS和目标波特率去计算DIV_VAL: DIV_VAL = (PCLK / (bps x 16)) ?1
  (2)第二步,UBRDIV0寄存器中写入DIV_VAL的整数部分
  (3)第三步,用小数部分*16得到1个个数,查表得uBDIVSLOT0寄存器的设置值

#define GPA0CON        0xE0200000
#define UCON0         0xE2900004
#define ULCON0         0xE2900000
#define UMCON0         0xE290000C
#define UFCON0         0xE2900008
#define UBRDIV0     0xE2900028
#define UDIVSLOT0    0xE290002C

#define UTRSTAT0    0xE2900010
#define UTXH0        0xE2900020
#define URXH0        0xE2900024    

#define rGPA0CON    (*(volatile unsigned int *)GPA0CON)
#define rUCON0        (*(volatile unsigned int *)UCON0)
#define rULCON0        (*(volatile unsigned int *)ULCON0)
#define rUMCON0        (*(volatile unsigned int *)UMCON0)
#define rUFCON0        (*(volatile unsigned int *)UFCON0)
#define rUBRDIV0    (*(volatile unsigned int *)UBRDIV0)
#define rUDIVSLOT0    (*(volatile unsigned int *)UDIVSLOT0)
#define rUTRSTAT0    (*(volatile unsigned int *)UTRSTAT0)
#define rUTXH0        (*(volatile unsigned int *)UTXH0)
#define rURXH0        (*(volatile unsigned int *)URXH0)
//串口初始化
void uart_init()
{    //初始化rx tx对应GPIO引脚
    rGPA0CON&=~(0xff<<0);//将 bit0~7清零
    rGPA0CON|=0x22;        //设置 _0 _1引脚为RX TX
    //串口相关寄存器
    rULCON0=0x3;
    rUCON0=0x5;
    rUMCON0=0;
    rUFCON0=0;
    //波特率计算相关

/*     //9600
    rUBRDIV0=433;
    rUDIVSLOT0=0x2222;
     */
    //用66.7MHZ算
    //115200
    //66700000/(115200*16)-1
    rUBRDIV0=35;
    // rUBRDIV0余数*16 然后查表
    rUDIVSLOT0=0x0888;
}
//串口发送一字节
void uart_putc(char c)
{
    while(!(rUTRSTAT0&(1<<1)));//等待发送结束
    rUTXH0=c;
}
char uart_getc()
{
        while(!(rUTRSTAT0&(1<<0)));//等待发送结束
        return rURXH0;
}

2.移植stdio(部分代码展示)

int printf(const char *fmt, ...)
{
    int i;
    int len;
    va_list args;

    va_start(args, fmt);
    len = vsprintf(g_pcOutBuf,fmt,args);
    va_end(args);
    for (i = 0; i < strlen(g_pcOutBuf); i++)
    {
        putc(g_pcOutBuf[i]);
    }
    return len;
}

int scanf(const char * fmt, ...)
{
    int i = 0;
    unsigned char c;
    va_list args;

    while(1)
    {
        c = getc();
        putc(c);
        if((c == 0x0d) || (c == 0x0a))
        {
            g_pcInBuf[i] = ‘\0‘;
            break;
        }
        else
        {
            g_pcInBuf[i++] = c;
        }
    }

    va_start(args,fmt);
    i = vsscanf(g_pcInBuf,fmt,args);
    va_end(args);

    return i;
}

Makefile

CC        = arm-linux-gcc
LD         = arm-linux-ld
OBJCOPY    = arm-linux-objcopy
OBJDUMP    = arm-linux-objdump
AR        = arm-linux-ar

INCDIR    := $(shell pwd)
# C预处理器的flag,flag就是编译器可选的选项
CPPFLAGS    := -nostdlib -nostdinc -I$(INCDIR)/include
# C编译器的flag
CFLAGS        := -Wall -O2 -fno-builtin

#导出这些变量到全局,其实就是给子文件夹下面的Makefile使用
export CC LD OBJCOPY OBJDUMP AR CPPFLAGS CFLAGS

objs := start.o led.o clock.o uart.o main.o
objs += lib/libc.a

uart.bin: $(objs)
    $(LD) -Tlink.lds -o uart.elf $^
    $(OBJCOPY) -O binary uart.elf uart.bin
    $(OBJDUMP) -D uart.elf > uart_elf.dis
    gcc mkv210_image.c -o mkx210
    ./mkx210 uart.bin 210.bin

lib/libc.a:
    cd lib;    make;    cd ..

%.o : %.S
    $(CC) $(CPPFLAGS) $(CFLAGS) -o [email protected] $< -c

%.o : %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -o [email protected] $< -c

clean:
    rm *.o *.elf *.bin *.dis mkx210 -f
    cd lib; make clean; cd ..
时间: 2024-11-05 15:49:09

X210串口配置与stdio移植的相关文章

STM32F103串口配置,并且使用printf进行打印

首先要配置串口时钟: // USART1 clock enable    RCC_APB2PeriphClockCmd(   RCC_APB2Periph_USART1 |   RCC_APB2Periph_GPIOA |   RCC_APB2Periph_AFIO, ENABLE); 然后再配置端口,在配置串口,再使能即可. void USART1_Init(void)   {   /////// config the gpio   GPIO_InitTypeDef GPIO_InitStru

树莓派相关-树莓派串口配置方法

树莓派是否能够使用串口呢,答案是肯定的 ,以下是具体方法 1.树莓派的第一排的第三,四,五个分别,也就是下图的6,8,10三个端口分别是地,TX与RX,与被连接设备连接起来.注意树莓派的TX要连接从设备的RX,树莓派的RX要连接树莓派的TX 2.树莓派上只有一个串口,系统默认将它作为调试口,所以不能直接当成普通串口进行编程和使用,需要先将调试口的配置去掉,再使用.此处需要修改两处文件 2.1  修改/boot/cmdline.txt 在终端输入如下指令 sudo nano /boot/cmdli

串口配置流程

串口配置流程 1.保存原串口信息,使用tcgetattr()函数; struct termios newtio, oldtio; tcgetattr(fd, &oldtio); 2.激活选项有CLOCAL和CREAD,用于本地连接和接收使能; newtio.c_cflag |= CLOCAL | CREAD; 3.设置波特率,使用函数cfsetispeed()和cfsetospeed(); cfsetispeed(&newtio, B115200); cfsetospeed(&ne

Linux 查看串口配置 去除回显

Linux 查看串口配置 Stty -F /dev/ttyUSB0 去掉串口回显 Stty -F /dev/ttyUSB0 -echo 监控串口数据接收 Cat /dev/ttyUSB0 & 原文地址:https://www.cnblogs.com/liushuhe1990/p/9609039.html

S5PV210_uart stdio移植

1.stdio : standard input output 标准输入输出 2.printf函数调用到的2个关键函数: vsprintf : 格式化打印信息,最终得到纯字符串的打印信息等待输出 putc : 操控标准输出的硬件,将信息发送出去 3.移植步骤: (1)解压printf.rar到uart_stdio目录,解压后会有include.lib两个目录,其中include放的是相关头文件,lib放的是printf.scanf相关的代码: (2)修改uart_stdio目录下的makefil

树莓派相关-树莓派串口配置方法(转)

转:http://blog.csdn.net/yangqicong11/article/details/26571787 树莓派是否能够使用串口呢,答案是肯定的 ,以下是具体方法 1.树莓派的第一排的第三,四,五个分别,也就是下图的6,8,10三个端口分别是地,TX与RX,与被连接设备连接起来.注意树莓派的TX要连接从设备的RX,树莓派的RX要连接树莓派的TX 2.树莓派上只有一个串口,系统默认将它作为调试口,所以不能直接当成普通串口进行编程和使用,需要先将调试口的配置去掉,再使用.此处需要修改

Raspberry Pi TXD 和RXD、USB串口配置

对于树莓派串口进行设置,是因为我想用树莓派与外部设备连接,即将串口设置为通用串口. 1.关闭板载蓝牙功能 首先,打开你的Terminal,输入一下语句: sudo systemctl disable hciuart 然后,编辑文档/lib/systemd/system/hciuart.service,命令如下: sudo nano /lib/systemd/system/hciuart.service 将文档中所有的 "ttyAMA0"改成"ttyS0",总共要修改

Linux嵌入式开发环境之串口配置

开发平台:Ubuntu 串口工具:putty 安装方法:su apt-get install putty 串口使用方法: 1.将串口连接至PC,在命令行输入putty,打开putty界面 2.将连接方式设为serial,设备选择为/dev/ttyUSB0(本机为USB转串口,其他情况可尝试/dev/ttyS0),波特率根据情况选择为9600或者115200(本机为115200) 3.将开发板上电,检查串口输入是否正常(无乱码,显示正常),如果不正常,则更换波特率解决. 原文地址:https://

串口配置