概述
一、需要配置的寄存器
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函数一、需要配置的寄存器二、代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复