(三) UART 串口通讯

UART  : university asynchronous receiver and transmitter UART  // 通用异步接收器和发送器

为什么要有串口:因为许多嵌入式设备没有显示屏,无法获得设备的实事数据信息,所以可以通过 UART 串口和超级终端相连,打印嵌入式设备输出信息。也可以通过串口跟踪和调试。

比如设备: 网络路由器、交换机通过串口配置, GPS接收器通过串口输出GPS接收的数据。

1、异步通信技术:发送和接收方没有同步时钟,只有数据线,但是协商好了协议,(固定频率)进行数据采样。 即 波特率 bit per second 保证正确性

2、传输模式: 轮询模式、中断模式、DMA模式

3、S3C2440 UART 控制器 :

UART 接收装置和发送装置 包含一个 64Bytes 的缓冲器(所以分为 缓冲模式 和 非缓冲模式)

4、数据帧: 是 uart 最基本的通信单元,包含 开始位、数据位、校验位、停止位(双方约定好数据帧,指定同一波特率,确保数据传输同步)

具体还是要看芯片手册相关寄存器,不是很难。

——————————————————————————————————————————————————————————————————————————

F:\ARM+LINUX\深入浅出底层嵌入式开发\work\armarch\uart_init

启动代码:

;
; UART串口实验
;

GPBCON        EQU        0x56000010
GPBDAT        EQU        0x56000014
    AREA Init, CODE, READONLY
    ENTRY
start
; close watchdog
    ldr r0, = 0x53000000    ; 将看门狗控制寄存器地址放入r0
    mov r1, #0
    str r1, [r0]            ; 设置看门狗控制寄存器的值为0

    bl initmem                ; 跳转到initmem代码段,初始化内存

    IMPORT xmain            ; 引入main.c中的xmain函数
    ldr sp, =0x34000000        ; 调用C程序之前先初始化栈指针
    ldr lr, =loop            ; 设置xmain函数的返回地址
    ldr pc, =xmain            ; 跳转到C程序中的xmain函数的入口处执行

loop
    b loop                    ; 死循环

initmem                        ; 内存初始化
    ldr r0, =0x48000000        ; 加载内存相关寄存器首地址r0
    ldr r1, =0x48000034        ; 加载内存相关寄存器尾地址到r1

    adr r2, memdata            ; 将寄存器配置数据地址段首地址加载到r2

initmemloop
    ldr r3, [r2], #4        ; 循环设置存寄存器
    str r3, [r0], #4
    teq r0, r1
    bne initmemloop            ; 循环到最后一个寄存器时退出函数
    bx  lr

memdata
    DCD    0x22000000         ;BWSCON
    DCD    0x00000700        ;BANKCON0
    DCD    0x00000700        ;BANKCON1
    DCD    0x00000700        ;BANKCON2
    DCD    0x00000700      ;BANKCON3
    DCD    0x00000700        ;BANKCON4
    DCD    0x00000700        ;BANKCON5
    DCD    0x00018005        ;BANKCON6
    DCD    0x00018005        ;BANKCON7
    DCD    0x008e07a3        ;REFRESH
    DCD    0x000000b1        ;BANKSIZE
    DCD    0x00000030        ;MRSRB6
    DCD    0x00000030        ;MRSRB7

    END

init.s

xmain 函数

 1 /* xmain.c */
 2
 3 /* GPIO registers */
 4 #define    GPHCON                (*(volatile unsigned long *)0x56000070)
 5 #define    GPHDAT                (*(volatile unsigned long *)0x56000074)
 6 #define    GPHUP                (*(volatile unsigned long *)0x56000078)
 7
 8 /*UART registers*/
 9 #define    ULCON0                (*(volatile unsigned long *)0x50000000)
10 #define    UCON0                (*(volatile unsigned long *)0x50000004)
11 #define    UFCON0                 (*(volatile unsigned long *)0x50000008)
12 #define    UMCON0                (*(volatile unsigned long *)0x5000000c)
13 #define    UTRSTAT0            (*(volatile unsigned long *)0x50000010)
14 #define    UTXH0                 (*(volatile unsigned char *)0x50000020)
15 #define    URXH0                 (*(volatile unsigned char *)0x50000024)
16 #define    UBRDIV0                (*(volatile unsigned long *)0x50000028)
17
18 #define    TXD0READY    (1<<2)  //发送数据状态OK
19 #define    RXD0READY    (1)        //接收数据状态OK
20
21 /* UART串口初始化 */
22 void uart_init( )
23 {
24     GPHCON |= 0xa0;        //GPH2,GPH3 used as TXD0,RXD0
25     GPHUP     = 0x0;        //GPH2,GPH3内部上拉
26     ULCON0     = 0x03;    //8N1
27     UCON0     = 0x05;    //查询方式为轮询或中断;时钟选择为PCLK
28     UFCON0 = 0x00;        //不使用FIFO
29     UMCON0 = 0x00;        //不使用流控
30     UBRDIV0 = 12;        //波特率为57600,PCLK=12Mhz
31 }
32
33 /* UART串口单个字符打印函数 */
34 extern void putc(unsigned char c)
35 {
36     while( ! (UTRSTAT0 & TXD0READY) );
37     UTXH0 = c;
38 }
39
40 /* UART串口接受单个字符函数 */
41 extern unsigned char getc(void)
42 {
43     while( ! (UTRSTAT0 & RXD0READY) );
44     return URXH0;
45 }
46
47 /* UART串口字符串打印函数 */
48 extern int printk(const char* str)
49 {
50     int i = 0;
51     while( str[i] ){
52         putc( (unsigned char) str[i++] );
53     }
54     return i;
55 }
56
57 __inline void delay(int msec)
58 {
59     int i, j;
60     for(i = 1000; i > 0; i--)
61         for(j = msec*10; j > 0; j--)
62             /* do nothing */;
63 }
64
65 /* xmain 通过UART串口打印字符串 */
66 int xmain()
67 {
68     uart_init();
69     while(1)
70     {
71         delay(10);
72         printk("Uart串口打印试验\r\n");
73     }
74    //  return 0;    这句省去,这样 就不会出现  statement is unreachable
75 }

烧到nor flash ,自己到超级终端自己摸索!!!!(参考:杨铸 P151 页)

时间: 2024-10-01 04:11:06

(三) UART 串口通讯的相关文章

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

Linux串口通讯

一.串口简介 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口.虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代:而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之.但是,一方面因为串口本身造价便宜技术成熟,另一方面因为

Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块

一直想写一份技术文档,但因为自感能力有限而无从下笔,近期做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了很多问题,也在网上查了很多资料,在完毕主要功能后.也有一些人在网上问我一些问题.这里写下这篇文档算是一个阶段性的总结. 假设反响好.兴许将会发上Android Stub与新版Android HAL的学习文档. 因为蓝牙模块是串口通讯机制.使用C语言来訪问,而Android的应用层採用Java.无法直接操作硬件.故使用JNI的技术实现主要功能.Android的JN

ZigBee学习三 UART通信

ZigBee学习三 UART通信 本实验只对coordinator.c文件进行改动就可以实现串口的收发. 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique message ID (counter) afAddrType_t GenericApp_DstAddr; unsigned char uartbuf[128];/**************************************************

S3C2440 UART串口驱动

++++++++++++++++++++++++++++++++++++++++++ 本文转载自mr_raptor的专栏,感谢mr_raptor大神. http://blog.csdn.net/mr_raptor/article/details/6556133 ++++++++++++++++++++++++++++++++++++++++++ 通用异步接收器和发送器(Universal Asynchronous Receiver and Transmitter)简称UART.通常是嵌入式设备中

Win10 IoT C#开发 3 - UART 串口通信

Windows 10 IoT Core 是微软针对物联网上市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug功能可以进行断点追踪调试.C#语言本身也有很好的用户基础,相信Win10 IoT 不远的将来会火起来.上个月帮朋友解决了关于Win10 IoT 的一些技术问题,当前也有很多公司在尝试采用Win10 IoT进行开发,可能也会遇到这些问题,相关文档现在还非常少,这里写出来供大家参考.因为要做一个Jav

Win10 IoT C#开发 4 - UART 串口通信

原文:Win10 IoT C#开发 4 - UART 串口通信 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug功能可以进行断点追踪调试.C#语言本身也有很好的用户基础,相信Win10 IoT 不远的将来会火起来.上个月帮朋友解决了关于Win10 IoT 的一些技术问题,当前也有很多公司在尝试采用Win10 IoT进行开发,可能也会遇到这些问题,

【转载】使用Win32API实现Windows下异步串口通讯

一,异步非阻塞串口通讯的优点 读写串行口时,既可以同步执行,也可以重叠(异步)执行.在同步执行时,函数直到操作完成后才返回.这意味着在同步执行时线程会被阻塞,从而导致效率下降.在重叠执行时,即使操作还未完成,调用的函数也会立即返回.费时的I/O操作在后台进行,这样线程就可以干别的事情.例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作."重叠"一词的含义就在于此. 二,异步非阻塞串口通讯的基本原理首先,确定要打开的串口名.波特率.奇偶校验方式.数据位.

delphi学习笔记2之动态库调用和串口通讯

串口通讯: Spcomm 控件属性: CommName  :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后行. 函数有两个参数,其中 pdatatowrite是