zoukankan      html  css  js  c++  java
  • ok6410串口裸机总结

    1.串口角色:
    (1)数据传输通道
    (2)控制台


    2.通讯参数
    (1)波特率:衡量传输速率的快慢,每秒钟传输数据的位数(bit)
    (2)数据位:有效数据
    (3)起始位:线路空闲的时候是高电平,当检测到低电平认为有数据传输开始,所以是低电平。
    (4)奇偶校检位:检测数据传输是否正确
    (5)停止位:表明一帧数据传输结束


    以上这些参数发送方和接收方要一致


    3.硬件引脚:RXD,TXD,地

    4.初始化
    (1)设置引脚工作模式
    (2)设置数据格式(ULCON)
    (3)设置工作模式(DMA,轮询,中断),(UCON)
    (4)设置波特率(UBRDIV)

      备注:2440的波特率设置是通过UBRDIV0设置       DIV_VAL = (PCLK / (bps x 16 ) ) −1

         6410和210的波特率是通过UBRDIV0和UDIVSLOT0设置,其中UBRDIV0和2440的用法一样,UDIVSLOT0寄存器中保存的是DIV_VAL中的小数部分,具体方法为小数部分*16之后查表取值



    5.发送
    (1)(UTRSTAT)
    (2)(UTXH)

    void putc(unsigned char c)  /* 串口发送函数 */
    {
        while (UFSTAT0 & (1<<14)); /* 如果TX FIFO满,等待 */
        UTXH0 = c;                         /* 写数据 */
    }

    6.接收
    (1)(UTRSTAT)
    (2)(URXH)

    unsigned char getc(void)  /* 串口接收函数 */
    {
        unsigned char ret;
        while ((UFSTAT0 & 0x7f) == 0);  /* 如果RX FIFO空,等待 */
        ret = URXH0;                   /* 取数据 */
        if((ret == 0x0d) || (ret == 0x0a))  /* 0d---回车 0a---换行 */
        {
            putc(0x0d);
            putc(0x0a);
        }
        else
        {
            putc(ret+1);
        }
    
        return ret;
    }

    7.关于用到的协助函数
    (1) va_list args;
    声明一个变参列表
    (2)unsigned char str[1024];
    声明一个字符数组,用来存放转换以后的字符串
    (3) va_start(args,fmt);
    开始生成可变参数列表里的元素
    (4) vsprintf(str,fmt,args);
    将可变参数列表args里的元素按照fmt的格式写入字符串str
      (5) va_end();
    结束转换,清空变参列表,使得args指针无效(因为他是一个列表,所以相当于一个”数组“,故数组名是一个指针)。
         
    8.关于移植函数库
    (1)将提供的lib和include文件夹复制到junboot目录下,主要是编译lib目录
    (2)由下面内容可以看出lib目录下的文件最终编译的结果是得到lib.o,所以我们要将lib.o整合到前面产生的jun-boot中
    修改顶层Makefile,使得将当前路径下lib目录的编译结果加入到原有的jun-boot一起进行新的编译。

    (3)最终目标jun-boot.bin,
    (4)jun-boot.elf是由.o文件产生的,将这些.o文件赋值给一个变量,当然这个截图里少了uart.o文件。
    则jun-boot.elf的产生:
    (5)将print.c剪切到lib下
    (6)将OBJS添加上lib/lib.o
    (7)添加编译子目录下的lib.o的规则,以及clean伪目标规则。其中-C指明后面的目录lib,all是由于在lib子目录的Makefile中最终目标就是all。

    (8)此时编译会出现以下错误
    但是查看ctype.c里,发现引用的头文件里已经定义了这些符号,原因在于交叉编译器寻找头文件的路径没有包含这个路径。所以我们要利用-I选项添加头文件路径。而这个选项则应该加在lib子目录下的Makefile文件中,打开该文件发现
    已经有了一个CFLAGS变量,该变量用来保存一些编译选项,我们只要在改变量里面添加-I选项就可以。但是这个变量一般应该出现在顶层目录的Makefile中,打开顶层 Makefile发现并未定义,所以在顶层Makefile中定义:
    最后还要输出CFLAGS以供子目录使用


    (9)此时编译还有以下错误
    原因是我们没有添加必要的头文件vsprintf.h,于是在print.c里面添加头文件。
    (10)再次编译发现还是有错误
    原因是内联函数造成的,所以编译选项还要再改进。即CFLAGS
    同时现在的CFLAGS主要使用到main.c所以还要修改main.c的编译选项,即加进去CFLAGS编译选项
    (11)printf以及scanf的实现(print.c)
    9.代码结构优化
    (1)将一般外设.c文件剪切到新建的dev子目录
    (2)编写dev子目录的Makefile
    (3)修改顶层的Makefile

  • 相关阅读:
    Composite in Javascript
    Model Validation in Asp.net MVC
    HttpRuntime.Cache vs. HttpContext.Current.Cache
    Controller Extensibility in ASP.NET MVC
    The Decorator Pattern in Javascript
    The Flyweight Pattern in Javascript
    Model Binding in ASP.NET MVC
    Asp.net MVC
    jQuery Ajax 实例 全解析
    ASP.NET AJAX入门系列
  • 原文地址:https://www.cnblogs.com/chd-zhangbo/p/5296046.html
Copyright © 2011-2022 走看看