UART编程
Universal Asynchronous Receiver and Transmitter
1.1 通信的相关概念
- 串行通信和并行通信,uart是串行通信,数据是一位一位发送的,1s中传输的数据的位数就是波特率(bps)
- 半工、全双工、半双工
单工:A->B 一根数据线,方向不能改变
全双工:A->B B->A 两根数据线
半双工:A->B 或者 B->A 一根数据线,方向可以改变
- 同步和异步
线程:
异步:11221211122211112212121--》不知道下一步是什么
同步:121212121212121212121212 --》知道下一步是什么
A---->B一帧数据 下一帧数据什么时候来不知道--》异步
A---->B一帧数据 下一帧数据1s之后到--》同步
有时钟线就是同步,没有时钟线就是异步的
时钟:给各大硬件接口提供工作节拍的,就好比人的心脏
晶振提供基本的时钟,会经过倍频,提供给cpu,又会进行分频,提供给各大硬件接口
1.2 uart通信协议
通信协议:通信双方约定好的通信规则,双方在通信时,都需要遵守
Uart一般用于:板子《=》板子通信 板子《=》pc通信
Uart通信时的一帧数据=起始位+数据位+奇偶校验位+停止位
停止位的值:1,数据线在不工作的时候默认是高电平
起始位的值:0,发送方和接收方用的是同一根数据线,这根数据线在空闲的时候是高电平,因为是异步通信,所以什么时候会发数据以及什么时候需要接收数据是不知道的,所以就需要在正式的发送数据之前先通知一下,所以需要发送方先发送一位起始位0,将数据线由高拉低,那么接收方就知道此时发送方给它要发送数据,它就会准备接收数据,接收数据是按照波特率的速度来接收的,也就是如果波特率是115200,那么发送方就会每隔1/115200秒发送一位数据,接收方就会每隔1/115200秒接收一位数据,直到结束,停止位又会将数据线拉高,下一帧数据什么时候要接收,不知道,直到再次数据线被拉低(起始位)又开始接收。
所以:一帧数据和下一帧数据之间是异步的,但是每一帧数据中的每一位又是同步的,所以这种通信方式也叫起止同步式。
1.3 uart编程
【1】查看原理图
看板子上的DB9串口的丝印:con7
Txd GPA1_1
Rxd GPA1_0
【2】查看芯片手册
看GPIO章节
配置GPA1_1的功能为uart2的txd
配置GPA1_0的功能为uart2的rxd
GPA1CON 0x1100 0020 0-7位 0x22
看uart章节
设置波特率为115200
一个时钟周期的时间是1/115200,也就是需要的时钟频率是115200HZ,但是系统给我们提供的时钟频率是100Mhz,太大了,所以需要分频
实际数据的发送开始和结束都是有波动的
设置数据位的位数为8
设置停止位的位数为1
设置无奇偶校验
设置发送和接收的模式为轮询
发送和接收的模式:中断 轮询 DMA
发送数据:我们只需要将要发送的数据写入发送寄存器就可以,当然是要在发送寄存器为空的时候,如果不为空,等着空了之后给发送寄存器赋值,发送移位器会在波特率发生器的节拍下,也就是1/115200秒取一位数据进行发送
接收数据:接收移位器会在波特率发生器的节拍下,每隔1/115200秒接收一位数据放入接收寄存器中,当接收够8位数据的时候,cpu去读接收寄存器即可
问题:cpu如何直到发送寄存器什么时候为空以及直到接收寄存器什么时候接收到了数据?
有一个状态寄存器专门是干这个事情的,当发送寄存器为空时,状态寄存器的对应为会自动改变,接收也是如此。
编程
将内存中的程序烧到flash中,开机自启动
- 进入uboot
- Loadb 0x40008000 -->将.bin文件下载到内存
- Movi write kernel 40008000 -》将刚刚下载到内存的程序固化到flash
- 设置自启动
- Set bootcmd movi read kernel 40008000\;go 0x40008000
- Save
- 重启板子
注意:所有字母都是小写