我是靠谱客的博主 魁梧冰淇淋,最近开发中收集的这篇文章主要介绍第十一课 (2)用UART实现自定义putchar、getchar、puts函数一、需要配置的寄存器二、代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、需要配置的寄存器

1、 设置引脚用于串口

在这里插入图片描述
可以作为一般的引脚输入输出,也可以作为串口引脚,
所以我们需要设置引脚作为串口功能

别忘了还需要把上拉电阻使能上拉

2、设置波特率

P338
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1

UART clock 从哪来?
设置UCON0寄存器的Clock Selection [11:10] = 00 /* PCLK*/
把UCON0寄存器的其他位也设置下:
Transmit Mode [3:2] = 01 /* 中断/查询模式*/
Receive Mode [1:0] = 01 /* 中断/查询模式 */
UCON0 = 0x00000005
所以我们把UART clock = PCLK = 50M (第九课 设置的时钟)

UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1 = 50 000 000 / (115200*16) - 1 = 26
因此设置UBRDIV0寄存器 = 26

3、设置数据格式

8个数据位 0个校验位 1个停止位
设置UCON0寄存器
Word Length [1:0] = 11
UCON0= 0x00000003

4、其他设置

使用FIFO的话,可以发送64byte数据,不适用的话,只能发送1byte数据,接收同理
在这里插入图片描述
UTRSTAT0寄存器的
Transmitter empty [2] 用来判断数据发送出去了吗
Receive buffer data ready[0] 用来判断数据j接收到了吗
发送的数据
UTXH0
接收的数据
URXH0

二、代码

#include "s3c2440_soc.h"


/* 115200,8n1 */
void uart0_init()
{
	/* 设置引脚用于串口 */
	/* GPH2,3用于TxD0, RxD0 */
	GPHCON &= ~((3<<4) | (3<<6));
	GPHCON |= ((2<<4) | (2<<6));

	GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 */
	

	/* 设置波特率 */
	/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
	 *  UART clock = 50M
	 *  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
	 */
	UCON0 = 0x00000005; /* PCLK,中断/查询模式 */
	UBRDIV0 = 26;

	/* 设置数据格式 */
	ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */

	/*  */

}

int putchar(int c)
{
	/* UTRSTAT0 */
	/* UTXH0 */

	while (!(UTRSTAT0 & (1<<2))); //
	UTXH0 = (unsigned char)c;
	
}

int getchar(void)
{
	while (!(UTRSTAT0 & (1<<0)));
	return URXH0;
}

int puts(const char *s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
}
#ifndef _UART_H_
#define _UART_H_

void uart0_init(void);
int putchar(int c);
int getchar(void);
int puts(const char* str);

#endif
#include "s3c2440_soc.h"
#include "uart.h"

int main(void)
{
	unsigned char c;
	
	uart0_init();
	puts("Hello, world!nr");
	
	while(1)
	{
		c = getchar();
		if (c == 'r') //回到最前面
		{
			putchar('n');
		}

		if (c == 'n')
		{
			putchar('r');
		}

		putchar(c);
	}
	return 0;
}
all:
	arm-linux-gcc -c -o main.o main.c 
	arm-linux-gcc -c -o uart.o uart.c
	arm-linux-gcc -c -o start.o start.S
	arm-linux-ld -Ttext 0 start.o main.o uart.o  -o uart.elf
	arm-linux-objcopy -O binary -S uart.elf uart.bin
	arm-linux-objdump  -D uart.elf > uart.dis

clean:
	rm -rf *.o *.bin *.elf *.dis

编译出现的错误:
uart.c:22: warning: conflicting types for built-in function ‘putchar’
因为putchar等是内联函数,所以我自定义的是int puts(const char *s),内联是void puts(const char *s)
【解决办法】

1.在编译是加上-fno-builtin或者-fno-builtin-FUNCTION 选项,你就可以自己实现这些函数而不冲突了。例如在上面的提示中,你编译时加上-fno-builtin-puts ,就可以正常编译了。

2.把这些函数改个名称,以便不冲突。
https://blog.csdn.net/haidonglin/article/details/17261709
运行结果:
在这里插入图片描述

最后

以上就是魁梧冰淇淋为你收集整理的第十一课 (2)用UART实现自定义putchar、getchar、puts函数一、需要配置的寄存器二、代码的全部内容,希望文章能够帮你解决第十一课 (2)用UART实现自定义putchar、getchar、puts函数一、需要配置的寄存器二、代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部