当前位置: 首页 > news >正文

从CuteCom到代码:手把手教你用I.MX6ULL实现串口双向通信(附完整工程)

从CuteCom到代码手把手教你用I.MX6ULL实现串口双向通信在嵌入式开发中串口通信是最基础也最关键的调试手段之一。无论是简单的日志输出还是复杂的数据交互串口都扮演着不可或缺的角色。本文将带你从零开始在I.MX6ULL平台上构建一个完整的串口通信系统从上层调试工具到底层驱动实现形成一个完整的闭环。1. 环境准备与工具配置在开始编码之前我们需要搭建好开发环境。这包括硬件和软件两个部分硬件准备I.MX6ULL开发板如正点原子或野火的开发板USB转TTL模块如CH340、CP2102等杜邦线若干软件准备Ubuntu系统推荐18.04或20.04 LTS版本CuteCom串口调试工具ARM交叉编译工具链代码编辑器VSCode或Vim等安装CuteCom非常简单在Ubuntu终端中执行以下命令即可sudo apt-get install cutecom安装完成后我们需要配置CuteCom以连接开发板将USB转TTL模块连接到电脑通常会自动识别为/dev/ttyUSB0设备打开CuteCom在设备选择下拉菜单中选择对应的设备设置波特率为115200与开发板默认设置一致数据位8位无校验位停止位1位8N1点击Open Device按钮打开串口注意确保你的用户有访问串口设备的权限。如果没有可以执行sudo usermod -a -G dialout $USER命令将当前用户加入dialout组然后重新登录。2. I.MX6ULL UART硬件基础I.MX6ULL处理器提供了多个UART接口我们需要先了解其硬件特性特性参数UART数量8个UART1-UART8最大波特率5Mbps数据位5-8位可配置停止位1或2位校验位无/奇/偶校验FIFO深度64字节在硬件连接上我们通常使用UART1作为调试串口其引脚定义如下UART1_TXD发送数据线输出UART1_RXD接收数据线输入GND地线必须连接在开发板上这些引脚通常已经连接到USB转串口芯片我们只需要通过USB线连接电脑即可。3. UART驱动开发3.1 寄存器配置I.MX6ULL的UART控制器通过一组寄存器进行配置主要寄存器包括// UART寄存器基地址 #define UART1_BASE 0x02020000 // 主要寄存器偏移量 #define URXD 0x0 // 接收数据寄存器 #define UTXD 0x40 // 发送数据寄存器 #define UCR1 0x80 // 控制寄存器1 #define UCR2 0x84 // 控制寄存器2 #define UCR3 0x88 // 控制寄存器3 #define UCR4 0x8C // 控制寄存器4 #define UFCR 0x90 // FIFO控制寄存器 #define USR1 0x94 // 状态寄存器1 #define USR2 0x98 // 状态寄存器2 #define UESC 0x9C // 转义字符寄存器 #define UTIM 0xA0 // 超时寄存器 #define UBIR 0xA4 // 波特率增量寄存器 #define UBMR 0xA8 // 波特率乘数寄存器 #define UBRC 0xAC // 波特率计数寄存器3.2 初始化代码实现下面是UART初始化的完整代码实现void uart_init(void) { // 1. 使能UART时钟 *((volatile unsigned int *)0x020C406C) | (1 0); // CCM_CCGR5_CG12 // 2. 设置UART1_TXD复用为UART功能 *((volatile unsigned int *)0x020E0084) ~(0xF 20); *((volatile unsigned int *)0x020E0084) | (0x1 20); // 3. 设置UART1_RXD复用为UART功能 *((volatile unsigned int *)0x020E0088) ~(0xF 0); *((volatile unsigned int *)0x020E0088) | (0x1 0); // 4. 禁用UART *((volatile unsigned int *)(UART1_BASE UCR1)) 0; // 5. 设置UART参数 *((volatile unsigned int *)(UART1_BASE UCR2)) 0; *((volatile unsigned int *)(UART1_BASE UCR2)) | (1 5); // 发送使能 *((volatile unsigned int *)(UART1_BASE UCR2)) | (1 2); // 接收使能 *((volatile unsigned int *)(UART1_BASE UCR2)) | (1 1); // 8位数据 // 6. 设置波特率为115200 *((volatile unsigned int *)(UART1_BASE UFCR)) 0x81; // 分频器1分频 *((volatile unsigned int *)(UART1_BASE UBIR)) 0x0F; *((volatile unsigned int *)(UART1_BASE UBMR)) 0x16A; // 7. 使能UART *((volatile unsigned int *)(UART1_BASE UCR1)) | 0x1; }3.3 发送与接收函数实现实现基本的字符发送和接收函数// 发送一个字符 void uart_putc(char c) { while (!(*((volatile unsigned int *)(UART1_BASE USR2)) (1 3))); *((volatile unsigned int *)(UART1_BASE UTXD)) c; } // 接收一个字符 char uart_getc(void) { while (!(*((volatile unsigned int *)(UART1_BASE USR1)) (1 0))); return *((volatile unsigned int *)(UART1_BASE URXD)) 0xFF; } // 发送字符串 void uart_puts(const char *s) { while (*s) { uart_putc(*s); } }4. 实现串口回显功能现在我们可以将上述代码组合起来实现一个简单的回显功能开发板接收到任何字符后立即将其发送回去。4.1 主程序实现int main(void) { // 初始化UART uart_init(); // 打印欢迎信息 uart_puts(\r\nUART Echo Demo\r\n); uart_puts(Type anything and it will echo back\r\n); // 主循环 while (1) { char c uart_getc(); uart_putc(c); // 回显接收到的字符 } return 0; }4.2 编译与下载编写Makefile文件进行编译CROSS_COMPILE arm-linux-gnueabihf- CC $(CROSS_COMPILE)gcc LD $(CROSS_COMPILE)ld OBJCOPY $(CROSS_COMPILE)objcopy CFLAGS -Wall -O2 -nostdlib -fno-builtin -Iinclude TARGET uart_echo all: $(TARGET).bin %.o: %.S $(CC) $(CFLAGS) -c -o $ $ %.o: %.c $(CC) $(CFLAGS) -c -o $ $ $(TARGET).elf: start.o main.o $(LD) -T imx6ull.lds -o $ $^ $(TARGET).bin: $(TARGET).elf $(OBJCOPY) -O binary -S $ $ clean: rm -rf *.o $(TARGET).elf $(TARGET).bin编译完成后将生成的uart_echo.bin文件下载到开发板中运行。5. 功能验证与调试5.1 使用CuteCom进行测试打开CuteCom确保串口参数设置正确复位开发板应该能看到欢迎信息在CuteCom的输入框中输入任意字符观察回显情况5.2 常见问题排查如果遇到问题可以按照以下步骤排查无任何输出检查硬件连接是否正确确认波特率设置是否匹配检查程序是否正确下载到开发板输出乱码确认波特率设置是否正确检查时钟配置是否正确部分字符丢失检查发送和接收函数的等待条件可能需要增加适当的延时在实际项目中我发现最容易出错的地方是波特率配置。确保开发板和CuteCom使用相同的波特率参数包括数据位、停止位和校验位的设置。
http://www.gsyq.cn/news/1298033.html

相关文章:

  • 支付宝沙箱环境:从零搭建支付测试与调试实战
  • 五分钟完成python脚本配置直连taotoken多模型服务
  • 峰值电流模式控制中传播延迟的功率影响与补偿方案
  • NGA论坛浏览体验革命:5个实用技巧让你的摸鱼效率提升300%
  • FanControl深度实战指南:5分钟精通Windows风扇精准控制
  • NRF52832串口DFU保姆级教程:不用nRFgo Studio,手把手教你用nrfutil命令行搞定固件合并与升级
  • Windows终极优化神器:三分钟让Windows焕然一新
  • 基于MSP430与DRV8871的智能温控风扇系统设计与实现
  • 记一次Global Protect卸载引发的网络“瘫痪”与修复之旅
  • 3步解锁在线视频自由:m3u8_downloader让你的视频收藏再无限制
  • Ubuntu 18.04上UE打包程序Vulkan报错?别急着重装驱动,先试试这个库文件修复法
  • Tessent OCC时钟控制器配置避坑指南:如何与现有时钟门控单元协同工作
  • 别再为FluidSIM 3.6安装报错头疼了!WinHEX找不到进程?看这篇保姆级图文教程就够了
  • 本地AI音频处理终极指南:5分钟学会Audacity的OpenVINO插件完整使用
  • 基于Codebender在线IDE快速开发Adafruit FLORA可穿戴硬件项目
  • PLC-02-从开关到逻辑:常开常闭触点的实战编程
  • Raspberry Pi Imager终极指南:快速上手树莓派系统安装
  • DCS控制系统核心特点解析:从可靠性设计到工业自动化集成
  • 告别答辩PPT内耗:用百考通AI高效完成你的毕业答辩准备
  • 12.长沙报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • OpenWrt UCI配置系统:核心机制、集成开发与实战指南
  • CMAQ建模者的效率工具:ISAT.M Linux版从环境配置到清单生成全记录
  • ArcGIS布局视图下,3分钟搞定地图经纬网添加与样式美化(附常见问题排查)
  • 别再只懂install_github了!深入聊聊R包管理:GitHub PAT、依赖与Linux系统库的那些事儿
  • 智能卡通信调优实战:手把手教你用逻辑分析仪抓取并解析ISO7816 PPS协商过程
  • 3步掌握WebPlotDigitizer:从图表图像智能提取数据
  • 从开发到上线:手把手教你用uniApp + Nginx搞定H5项目全链路部署(实战篇)
  • 从零到一:在ESXi 6.7上构建Ubuntu 22.04 Server生产环境
  • PEK-880模块驱动单相全桥逆变器:从电路原理到500W正弦波逆变实战
  • 【Midjourney进阶】四大核心操作精讲:Remix模式调优、图片管理、收藏与私信获取