嵌入式硬件篇---龙芯UART通信


文章目录

  • 前言
  • 一、代码结构解析
    • 1. 头文件部分
      • 作用
    • 2. 宏定义与全局变量
      • 龙芯特性
    • 3. 主函数流程
      • 关键点
    • 4. UART发送函数
      • 龙芯实现
    • 5. 串口配置函数(set_port)
      • 龙芯注意事项
    • 6. GPIO控制函数
      • 龙芯GPIO特性
    • 7. PWM控制函数
      • 龙芯PWM实现
  • 二、龙芯UART深度解析
    • 1. 硬件架构
      • 控制器类型
      • 时钟源
      • 寄存器映射
    • 2. 关键寄存器
    • 3. 驱动配置
      • 内核配置
      • 设备树配置
    • 4. 波特率计算
      • 公式
      • 示例
  • 三、代码优化建议
    • 错误处理增强
    • 非阻塞读取优化
    • PWM配置封装
  • 四、龙芯开发注意事项
    • 串口引脚复用
    • DMA模式启用
    • 硬件流控配置
    • 系统稳定性


前言

本文简单介绍了龙芯中的uart通信以及使用方法。


一、代码结构解析

1. 头文件部分

#include <stdio.h>       // 标准输入输出
#include <stdlib.h>      // 系统函数库(如system)
#include <time.h>        // 时间相关函数
#include <unistd.h>      // POSIX API(如usleep)
#include <fcntl.h>       // 文件控制(如open)
#include <termios.h>     // 串口配置结构体
#include <errno.h>       // 错误号定义
#include <string.h>      // 字符串操作
#include <sys/mman.h>    // 内存映射
#include <sys/types.h>   // 系统数据类型
#include <sys/stat.h>    // 文件状态

作用

作用:包含Linux环境下串口通信和系统操作所需的头文件。

2. 宏定义与全局变量

#define EXPORT "/sys/class/gpio/export"  // GPIO导出路径
#define DEV_NAME "/dev/ttyS2"            // 龙芯UART设备节点
#define pwm1 1                           // PWM通道定义

龙芯特性

  1. 龙芯处理器(如LS2K1000)的UART设备节点通常为**/dev/ttyS0~ /dev/ttyS3**,对应硬件UART0~UART3。
  2. PWM通道路径需根据具体硬件确定,可能与SoC的PWM控制器映射相关。

3. 主函数流程

int main() {// 初始化UARTuart_fd = open_port(DEV_NAME);        // 打开串口设备set_port(uart_fd, 115200, 8, 'N', 1); // 配置波特率等参数while(1) {usleep(500000);                  // 延时500msmemset(read_buf, 0, sizeof(read_buf));tcflush(uart_fd, TCOFLUSH);       // 清空缓冲区nread = read(uart_fd, read_buf, 4);// 尝试读取数据write_buf[0] = 6;                 // 发送数据6Uart_Send(uart_fd, write_buf, 1); // 发送单字节}
}

关键点

  1. tcflush(uart_fd, TCOFLUSH)用于清空输出缓冲区确保发送数据无残留。
  2. 龙芯UART的时钟源由CPU时钟分频而来,需确保波特率计算值与实际硬件匹配

4. UART发送函数

int Uart_Send(int fd, char *send_buf, int data_len) {return write(fd, send_buf, data_len); // 直接调用系统写函数
}

龙芯实现

龙芯UART驱动基于8250驱动框架,用户空间通过write()直接操作设备节点

5. 串口配置函数(set_port)

int set_port(int fd, int nSpeed, int nBits, char nEvent, int nStop) {struct termios newtio;// 配置数据位、校验位、停止位newtio.c_cflag |= CLOCAL | CREAD; // 本地连接+使能接收// 波特率设置(关键代码段)cfsetospeed(&newtio, B115200);    // 输出波特率cfsetispeed(&newtio, B115200);    // 输入波特率// 应用配置tcsetattr(fd, TCSANOW, &newtio);
}

龙芯注意事项

1.波特率精度依赖时钟分频器,需在硬件设计中确认UART时钟源频率。
2.若需更高波特率(如3Mbps),可能需要修改内核驱动中的分频参数。

6. GPIO控制函数

void export_gpio(int gpio) {system("echo XX > /sys/class/gpio/export"); // 通过sysfs操作
}

龙芯GPIO特性

1.GPIO编号需参考具体开发板手册,如LS2K1000的GPIO可能按Bank分组管理

2.部分GPIO可能复用为其他功能(如UART),需配置引脚复用寄存器

7. PWM控制函数

int pwm_config(unsigned int pwm, unsigned int period, duty_cycle) {// 通过sysfs设置周期和占空比write(fd, buf_p, len_p); // 写入period值write(fd, buf_d, len_d); // 写入duty_cycle
}

龙芯PWM实现

1.PWM控制器可能集成在SoC中,需内核启用pwm-ls等专用驱动。
2.周期(period)单位通常为纳秒(ns),需根据硬件限制设置合理值。

二、龙芯UART深度解析

1. 硬件架构

控制器类型

控制器类型:龙芯UART兼容NS16550A标准,支持DMA和FIFO模式

时钟源

时钟源:通常由APB总线时钟分频得到,例如LS2K1000的APB时钟为100MHz。

寄存器映射

寄存器映射:通过内存映射访问,用户空间无需直接操作寄存器。

2. 关键寄存器

寄存器 功能 偏移地址
RBR 接收缓冲 0x00
THR 发送保持 0x00
IER 中断使能 0x01
FCR FIFO控制 0x02
LCR 线路控制 0x03
MCR Modem控制 0x04
LSR 线路状态 0x05

3. 驱动配置

内核配置

内核配置:确保启用CONFIG_SERIAL_8250和CONFIG_SERIAL_8250_CONSOLE。

设备树配置

设备树配置:
uart0: serial@1fe40000 {
compatible = “ns16550a”;
reg = <0x1fe40000 0x100>;
interrupts = <8>;
clock-frequency = <100000000>; // APB时钟
};

4. 波特率计算

公式

公式:波特率 = 时钟频率 / (16 * 分频系数)

示例

示例:若时钟为100MHz,要求115200波特率:
分频系数 = 100000000 / (16 * 115200) ≈ 54.25
实际写入分频寄存器值:54(误差约0.46%)

三、代码优化建议

错误处理增强

// 在open_port中添加重试逻辑
int open_port(char *dir) {int fd, retries = 3;while(retries--) {fd = open(dir, O_RDWR | O_NOCTTY);if(fd >= 0) return fd;usleep(100000); // 等待100ms重试}return -1;
}

非阻塞读取优化

// 使用select实现超时读取
fd_set readset;
FD_ZERO(&readset);
FD_SET(uart_fd, &readset);
struct timeval timeout = {0, 500000}; // 500ms超时
if(select(uart_fd+1, &readset, NULL, NULL, &timeout) > 0) {read(uart_fd, buf, len);
}

PWM配置封装

void pwm_init(int pwm, int period, int duty) {pwm_export(pwm);pwm_config(pwm, period, duty);pwm_enable(pwm);
}

四、龙芯开发注意事项

串口引脚复用

确认硬件设计中UART的TX/RX引脚未被复用为GPIO或其他功能,需通过PINCTRL配置

DMA模式启用

对于高速传输(>1Mbps),可在内核驱动中启用DMA模式

// 修改驱动源码(drivers/tty/serial/8250/8250_port.c)
up->dma = dma_request_slave_channel(dev, "rx-tx");

硬件流控配置

若需RTS/CTS流控,在termios中设置:

newtio.c_cflag |= CRTSCTS;

系统稳定性

长时间运行需监控UART错误状态:

int status;
ioctl(uart_fd, TIOCMGET, &status);
if(status & TIOCM_CTS) { /* 处理CTS状态 */ }

以上分析结合了代码逻辑与龙芯平台特性,实际开发中需参考具体硬件手册调整参数。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36030.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka详解——介绍与部署

1. 什么是 Kafka&#xff1f; Kafka 是一个分布式的消息队列系统&#xff0c;最初由 LinkedIn 开发&#xff0c;后来成为 Apache 开源项目。它的主要用途包括实时数据处理、日志收集、数据流管道构建等。Kafka 具备高吞吐量、可扩展性、持久性和容错性&#xff0c;广泛应用于大…

win10搭建opengl环境搭建并测试--输出立方体球体和碗型并在球体上贴图

参照本文档可以完成环境搭建和测试&#xff0c;如果想要快速完成环境的搭建可以获取本人的工程&#xff0c;包括所用到的工具链和测试工程源码获取&#xff08;非免费介意务下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1H2ejbT7kLM9ore5MqyomgA 提取码: 8s1b …

TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket

DAY13.1 Java核心基础 TCP协议 TCP 协议是面向连接的运算层协议&#xff0c;比较复杂&#xff0c;应用程序在使用TCP协议之前必须建立连接&#xff0c;才能传输数据&#xff0c;数据传输完毕之后需要释放连接 就好比现实生活中的打电话&#xff0c;首先确保电话打通了才能进…

如何在 GoLand 中设置默认项目文件夹

在使用 GoLand 进行开发时&#xff0c;设置一个默认的项目文件夹可以大大提高工作效率。默认项目文件夹会在你打开或新建项目时自动预选&#xff0c;避免每次都需要手动导航到目标目录。本文将详细介绍如何在 GoLand 中设置默认项目文件夹。 步骤一&#xff1a;打开系统设置 …

SvelteKit 最新中文文档教程(5)—— 页面选项

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

Mac下Ollama安装全攻略:开启本地大模型之旅

文章目录 Mac下Ollama安装全攻略&#xff1a;开启本地大模型之旅一、Ollama 是什么功能特点优势应用场景 二、安装前准备&#xff08;一&#xff09;系统要求&#xff08;二&#xff09;硬件要求 三、下载安装包&#xff08;一&#xff09;官网下载&#xff08;二&#xff09;其…

华为营销流程落地方案:MTC=MTL+LTC

目录 简介 MTC流程 作者简介 简介 只讲最本质的底层逻辑&#xff0c;交付可落地的方案。 作为一个主打实践的产品老炮&#xff0c;接下来我将结合自己的经验&#xff0c; 以华为系的这套流程为基准&#xff0c; 将涉及业务层次的流程全部重构一套本地化、落地化的方案。 …

vscode使用ssh同时连接主机CentOS:user和ubuntu20.04:docker

主机为CentOS docker为Ubuntu20.04 两者可以使用一个vscode远程链接 1.使用已拉取好的Ubuntu镜像建立docker容器 2.进入容器内,下载一些关于ssh的安装包 apt-get install vim apt-get install openssh-client apt-get install openssh-server apt-get install ssh passwd …

NFS网络文件共享服务

文章目录 1. NFS工作原理1.1 挂载结构介绍1.2 NFS的工作原理 2. NFS服务安装2.1 NFS软件列表2.2 启动NFS相关服务2.3 NFS服务常见进程2.4 实战配置NFS服务器端 3. NFS服务配置3.1 在NFS Server端执行的操作3.1.1 查看部署环境3.1.2 启动rpcbind及NFS服务&#xff0c;然后加入开…

《多语言实时交流辅助系统前端的设计与实现》开题报告

个人主页&#xff1a;大数据蟒行探索者 目录 一、选题目的与意义 1.选题目的 2选题意义 2.1技术挑战与创新 2.2市场需求 2.3促进文化交流 2.4教育应用 2.5社会影响 二、研究现状与文献综述 1.研究现状 2.文献综述 2.1 前端技术的发展与应用 2.2 自然语言处理技术…

SpringCloud网关:Gateway路由配置与过滤器链

文章目录 引言一、Gateway基本架构二、路由配置方式2.1 配置文件方式2.2 Java代码方式 三、内置断言工厂四、内置过滤器工厂4.1 请求路径相关过滤器4.2 请求和响应头过滤器4.3 功能性过滤器 五、自定义过滤器5.1 自定义GatewayFilter5.2 自定义过滤器工厂 六、全局过滤器总结 引…

咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

Excel(函数进阶篇):Vlookup函数进阶、TAKE嵌套SORE函数、SUBTOTAL函数、INDIRECT函数

目录 Vlookup函数返回多列结果Vlookup函数多条件匹配Vlookup函数部分匹配TAKE函数嵌套SORT函数&#xff0c;提取排序数据SUBTOTAL函数&#xff1a;制作动态报表SUBTOTAL函数&#xff1a;创建连续编号INDIRECT函数Vlookup跨多表抓取数据INDIRECT函数常见跨表的错误Vloopup函数联…

大模型 VS 传统算法:人工智能时代的“新老对话“

大模型 VS 传统算法&#xff1a;人工智能时代的"新老对话" 在AlphaGo击败李世石、ChatGPT掀起全民AI热潮的今天&#xff0c;人们往往将"大模型"与"算法"混为一谈。但当我们深入技术内核时会发现&#xff0c;这二者恰似人工智能发展的两个平行宇…

【蓝桥杯每日一题】3.17

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 他们说内存泄漏是bug&#xff0c;我说这是系统在逼我进化成SSR级程序员 OK来吧&#xff0c;不多废话&#xff0c;今天来点有难度的&#xff1a;二进制枚举 二进制枚举&#xff0c;就是…

Matlab 汽车振动多自由度非线性悬挂系统和参数研究

1、内容简介 略 Matlab 169-汽车振动多自由度非线性悬挂系统和参数研究 可以交流、咨询、答疑 2、内容说明 略 第二章 汽车模型建立 2.1 汽车悬架系统概述 2.1.1 悬架系统的结构和功能 2.1.2 悬架分类 2.2 四分之一车辆模型 对于车辆动力学&#xff0c;一般都是研究其悬…

hackmyvm-Smol

信息收集 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: Cannot open MAC/Vendo…

深度学习项目--基于DenseNet网络的“乳腺癌图像识别”,准确率90%+,pytorch复现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;从ResNet发布后&#xff0c;很多人做了修改&#xff0c;denseNet网络无疑是最成功的…

基于x11vnc的ubuntu远程桌面

1、安装VNC服务 sudo apt install x11vnc -y2、创建连接密码 sudo x11vnc -storepasswd3、安装lightdm服务 x11vnc 在 默认的 GDM3 中不起作用&#xff0c;因此需要使用 lightdm 桌面管理环境 sudo apt install lightdm -y切换至lightdm&#xff0c;上一步已经切换则跳过该…

Git 常用命令完全指南:从入门到高效协作

文章需要结构清晰&#xff0c;涵盖从入门到进阶的常用命令&#xff0c;结合实例和注意事项&#xff0c;帮助用户快速掌握Git的核心功能&#xff0c;并应用到实际项目中 一、仓库初始化与基础操作 1. 创建与克隆仓库 # 初始化本地仓库 git init# 克隆远程仓库&#xff08;SSH方…