2026/4/18 7:15:52
网站建设
项目流程
最权威的做网站设计公司价格,新一代 网站备案,怎么做网页买东西链接,网站建设需要用到什么软件串口通信#xff08;UART#xff09;开发详解一、UART通信基础概念1.1 什么是UART#xff1f;UART#xff08;Universal Asynchronous Receiver/Transmitter#xff0c;通用异步收发传输器#xff09;是一种异步串行通信接口。它是嵌入式系统中最常用的通信方式之一。1.2…串口通信UART开发详解一、UART通信基础概念1.1 什么是UARTUARTUniversal Asynchronous Receiver/Transmitter通用异步收发传输器是一种异步串行通信接口。它是嵌入式系统中最常用的通信方式之一。1.2 UART通信特点异步通信无需时钟信号靠起始位、停止位同步全双工可同时发送和接收数据点对点通信通常用于两个设备之间的通信传输距离TTL电平约1米RS-232可达15米1.3 UART数据帧格式┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │空闲│起始│数据位0│数据位1│...│数据位7│校验位│停止位│空闲│ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ │高 │低 │数据内容 │可选 │高 │高 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘起始位1位低电平数据位通常8位也可5、6、7位校验位可选奇校验、偶校验停止位1或2位高电平二、硬件原理分析2.1 i.MX6ULL UART硬件框图┌─────────────────────┐ ┌─────────────────────┐ │ i.MX6ULL │ │ PC主机 │ │ │ │ │ │ UART1控制器 │◄────►│ USB转串口 │ │ - 发送寄存器 │ │ (CH340) │ │ - 接收寄存器 │ │ │ │ - 控制寄存器 │ └─────────────────────┘ └─────────┬───────────┘ │ ▼ ┌─────────────────────┐ │ 硬件引脚 │ │ TXD (发送) │───┐ │ RXD (接收) │◄──┘ └─────────────────────┘2.2 引脚定义参考原理图UART1_TX发送数据引脚数据从芯片发送出去UART1_RX接收数据引脚数据从外部接收进来波特率115200 bps每秒传输115200位三、代码详细解析3.1 头文件定义uart.h#ifndef _UART_H_ #define _UART_H_ // 声明UART相关函数 extern void uart1_init(void); // UART1初始化 extern void putc(unsigned char d); // 发送一个字符 extern void puts(const char *s); // 发送字符串 extern unsigned char getc(void); // 接收一个字符 #endif // !_UART_H_3.2 UART初始化函数uart.c3.2.1 引脚配置void uart1_init(void) { // 1. 复用功能配置 - 将引脚配置为UART功能 IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0); // RX引脚复用为UART IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0); // TX引脚复用为UART // 2. 电气特性配置 - 设置引脚的电气参数 IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10B0); // RX引脚电气特性 IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0); // TX引脚电气特性详细解释IOMUXC_SetPinMux()选择引脚功能第一个参数引脚名称如IOMUXC_UART1_RX_DATA_UART1_RX第二个参数复用选择器0表示选择主要功能IOMUXC_SetPinConfig()配置引脚电气特性参数0x10B0含义0x十六进制前缀10B0配置驱动强度、上下拉、速度等参数3.2.2 复位UART控制器// 3. 软件复位UART控制器 UART1-UCR2 ~(1 0); // 清除UART使能位相当于复位寄存器解释UART1-UCR2UART控制寄存器2位0UARTENUART使能位0禁用UART复位状态1使能UART先清除此位再重新配置确保从干净状态开始3.2.3 配置UART参数// 4. 配置UART控制寄存器2 unsigned int t; t UART1-UCR2; // 读取当前值 t | (1 14); // 设置IRTS位忽略RTS流控 t ~(1 8); // 清除PREN位禁用奇偶校验 t ~(1 6); // 清除STPB位1个停止位 t | (1 5); // 设置WS位8位数据位 t | (1 2); // 设置TXEN位使能发送器 t | (1 1); // 设置RXEN位使能接收器 UART1-UCR2 t; // 写回寄存器UCR2寄存器位详解位 名称 功能 ────────────────────────── 0 UARTEN UART使能位 1 RXEN 接收器使能 2 TXEN 发送器使能 5 WS 字长选择07位18位 6 STPB 停止位数量01位12位 8 PREN 奇偶校验使能 14 IRTS 忽略RTS流控必须设置为13.2.4 配置其他UART寄存器// 5. 配置UART控制寄存器3 UART1-UCR3 | (1 2); // 设置RXDMUXSEL位必须为1 // 6. 配置FIFO控制寄存器 UART1-UFCR ~(7 7); // 清除参考时钟分频位 UART1-UFCR | (5 7); // 设置1分频参考时钟分频器UCR3寄存器位2RXDMUXSEL接收数据多路复用器选择必须设置为1芯片工作在MUXED模式UFCR寄存器位7-9RFDIV参考时钟分频器101十进制5 1分频公式分频值 6 - RFDIV3.2.5 配置波特率// 7. 波特率配置115200 bps UART1-UBIR 999; // 增量寄存器 UART1-UBMR 43401; // 模数寄存器 // 8. 使能UART UART1-UCR1 | (1 0); // 设置UARTEN位使能UART }波特率计算公式BaudRate Ref_Freq / (16 × ((UBMR 1) / (UBIR 1)))其中Ref_Freq 80MHz系统参考时钟UBIR 999增量寄存器值UBMR 43401模数寄存器值计算验证波特率 80,000,000 / (16 × ((43401 1) / (999 1))) 80,000,000 / (16 × (43402 / 1000)) 80,000,000 / (16 × 43.402) 80,000,000 / 694.432 ≈ 115200 bps3.3 字符发送函数void putc(unsigned char d) { // 等待发送完成检查TXDC标志位 while ((UART1-USR2 (1 3)) 0); // 写入要发送的数据到发送寄存器 UART1-UTXD d; }工作原理UART1-USR2 (1 3)检查状态寄存器2的TXDC位位30发送器忙正在发送数据1发送完成可以发送新数据while循环一直等待直到发送完成标志为1UART1-UTXD d将数据写入发送寄存器自动开始发送状态寄存器2USR2位位3TXDC发送完成标志0发送器忙或禁用1发送缓冲区和移位寄存器都为空3.4 字符串发送函数void puts(const char *s) { // 遍历字符串逐个发送字符 while (*s) { putc(*s); // 发送当前字符指针后移 } putc(\n); // 发送换行符便于阅读 }工作原理while (*s)检查当前字符是否为字符串结束符\0putc(*s)发送当前字符然后指针s指向下一个字符循环直到遇到字符串结束符putc(\n)额外发送换行符3.5 字符接收函数unsigned char getc(void) { // 等待接收数据就绪检查RDR标志位 while ((UART1-USR2 (1 0)) 0); // 读取接收寄存器中的数据 return (unsigned char)UART1-URXD; }工作原理UART1-USR2 (1 0)检查状态寄存器2的RDR位位00没有接收到数据1有数据可以读取while循环一直等待直到有数据可读(unsigned char)UART1-URXD读取接收寄存器并转换为无符号字符状态寄存器2USR2位位0RDR接收数据就绪标志0没有接收到新数据1接收到新数据可以读取接收寄存器URXD注意URXD寄存器是只读的读取后RDR标志会自动清除四、主程序中的UART使用4.1 主程序调用main.cint main(void) { // 系统初始化 system_interrupt_init(); // 中断系统初始化 clock_init(); // 时钟初始化 led_init(); // LED初始化 beep_init(); // 蜂鸣器初始化 key_init(); // 按键初始化 gpt1_init(); // 定时器初始化 // UART初始化重点 uart1_init(); // 初始化UART1配置为115200波特率 unsigned char ch; // 用于存储接收到的字符 while(1) { // 延时1秒 delay_us(1000 * 1000); // 控制LED和蜂鸣器翻转 led_nor(); // LED状态翻转 beep_nor(); // 蜂鸣器状态翻转 // UART通信部分 ch getc(); // 从串口接收一个字符会等待直到有数据 putc(ch); // 将接收到的字符发送回去回显功能 puts(\nhello world!); // 发送字符串 } return 0; }4.2 程序流程图开始 ↓ 初始化系统时钟、中断等 ↓ 初始化UART配置引脚、波特率115200 ↓ ┌─────────────────────────────┐ │ 主循环 │ │ ↓ │ │ 延时1秒 │ │ ↓ │ │ LED和蜂鸣器翻转 │ │ ↓ │ │ 等待接收串口数据 │←──┐ │ ↓ │ │ │ 将接收的数据发送回去 │ │ │ ↓ │ │ │ 发送hello world!字符串 │ │ │ ↓ │ │ │ (循环继续) │ │ └──────────────┬──────────────┘ │ │ │ └──────────────────┘五、常见问题与调试5.1 常见问题没有输出/全是乱码检查波特率是否匹配PC端和开发板都设为115200检查TX、RX线是否接反检查电源是否正常只能发送不能接收检查RX引脚配置是否正确检查PC端串口工具是否已打开串口检查线路连接是否良好发送数据不完整检查发送函数是否正确等待发送完成标志检查是否有其他中断影响