UART的学习记录( 二 )


(4)210的某个串口支持IrDA模式,开启红外模式后,我们只需要向串口写数据,这些数据就会以红外光的方式向外发射出去(当然是需要一些外部硬件支持的),然后接收方接收这些红外数据即可解码得到我们的发送信息 。
时钟的设置
从图中可以看到:
1.UART的时钟源可以从PCLK或者中选择;
2,是用UCONn寄存器去选择的
【UART的学习记录】3.最终通过产生UART需要的时钟,相关的寄存器UBDIV、
I/O
课程讲用串口0,只需要关心前四项即可
在Pad项中可以看到XuRXD等这样的字眼,再从底板图里面查找就知道对应的GPIO是哪个了 。
MAP
太长不贴了,数据手册864页 。
1.开头提及到的 跟数据帧有关,要设置
2.UCON0 跟时钟选择有关
3. 选不选FIFO模式
4. 选不选Modem控制
5. 发送接收状态位的
6. 看FIFO状态的
7. 看Modem状态的
8.UTXH0 跟 有关
9.URXH0 跟 有关
10. 跟波特率有关
11. 跟波特率有关
12.INTP0 跟中断挂起有关
13. 跟中断源挂起有关
14.INTM0 跟中断掩码有关
课程里面为了简单没用FIFO中断,所以很多寄存器都不用设置 。
目前需要的有
跟数据帧有关,要设置
UCON0 跟时钟选择有关
选不选FIFO模式
发送接收状态位的
UTXH0 跟 有关
URXH0 跟 有关
跟波特率有关
跟波特率有关
最后别忘了两个GPIO TXD和RXD的 。
开始写程序 初始化几个寄存器 ULCON
设置一帧8位,一帧两个停止位,零奇偶校验、普通模式
= 0x07
UCON
太长不贴图了 869页 [3:2]和[1:0]分别设置01,发送接收都是01
UCON0 = 0x03;

UART的学习记录

文章插图
全部置零,不用FIFO模式
也置零,不用 。
波特率设置
他这里的波特率设置是要计算一下的
通过看数据手册878-880,最终设置
= 34;
= ;
其实还有其他设置的值,我选的PCLK 是66 MHz的
发送以及接收
void uart_putc(char c){while (!(rUTRSTAT0 & (1<<1)));rUTXH0 = c;}char uart_getc(void){while (!(rUTRSTAT0 & (1<<0)));return (rURXH0 & 0xff); }
1.判定状态位的条件对照数据手册多调转几次就能看明白了
2.原课程是直接在main函数里面调用函数发送字符,在里面查看 。然后它getc函数里面URXH0是跟0x0f进行与运算,只取了低八位 。
我这里与0xFF进行与运算取了16位 。
为什么取16位呢?
我的设想是在串口调试助手里面设置,自己发什么自己收什么,刚开始设置的时候呢跟着课程的0x0f进行设置,所以收的时候老是丢了高8位,很是苦恼,后面自己在写这篇日志的时候认真看才发现了问题所在 。
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!
发泄完了 。
main函数
void main(void){uart_init();char c ;while(1){c = uart_getc();uart_putc(c);}}
简单调用一下
实测
想法终于实现了 。good 。。。
移植别人的实现在里面显示打印信息
其实这部分的话就真的是跟着课程做了,自己做应该做不来的 。
改动得最多是的部分
在原文件夹里面添加了课程给的代码 包括有两个文件夹 和lib
下面的就写得比较正式了,而且我都写了相应的注释,希望对自己以后有帮助
#编译CC = arm-linux-gcc #链接LD = arm-linux-ld#生成bin文件OBJCOPY = arm-linux-objcopy #反编译用的OBJDUMP = arm-linux-objdump #生成库文件AR = arm-linux-ar#shell pwd 表示当前的目录 shell命令+pwd 类似linux下pwdINCDIR := $(shell pwd)# C预处理器的flag,flag就是编译器可选的选项 不用stdlib 不用std includeI#-I Include Directory /当前目录里面的 includeCPPFLAGS := -nostdlib -nostdinc -I$(INCDIR)/include# C编译器的flag -W all 所有waring都开 -O2 编译器的默认优化选项 # -f no bulit in 不用标准库 不用头 CFLAGS:= -Wall -O2 -fno-builtin#导出这些变量到全局变量,给子文件夹使用export CC LD OBJCOPY OBJDUMP AR CPPFLAGS CFLAGS objs := start.o led.o clock.o uart.o main.o#把当前makefile与子Makefile关联起来objs +=lib/libc.auart.bin: $(objs)$(LD) -Tlink.lds -o uart.elf $^$(OBJCOPY) -O binary uart.elf uart.bin$(OBJDUMP) -D uart.elf > uart_elf.disgcc mkv210_image.c -o mkx210./mkx210 uart.bin 210.bin# 进去子目录里面make完之后再退出来 lib/libc.a:# 要写在一行里面 不能分成三行写 ,一行里面用;隔开cd lib; make; cd ..%.o : %.S$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $