ok6410串口裸机总结

发布者:Yinyue1314最新更新时间:2024-07-19 来源: cnblogs关键字: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


关键字:ok6410  串口  裸机 引用地址:ok6410串口裸机总结

上一篇:ok6410 3.0.1内核调用V4L接口出错解决方法
下一篇:OK6410内存及启动流程

推荐阅读最新更新时间:2024-11-12 21:03

STM32串口之空闲中断
背景 在做Nbiot的一个路灯项目,NBiot模块一般都是串口接口,使用AT指令集,对接中国移动onenet平台。先用串口助手去测试,流程测试OK之后需要在MCU上重新写一遍。一开始用的STC15系列的MCU,然后跟平台之间对接协议很多,代码量较大,所以换到了STM32F1系列的MCU。 在STC15MCU上面通过串口接收数据只能老老实实用接收中断来做,每接收一帧数据都需要判断帧头帧尾,一帧结束再处理。之前就听说过STM32串口上面有帧中断,一直没有用过,然后才有了这篇博客。 备注:一帧数据是表示一个或多个字节组成的有含义的字符串。 STM32串口 IDLE中断 IDLE其实是 空闲的意思。IDLE中断叫空闲中断
[单片机]
STM32<font color='red'>串口</font>之空闲中断
TINY4412裸机程序,按键检测
一、控制原理说明 先看一下原理图: 首先把按键对应的GPIO设置为输入模式,修改GPX3CON寄存器(板子不同,可能对应的GPIO管脚不同),通过上图可知当没有按下按键时,对应的GPIO状态为高电平,当有按键被按下时,对应的GPIO变为低,我们在程序一直检测这几个GPIO状态即可。 二、程序说明 其中Start.s文件同上一个实验完全相同;链接脚本key.lds的内容和led.lds完全相同,只把名字改了改;Makefile的内容也大部分一样,也只是改了改里边文件的名字,key.c的文件需要重新编写,代码如下: /* * 程序说明 * 一上电,4个LED全亮,当某个按键被按下,则对应的LED熄灭(可同时按下多个键) *
[单片机]
TINY4412<font color='red'>裸机</font>程序,按键检测
STM32L1XX使用HAL_UART_Transmit_DMA发送串口数据
使用STM32CubeMX生成初始化代码。 问题: HAL_UART_Transmit_DMA函数只能调用一次,第二次就返回状态HAL_UART_STATE_BUSY 0x02。 原因: stm32l1xx_hal_uart.c开头有描述 (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA() and HAL_UART_Receive_DMA() APIs): (+++) Declare a DMA handle structure for the Tx/Rx channel. (+
[单片机]
STM32L1XX使用HAL_UART_Transmit_DMA发送<font color='red'>串口</font>数据
s3c2440裸机开发调试环境(MDK4.72,Jlink v8,mini2440)
我的开发环境:windows 7 32位,J-linkv8,mini2440开发板一块。最后选择了:MDK4.72版本,J-ink v8的当前最新版本J-linkARM v4.94。 1)打开Keil uVision4新建一个工程: 2)新建一个目录用于存放我们的工程文件,这样我用新建一个test目录:并且取工程名为test并保存: 3)接下来选择CUP database:我们选择samsung的S3C2440A,点击OK;之后会出现第二个图问你是否拷贝'S3C2440.s'到工程文件夹并加入到工程里,S3C2440.s是启动代码我们选择YES 4)然后我们需要对S3C2440.s进行一些
[单片机]
s3c2440<font color='red'>裸机</font>开发调试环境(MDK4.72,Jlink v8,mini2440)
单片机用串口传输浮点型数据方法
我们都知道,单片机串口传输的单位是字节,而浮点型数是占四个字节,简单思路是用一个char型指针指向浮点型数据,利用指针寻址即可以将浮点数拆成四个char数据。接收端接收到四个char型数,为了还原成float型数据,采用共用体是一不错的方式。测试代码如下: 程序运行结果如下: 注意:结构体中如果用有符号字符型数据,在printf打印时有出点小问题,大家可以试试看的,嘿嘿 当然还有个嵌入式常说的大小端问题,相信大家都明白咋咋回事了。
[单片机]
单片机用<font color='red'>串口</font>传输浮点型数据方法
I2C与串口通信模块电子电路设计
   I2C 通信模块   OZ89采样模块将采集处理后的数据通过I2C总线发送到LF2407,由于LF2407自身不带I2C 接口,本设计利用PCA9564扩展其I2C接口。为了防止电磁干扰影响I2C总线上数据的传输,必须对总线信号进行隔离,考虑到I2C 总线是双向传输的,使用ADuM1250双向隔离芯片进行隔离。PCA9564及双向隔离电路如图2所示。   图2:PCA9564 及双向隔离电路   串口通信模块   电池管理系统将采集处理后的数据通过串口发送到PC机界面上,实现人机交互。通过串口界面,可以观察到电池的总电压、单体电压、电流、SOC、故障状态、充放电功率等参数,还可以通过串口发送实现管理系统的在线标定。其
[电源管理]
I2C与<font color='red'>串口</font>通信模块电子电路设计
IMX6ULL裸机-3-SPI控制器
1 IMX6ULL SPI控制器 NXP的6ull参考手册第Chapter 20介绍了SPI控制器,Enhanced Configurable SPI (ECSPI) 。 1.1 特点 ①、全双工同步串行接口。 ②、可配置的主/从模式。 ③、四个硬件片选信号,支持多从机。 ④、发送和接收都有一个 32x64 的 FIFO。 ⑤、片选信号 SS/CS,时钟信号 SCLK 的极性相位(CPOL,CPHA)可配置。 ⑥、支持 DMA ⑦、SCK最高可以到输入参考时钟高达60Mhz 1.2 框图 最右边是引脚,SCLK,MISO,MOSI等,上面是外围总线,通过APB总线进行寄存器读写,INTREG,CONREG等等。TXDATA和
[单片机]
13.Smart210串口驱动基于12的补充
上面的12节里,已经讲了2440有关串口的设置和操作。本来,2440,6410和210的串口操作应该是几乎一样的。在进行6410和210的设置的时候,发现在波特率的设置,6410和210的原理是一样的,但是跟2440有点不一样。所以下面以210为例子,说明6410和210波特率的设置。 寄存器: UBRDIV0=(int)(PCLK_PSYS/(BAUD*16)-1);//UBRDIV0保存该公式计算后的整数部分。 UBRDIV0=(int)(66000000/(115200*16)-1)=(int)(35.8-1)=(int)(34.8)=34。即取整数部分为34. //UDISLOT0=保存该公式计算后的小数部分*
[单片机]
13.Smart210<font color='red'>串口</font>驱动基于12的补充
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved