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

  • 相关阅读:
    《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数
    《程序员代码面试指南》第七章 位运算 在其他数都出现偶数次的数组中找到出现奇数次的数
    《程序员代码面试指南》第七章 位运算 整数的二进制表达中有多少个1
    《程序员代码面试指南》第七章 位运算 只用位运算不用算术运算实现整数的加减乘除运算
    Java基础 TreeSet()来实现数组的【定制排序】 : Comparable接口(自然排序) 或者 Comparator接口 (定制排序)
    Java 基础
    Java 基础
    【Java基础-实验7】Banking_7 -添加银行透支扣款系统的 thorw异常机制
    Java基础-异常处理机制 及异常处理的五个关键字:try/catch/finally/throw /throws
    Java 基础 面向对象: 接口(interface )概念 以及接口之练习3 -定义一个接口用来实现两个对象的比较并 判断instanceof是否为同类
  • 原文地址:https://www.cnblogs.com/chd-zhangbo/p/5296046.html
Copyright © 2011-2022 走看看