(三) UART 串口通讯

2022-10-26,,

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, #
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], # ; 循环设置存寄存器
str r3, [r0], #
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 函数

 /* xmain.c */

 /* GPIO registers */
#define GPHCON (*(volatile unsigned long *)0x56000070)
#define GPHDAT (*(volatile unsigned long *)0x56000074)
#define GPHUP (*(volatile unsigned long *)0x56000078) /*UART registers*/
#define ULCON0 (*(volatile unsigned long *)0x50000000)
#define UCON0 (*(volatile unsigned long *)0x50000004)
#define UFCON0 (*(volatile unsigned long *)0x50000008)
#define UMCON0 (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
#define URXH0 (*(volatile unsigned char *)0x50000024)
#define UBRDIV0 (*(volatile unsigned long *)0x50000028) #define TXD0READY (1<<2) //发送数据状态OK
#define RXD0READY (1) //接收数据状态OK /* UART串口初始化 */
void uart_init( )
{
GPHCON |= 0xa0; //GPH2,GPH3 used as TXD0,RXD0
GPHUP = 0x0; //GPH2,GPH3内部上拉
ULCON0 = 0x03; //8N1
UCON0 = 0x05; //查询方式为轮询或中断;时钟选择为PCLK
UFCON0 = 0x00; //不使用FIFO
UMCON0 = 0x00; //不使用流控
UBRDIV0 = ; //波特率为57600,PCLK=12Mhz
} /* UART串口单个字符打印函数 */
extern void putc(unsigned char c)
{
while( ! (UTRSTAT0 & TXD0READY) );
UTXH0 = c;
} /* UART串口接受单个字符函数 */
extern unsigned char getc(void)
{
while( ! (UTRSTAT0 & RXD0READY) );
return URXH0;
} /* UART串口字符串打印函数 */
extern int printk(const char* str)
{
int i = ;
while( str[i] ){
putc( (unsigned char) str[i++] );
}
return i;
} __inline void delay(int msec)
{
int i, j;
for(i = ; i > ; i--)
for(j = msec*; j > ; j--)
/* do nothing */;
} /* xmain 通过UART串口打印字符串 */
int xmain()
{
uart_init();
while()
{
delay();
printk("Uart串口打印试验\r\n");
}
// return 0; 这句省去,这样 就不会出现 statement is unreachable
}

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

(三) UART 串口通讯的相关教程结束。

《(三) UART 串口通讯.doc》

下载本文的Word格式文档,以方便收藏与打印。