第十一课 (2)用UART实现自定义putchar、getchar、puts函数

您所在的位置:网站首页 英国领事馆签证中心上海电话号码 第十一课 (2)用UART实现自定义putchar、getchar、puts函数

第十一课 (2)用UART实现自定义putchar、getchar、puts函数

2023-09-07 23:22| 来源: 网络整理| 查看: 265

一、需要配置的寄存器 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 while (!(UTRSTAT0 & (1 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!\n\r"); 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 运行结果: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3