《单片机小白转嵌入式Linux学习记录,基于S3C2440----目录》
波特率115200,8n1
波特率计算公式:UBRDIVn = (int)(UART clock / (buad rate*16))-1 手册P338
uart_0.h
#ifndef __UART0_H__
#define __UART0_H__
#define GPHCON (*(volatile unsigned int *)0x56000070) //volatile 防止编译器优化
#define GPHDAT (*(volatile unsigned int *)0x56000074)
#define GPHUP (*(volatile unsigned int *)0x56000078)
#define UCON0 (*(volatile unsigned int *)0x50000004) // P342 串口0 控制寄存器
#define UBRDIV0 (*(volatile unsigned int *)0x50000028) // P352 波特率
#define ULCON0 (*(volatile unsigned int *)0x50000000) // P341 数据格式
#define UTRSTAT0 (*(volatile unsigned int *)0x50000010)// P347 收发状态寄存器
#define UTXH0 (*(volatile unsigned char *)0x50000020) // P351 发送数据寄存器 CPU小端模式
#define URXH0 (*(volatile unsigned char *)0x50000024) // P351 接收数据寄存器 CPU小端模式
void uart0_init(); /* 115200,8n1 */
int putchar(unsigned char c); //发送字符
unsigned char getchar(void); //接收字符
int puts(const char *s); //发送字符串
#endif
uart_0.c
#include "uart_0.h"
/* 115200,8n1 */
void uart0_init()
{
/* 复用引脚配置
* TXD0 -> GPH2
* RXD0 -> GPH3
*/
GPHCON &= ~((3<<4)|(3<<6)); //清零 P295
GPHCON |= ((2<<4)|(2<<6)); //配置为串口模式
GPHUP &= ~((1<<2)|(1<<3)); //使能内部上拉
/* 设置波特率 */
/* UBRDIVn = (int)(UART clock / (buad rate*16))-1 P338
* UBRDIVn = (int)(50000000 / (115200*16))-1 =26
* UART clock 时钟源 P342 UCON0 -> Clock Selection 00
* 发送接收模式:中断或查询 UCON0-> Transmit/Receie Mode 01
*/
UCON0 = 0x00000005; //PCLK,中断/查询模式 PCLK = 50M
UBRDIV0 = 26; //根据时钟频率计算波特率
/* 设置数据格式 */
ULCON0 = 0x00000003; //8n1: 8个数据位,无校验位,一个停止位
}
/* 发送数据 */
int putchar(unsigned char c)
{
while(!(UTRSTAT0 & (1<<2))); // 0 上一次数据没有发送完毕 Not empty
UTXH0 = c;
return 0;
}
/* 接收数据 */
unsigned char getchar(void)
{
while(!(UTRSTAT0 & (1<<0))); // 0 没有接收到数据 Empty
return URXH0;
}
/* 发送字符串 */
int puts(const char *s)
{
while(*s)
{
putchar(*s);
s++;
}
}
main.c
#include "uart_0.h"
int main(void)
{
unsigned char c;
uart0_init(); /* 115200,8n1 */
puts("hellow ARM!\r\n"); // \r 回到行首 \n 新行
while(1)
{
c = getchar();
if(c=='\r') putchar('\n');
if(c=='\n') putchar('\r');
putchar(c);
}
return 0;
}
Makefile
all:
arm-linux-gcc -c -o start.o start.S
arm-linux-gcc -c -o uart_0.o uart_0.c
arm-linux-gcc -c -o main.o main.c
arm-linux-ld -Ttext 0 start.o uart_0.o main.o -o uart0.elf
arm-linux-objcopy -O binary -S uart0.elf uart0.bin
arm-linux-objdump -D uart0.elf > uart0.dis
clean:
rm *.bin *.o *.elf *.dis
离线