imx6ull裸机开发--UART
程序编写
要实现一个UART与PC通信的程序,根据PCB接线图,查找开发板与Micro USB口相连的UART1
写出需要实现的main.c程序,我采用的是循环写入字符A的程序。
#include "uart.h"
int main()
{
unsigned char cTestData = 'A';
Uart_Init();
while(1){
putchar(cTestData);
}
return 0;
}
下面就是主要实现,main.c里面的Uart_Init() 和 putchar() 函数。串口的初始化主要从一下几个方面来实现:
(1)串口模块时钟的设置
通过搜索可以找到UART1时钟使能的控制位。时钟树默认频率80M
(2)串口模块设置
串口部分设置波特率和数据格式,数据格式主要有,停止位stop,校验位parity enable,数据位长度word size,记住几个单词,在手册中便于搜索。
(3)IOMUX设置
在IOMUX 中决定了引脚PAD与module 相连。从手册里可以看到,这两个部分需要设置。
采用结构提的形式,对UART进行声明,结合UART 内部寄存器地址,设置出起始地址为0x02020000 的结构体。URXD 与 UTXD 寄存器相差了0x40 字节,换算成十进制 是64字节,每个寄存器32 位,也就是4字节,所以两个寄存存器件需要有60 字节的保留位。
typedef struct{
volatile unsigned int URXD;
unsigned char RESERVED_0[60];
volatile unsigned int UTXD;
unsigned char RESERVED_1[60];
volatile unsigned int UCR1;
volatile unsigned int UCR2;
volatile unsigned int UCR3;
volatile unsigned int UCR4;
volatile unsigned int UFCR;
volatile unsigned int USR1;
volatile unsigned int USR2;
volatile unsigned int UESC;
volatile unsigned int UTIM;
volatile unsigned int UBIR;
volatile unsigned int UBMR;
volatile unsigned int UBRC;
volatile unsigned int ONEMS;
volatile unsigned int UTS;
volatile unsigned int UMCR;
}UART_Type;
定义uart1结构体,起始地址设置为0x02020000
然后对UART1模块里个寄存器进行操作
UART_Type *uart1=(UART_Type *)(0x02020000);
//3.配置UART波特率与数据格式 115200
UART_Type *uart1=(UART_Type *)(0x02020000);
uart1->UFCR = 5<< 7;
uart1->UBIR=71;
uart1->UBMR=3124;
uart1->UCR2 |=(1<<14)|(1<<2)|(1<<1)|(1<<5);
//必须设置控制寄存器3
uart1->UCR3 |=(1<<2);
//使能UART
uart1->UCR1 |= (1<<0);
不同数据类型的长度是由什么决定呢?
是由操作系统的位数决定的,更根本上来说是由硬件体系架构决定的。在32位平台和64位平台上,同一种数据类型可能有不同的数据长度,如下表所示:
Makefile编写
整个编译我采用的是在window条件下配置交叉编译工具,来实现的。借用的Git Bash,安装了make 命令。
调试
main.c内程序代码
#include "uart.h"
int main()
{
unsigned char cTestData = 'A';
Uart_Init();
while(1){
putchar(cTestData);
}
return 0;
}
运行结果是下图的乱码,并没有输出想要的结果。而是一堆乱码。
通过调试,发现fifo 控制器中的RFDIV中的位需要设置成001 Divide input clock by 5才能达到好的效果。
芯片功能很强大,UART内部寄存也只是管中窥豹,对自己常用的熟悉一点,警醒,学习!