这个程序主要是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,有任何问题留言即可。