您尚未登录。

楼主 #1 2018-05-08 18:08:20

xinxiaoci
会员
注册时间: 2018-04-18
已发帖子: 71
积分: 71

S3C2440-裸机-串口

《单片机小白转嵌入式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

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn