UART串口通信
不管是单片机开发还是嵌入式Linux开发,串口都是最常用到的外设。可以通过串口将开发板与电脑相连,然后在电脑上通过串口调试助手来调试程序。还有很多模块,比如蓝牙、GPS、GPRS等都使用串口来与主控进行通讯的,在嵌入式Linux中一般使用串口作为控制台
1. UART简介
串口全称串行接口,是指数据一个一个的顺序传输,通信线路简单(两条线即可)。UART与外界相连最少只需要三根线:TXD(发送)、RXD(接收)、GND(地线)。其通讯格式如下图示:
- 空闲位:数据线在空闲状态时为高电平
- 起始位:将数据线拉低,表示开始数据传输
- 数据位:实际要传输的数据
- 奇偶校验位:对数据中1的位数进行奇偶校验用
- 停止位:数据传输完成标志位
- 波特率: 数据传输的速率,即每秒传输的数据位数
UART一般的接口电平有TTL和RS232,TTL用低电平表示逻辑0,高电平表示逻辑1;RS232采用差分线,-3 ~ -15V表示逻辑1, +3 ~ +15V表示逻辑0
IMX6U一共有8个UART,UART功能很多,这里只用到其最基本的串口功能。UART的时钟源由寄存器CCM_CSCDR1的UART_CLK_SEL位来选择,分频值由UART_CLK_PODF位来设置。下面介绍UART几个重要的寄存器:
- UARTx_UCR1控制寄存器1
- ADBR:自动波特率检测使能位
- UARTEN:UART使能位
- UARTx_UCR2控制寄存器2
- IRTS:RTS引脚功能,为0时使用,为1时忽略
- PREN:奇偶校验使能位
- PROE:奇偶校验模式选择位
- STOP:停止位数量,为0时1位停止位,为1时2位停止位
- WS:数据位长度,为0时7位数据位,为1时8位数据位
- TXEN:发送使能位,0关闭,1开启
- RXEN:接收使能位,0关闭,1开启
- SRST:软件复位
- UARTx_UCR3控制寄存器3
- UARTx_USR2 状态寄存器2
- TXDC:发送完成标志位,为1时表示发送缓冲区和移位寄存器为空(即发送完成)
- RDR:数据接收标志位,为1时表示至少接收到一个数据
综上所述,使用UART1来完成开发板与串口助手之间的通信,UART1的配置步骤如下:
- 设置UART1的时钟源
- 初始化UART1
- 使能UART1
- 编写UART1数据收发函数
2. 硬件介绍
本例程需要用到的硬件资源:
使用USB串口线将串口1和电脑连接后,利用串口调试助手与电脑进行通信
3. 程序编写
- 新建uart文件夹,编写uart驱动文件bsp_uart.c和bsp_uart.h
void uart_init(void);
void uart_io_init(void);
void uart_disable(UART_Type *base);
void uart_enable(UART_Type *base);
void uart_softreset(UART_Type *base);
void putc(unsigned char c);
void puts(char *str);
unsigned char getc(void);
void uart_init(void){
uart_io_init();
uart_disable(UART1);
uart_softreset(UART1);
UART1->UCR1 = 0;
UART1->UCR1 &= ~(1<<14);
UART1->UCR2 |= (1<<14) | (1<<5) | (1<<2) | (1<<1);
UART1->UCR3 |= 1<<2;
UART1->UFCR = 5<<7;
UART1->UBIR = 71;
UART1->UBMR = 3124;
uart_enable(UART1);
}
void uart_io_init(void){
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX,0);
IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX,0);
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX,0x10B0);
IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX,0x10B0);
}
void uart_disable(UART_Type *base){
base->UCR1 &= ~(1<<0);
}
void uart_enable(UART_Type *base){
base->UCR1 |= (1<<0);
}
void uart_softreset(UART_Type *base){
base->UCR2 &= ~(1<<0);
while((base->UCR2 & 0x1) == 0);
}
void putc(unsigned char c){
while(((UART1->USR2 >> 3) &0X01) == 0);
UART1->UTXD = c & 0XFF;
}
void puts(char *str){
char *p = str;
while(*p)
putc(*p++);
}
unsigned char getc(void){
while((UART1->USR2 & 0x1) == 0);
return UART1->URXD;
}
int main(void){
unsigned char a = 0;
unsigned char state = OFF;
int_init();
imx6u_clkinit();
delay_init();
clk_enable();
led_init();
beep_init();
uart_init();
while(1){
puts("请输入1个字符:");
a = getc();
putc(a);
puts("您输入的字符为:");
putc(a);
puts("\r\n\r\n");
state = !state;
led_switch(LED0, state);
}
return 0;
}
4. 下载验证
- 修改Makefile文件:修改TARGET为uart,追加“bsp/uart”文件夹,还需修改如下代码
$(SOBJS) : obj/%.o : %.S
$(CC) -Wall -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<
$(SOBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<
- 使用imxdownload软件将bin文件下载到SD卡中
- 烧写成功后,插入SD卡,使用串口工具连接开发板,复位后提示输入字符,输入字符后会回显出来
|