linux 2440 串口开发,JZ2440开发板:UART(串口)使用(学习笔记)

查看UART在硬件上的信息,阅读JZ2440原理图可以看到:

081a469d5c06e6d068ecc51c61f23fbd.png

4711c9c4b3b994074862b7b476dffcf5.png

JZ2440开发板的UART0是可以跟USB相接的,用于打印调试,UART1,UART2两个串口用来外接模块。所以本文仅对UART0进行操作。

从上图可以看到,UART0的TXD0和RXD0对应GPH2和GPH3,硬件上获取的信息大概就就是这些,接下来对芯片手册的UART部分进行分析:

首先需要设置UART0的TXD0和RXD0引脚,对应的GPHCON,GPHDAT,GPHUP寄存器见下图:

GPHCON: 将GPH2和GPH3分别设置为TXD0和RXD0

GPHUP:  由于JZ2440的串口采用TTL标准,所以一开始应该是高电位,需要将相应引脚的电位上拉

这里往GPHUP寄存的的bit3和bit2里写入1,即可完成设置。

3bd1b5c997968567dfca9f23e95c28b9.png

下图是串口的结构图:

1、发送过程:数据由内存传递到发送缓冲寄存器,再由发送移位器通过发送引脚TXD0将数据传递出去

2、接收过程:外部数据通过接收引脚RXD0传至接收移位器,再由接收缓冲寄存器传递至内存中。

另外:这里选用非FIFO模式,所以移位寄存器一次只能传递1个字节。

17463372d4912ee5daee86468b326b3f.png

想要传输数据,波特率和数据格式肯定需要约定好,下面对波特率和数据格式的设置进行分析:

a、波特率

阅读下方图片中波特率的说明,可以知道:波特率发生器的设定与UBRDIV0和UART clock有关,UART clock这里选用PCLK=50MHz

波特率选用115200,根据公式UBRDIVn = (int)( UART clock / ( buad rate x 16) ) -1可以计算出:

UBRDIV0  = (int)(50000000 / (115200 x 16) ) -1

= (int)(27.1) -1 (四舍五入到最接近的整数)

= 27 -1 = 26

a2700d364642ffa82ec9fe51abca7993.png

3cbf2d4804d83200666ae8b65179006f.png

UART clock选择:选用PCLK

1c994adc1a3a724be2b1da6ddcfec580.png

cd43c36aa066fd81a72a29945f95e0cd.png

b、数据格式

这里采用8位数据位,无校验位,1位停止位,即 8n1

46b39cdf7617ad0c7f4daddfa4b6fbcf.png

阅读芯片手册发现,UTRSATA0寄存器用来判断UART0是否发送/接收完成:

当bit [2]为1时表明发送完成了

当bit [0]为0时表明接收完成了

a577e320f92056b3a7e105debec7e59e.png

传输模式寄存器:这里采用中断/查询模式

3c771847696712b38a1e1455cabc4440.png

根据发送/接收缓冲寄存器的描述,可以发现:JZ2440采用小字节序,UTXH0和URXH0都是按1个字节发送或者接收。

6675624d6c1c4accead9dbfbab8866bb.png

对UART0的分析大概就是这些了,要实现以上的描述,离不开程序:

uart.c

1 /*UART0的初始化,以及UART0打印调试函数*/

2 #include "s3c2440_soc.h"

3 void uart0_init(void) //串口0初始化函数

4 {5 /*设置UART0串口的引脚6 ** GPHCON寄存器的bit[7:6]为10(GPH3为RXD[0]),bit[5:4]为10(GPH2为TXD[0])7 ** 因为开发板串口采用TTL标准,GPHUP寄存器对应的bit[2]和bit[3]需要设置为电位上拉8 */

9 GPHCON &=~((3<<6)|(3<<4)); //先清零

10 GPHCON |= ((2<<6)|(2<<4));11 GPHUP &=~((1<<2)|(1<<3)); //对应bit使能上拉

12

13 /*设置波特率14 ** UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –115 ** UART的时钟默认采用PCLK=50MHz16 ** UBRDIV0 = (int)( 50000000 / ( 115200 x 16) ) –1 = 2617 */

18

19 UBRDIV0 = 26;20

21 /*设置数据发送格式:数据位为8位,无校验位,停止位1位,即8n122 ** 设置ULCON0寄存器,bit[5:3]为000,bit2为0,bit[1:0]为1123 ** 即ULCON0=0x0000000324 */

25

26 ULCON0 = 0x00000003;27

28 /*设置发送和接收模式为中断/查询模式:29 ** UCON0寄存器的bit[3:2]为01,bit[1:0]为01,UCON0=0x00000005;30 */

31

32 UCON0 = 0x00000005;33 }34

35 /*串口的输入和输出*/

36

37 /*根据UART的发送和接收状态位寄存器 UTRSTAT0 的状态,判断发送/接收完成与否38 ** 发送:看bit[2]的状态,当bit[2]为1时表明发送完成了39 ** 接收:看bit[0]的状态,当bit[0]为0时表明接收完成了40 ** 发送缓冲寄存器UTXH0,接收缓冲寄存器URXH041 */

42 int putchar(intc)43 {44 while(!(UTRSTAT0 & (1<<2))); //当发送缓冲寄存器和发送移位器不是空的时候,循环等待

45 UTXH0 = (unsigned char)c; //反之,当上一个发送完了,再向发送缓冲寄存器写入字符(这里是按单个字节发送)

46 }47 int getchar(void)48 {49 while(!(UTRSTAT0 & (1<<0))); //当接收缓冲寄存器是空的时候,循环等待

50 return URXH0; //当接收缓冲寄存器非空的时候,返回接收缓冲寄存器得到的值

51 }52 int puts(const char *s)53 {54 while (*s) //当*s有内容时

55 {56 putchar(*s); //调用putchar函数

57 s++; //让s指针加1

58 }59

60 }

自定义头文件 uart.h :

1 #ifndef _UART_H //如果某个文件第一次包含这个头文件,_UART_H这个宏没有定义时

2 #define _UART_H //定义_UART_H这个宏

3

4 void uart0_init(void);5 int putchar(intc);6 int getchar(void);7 int puts(const char *s);8

9 #endif

主程序 main.c :

1 #include "s3c2440_soc.h"

2 #include "uart.h"

3 int main(void)4 { unsigned charc;5 uart0_init();6 puts("Hello,world!\n\r");7 while(1)8 {9 c=getchar(); //从PC键盘上得到输入字符(串 )

10 if (c == '\r') //换行处理 ,不论输入\n或者\r,都会换行并使光标到行首

11 {12 putchar('\n');13 }14 if (c == '\n')15 {16 putchar('\r');17 }18 putchar(c); //输出得到的字符(串 )到PC,PC屏幕会显示串口传过来的字符(串 )

19 }20 return 0;21 }

makefile :

all:

arm-linux-gcc -c -o led.o led.c

arm-linux-gcc -c -o uart.o uart.c

arm-linux-gcc -c -o main.o main.c

arm-linux-gcc -c -o start.o start.S

arm-linux-ld -Ttext 0 start.o led.o uart.o main.o -o uart.elf

arm-linux-objcopy -O binary -S uart.elf uart.bin

arm-linux-objdump -D uart.elf >uart.dis

clean:

rm*.bin *.o *.elf *.dis

这里只列出了部分文件,上传所有文件到 linux 编译后,得到uart.bin文件,烧写到JZ2440开发板,可以实现简单的打印调试功能,见下图:

e5836274b021c75ee183abffa5af9862.png

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值