linux下串口与a8开发版通信,基于cortex-a8(s5pv210)串口通信裸机程序分析与详解

这个程序主要是s5pv210开发板利用串口和pc机互相通信的程序。有一点要特别注意:我们ARM裸机程序的开发模式和51单片机的开发模式是很像的,每次写51程序时,是不是每次都要加入一个头文件?你有想过那个头文件是干嘛的吗?对,那个头文件主要起到把寄存器所在的地址宏定义一下,不然你的程序想要操作寄存器就必须要靠地址来操作了,因为寄存器就在那个地址上。而我们ARM裸机的程序并没有这样的一个头文件,所以呢,就需要自己来宏定义一下,下面直、直接来分析程序:

#define

GPA0CON ( *((volatile unsigned long *)0xE0200000)

)

//在cortex-a8这个内核中,0xE0200000这个地址所在的寄存器是GPA0CON寄存器,为了方便下面的程序使用,我们把这个地址取个名字叫做GPA0CON

#define

GPA1CON ( *((volatile unsigned long *)0xE0200020)

)

//这个也一样,把0xE0200020这个地址取个别名叫做GPA1CON

//

UART相关寄存器,我们这里是把串口相关的寄存器都做一个宏定义

#define ULCON0

( *((volatile unsigned long *)0xE2900000) )

#define UCON0

( *((volatile unsigned long *)0xE2900004) )

#define UFCON0

( *((volatile unsigned long *)0xE2900008) )

#define UMCON0

( *((volatile unsigned long *)0xE290000C) )

#define

UTRSTAT0 ( *((volatile unsigned long *)0xE2900010)

)

#define

UERSTAT0 ( *((volatile unsigned long *)0xE2900014)

)

#define

UFSTAT0 ( *((volatile unsigned long *)0xE2900018)

)

#define

UMSTAT0 ( *((volatile unsigned long *)0xE290001C)

)

#define UTXH0

( *((volatile unsigned long *)0xE2900020) )

#define URXH0

( *((volatile unsigned long *)0xE2900024) )

#define

UBRDIV0 ( *((volatile unsigned long *)0xE2900028)

)

#define

UDIVSLOT0 ( *((volatile unsigned long *)0xE290002C)

)

#define UINTP

( *((volatile unsigned long *)0xE2900030) )

#define UINTSP

( *((volatile unsigned long *)0xE2900034) )

#define UINTM

( *((volatile unsigned long *)0xE2900038) )

#define

UART_UBRDIV_VAL 35//这个是设置串口收发寄存器波特率的宏定义

#define

UART_UDIVSLOT_VAL 0x1

//

初始化串口

void

uart_init()

{

// 1

配置引脚用于RX/TX功能,配置一下是把开发板的串口发送或接收引脚配置成输出还是输入,是开启内部上拉电阻还是禁止等。

GPA0CON =

0x22222222;

GPA1CON =

0x2222;

// 2

设置数据格式等

//

使能fifo

UFCON0 =

0x1;

//

无流控

UMCON0 =

0x0;

// 数据位:8, 无校验,

停止位: 1

ULCON0 =

0x3;

//

时钟:PCLK,禁止中断,使能UART发送、接收

UCON0 =

0x5;

//

设置波特率

UBRDIV0 =

UART_UBRDIV_VAL;

UDIVSLOT0 =

UART_UDIVSLOT_VAL;

}

// 接收一个字符

的函数

char

getc(void)

{

// 如果RX

FIFO空,等待

while

(!(UTRSTAT0 &

(1<<0)));//如果接受到的数据为空,则等待,有一个专门的UTRSTAT0寄存器,如果串口的接收缓冲区为空,则在这里就会设置状态

//

取数据

return

URXH0;//返回正确的数据

}

//

发送一个字符的函数

void putc(char

c)

{

// 如果TX

FIFO满,等待

while

(!(UTRSTAT0 &

(1<<2)));//如果发送缓冲区的数据是满的,就等待,因为数据还没有发送完成

//

写数据

UTXH0 =

c;  //把要发送的数据送到发送缓冲区,这样数据就发送出去了

}

int

main()

{

char

c;

//

初始化串口的相关参数

uart_init();

while

(1)

{

//

把串口接收函数的返回值读取出来

c =

getc();

//

然后把读取出来的内容加1后在发送出去

putc(c+1);

}

return

0;

}

以上就是整个程序的内容了,感谢大家的观看O(∩_∩)O,有任何问题留言即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值