使用开发板:FS4412,Soc:Exynos4412,内核型号:cortex-A9,架构:armv7;
文档:开发板原理图,Soc数据手册;
环境:文件编写及编译:Linux;下载程序:超级终端hypertrm;串口下载
编译器:交叉编译器arm
文章目录
1 UART知识
1.1 概念
Universal Asynchronous Receiver and Transmitter是异步通讯;
本文用的是armv7架构的cortex-A9;
1.2 单工、半双工、全双工
单工:A->B 一根数据线,方向不能改变
半双工:A->B 或者 B->A 一根数据线,方向可以改变
全双工:A->B B->A 两根数据线
1.3 同步和异步
A–》B一帧数据 下一帧数据什么时候来不知道–》异步
A–》B一帧数据 下一帧数据1s之后到–》同步
简单理解:
有时钟线就是同步,没有时钟线就是异步的
时钟:给各大硬件接口提供工作节拍的,就好比人的心脏
晶振提供基本的时钟,会经过倍频,提供给cpu,又会进行分频,提供给各大硬件接口
1.4 串口通讯协议
1.4.1 通信协议
通信双方约定好的通信规则,双方在通信时,都需要遵守;
Uart一般用于:开发板《=》开发板通信;开发板《=》pc通信;
1.4.2 串口通讯帧数据格式
Uart通信时的一帧数据=起始位+5-8位的数据段+奇偶校验位+停止位;
停止位的值:1,数据线在不工作的时候默认是高电平;
起始位的值:0,发送方和接收方用的是同一根数据线,这根数据线在空闲的时候是高电平,因为是异步通信,所以什么时候会发数据以及什么时候需要接收数据是不知道的,所以就需要在正式的发送数据之前先通知一下,所以需要发送方先发送一位起始位0,将数据线由高拉低,那么接收方就知道此时发送方给它要发送数据,它就会准备接收数据,接收数据是按照波特率的速度来接收的,也就是如果波特率是115200,那么发送方就会每隔1/115200秒发送一位数据,接收方就会每隔1/115200秒接收一位数据,直到结束,停止位又会将数据线拉高,下一帧数据什么时候要接收,不知道,直到再次数据线被拉低(起始位)又开始接收。
所以:一帧数据和下一帧数据之间是异步的,但是每一帧数据中的每一位又是同步的,所以这种通信方式也叫起止同步式。
1.5 波特率
别整那些复杂的概念,波特率就是串口每秒钟传输二进制的位数;
比如波特率是9600,那就是一秒传9600个位,那频率就是9600Hz;那你就要拿cpu或UART的时钟频率来分频,分成9600的大小来给UART传输数据用;
别整没用的概念,分频就是除;2分频就是除以2;9分频就是除以9;cpu频率是100mhz,我要4mhz,那就25分频;除就完了;
1.6 Soc中的串口框图
2 UART裸机编程流程
2.1 整体流程
(1) 设置TXD引脚为串口输出;RXD引脚为串口输入;
(2) 找寄存器设置数据段位数、有无奇偶校验、停止位、发送与接收的处理方式、波特率;
(3) 找到发送与接收寄存器,进行数据的发送与接受;
2.2 看原理图,查引脚
查得:
Txd GPA1_1
Rxd GPA1_0
那么GPA1_1需要设置为输出模式;GPA1_0设置为输入模式;
2.3 看数据手册,查寄存器用法
2.3.1 查GPIO
由图知,只需要将GPA1CON设置为0x22;
2.3.2 查UART相关寄存器
上一张图可以知道使用的是UART2;
我们要设置一个简单的轮询串口,要用到ULCONn,UCONn,UTRSTATn,UTXHn,RTXHn,UBDIVn,UFRACVALn寄存器;
(1) ULCONn用来设置数据位位数、停止位、奇偶校验、是否红外模式;
(2) UCONn用来设置发送和接收的相应模式是轮询还是中断等;
(3) UTRSTATn寄存器用来在轮询中查询可读/可写状态;
(4) UTXHn,RTXHn用于发送和接收数据;
(5) UBDIVn,UFRACVALn用来设置波特率;
如图,这个Soc共有5个串口,ULCONn寄存器的0-6位分别用来设置数据段位数、停止位位数、奇偶校验方式、是否红外线模式;本次实验设置为:8位数据、1位停止位、无奇偶校验、普通模式,7-32位保留;因此ULCON2=0x3;
采用最简单的轮询方式,因此只需要在T/R Mode这里设置polling模式就可以了;
因此UCON2=0x5;
查询UTRSTAT2的第0位知接收缓存寄存器是否为空,第1位知发送缓冲寄存器是否为空;
对这两个寄存器直接读写即可;
如图