一、需要配置的寄存器
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
二、代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54#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++; } }
1
2
3
4
5
6
7
8
9
10#ifndef _UART_H_ #define _UART_H_ void uart0_init(void); int putchar(int c); int getchar(void); int puts(const char* str); #endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#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; }
1
2
3
4
5
6
7
8
9
10
11all: 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函数一、需要配置的寄存器二、代码的全部内容,更多相关第十一课内容请搜索靠谱客的其他文章。
发表评论 取消回复