嵌入式硬件篇---龙芯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通道定义
龙芯特性
- 龙芯处理器(如LS2K1000)的UART设备节点通常为**/dev/ttyS0~ /dev/ttyS3**,对应硬件UART0~UART3。
- 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); // 发送单字节}
}
关键点
- tcflush(uart_fd, TCOFLUSH)用于清空输出缓冲区,确保发送数据无残留。
- 龙芯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状态 */ }
以上分析结合了代码逻辑与龙芯平台特性,实际开发中需参考具体硬件手册调整参数。
相关文章:
嵌入式硬件篇---龙芯UART通信
文章目录 前言一、代码结构解析1. 头文件部分作用 2. 宏定义与全局变量龙芯特性 3. 主函数流程关键点 4. UART发送函数龙芯实现 5. 串口配置函数(set_port)龙芯注意事项 6. GPIO控制函数龙芯GPIO特性 7. PWM控制函数龙芯PWM实现 二、龙芯UART深度解析1. …...
[K!nd4SUS 2025] Crypto
最后一个把周末的补完。这个今天问了小鸡块神终于把一个补上,完成5/6,最后一个网站也上不去不弄了。 Matrices Matrices Matrices 这个是不是叫LWE呀,名词忘了,但意思还是知道。 b a*s e 这里的e是高斯分成,用1000…...
随机变量的不同收敛性
随机变量不同收敛性:一场有趣的趋近之旅😜 一、引言 在概率论这个奇妙的世界里,随机变量就像一群调皮的小精灵🧚 它们的行为充满了不确定性。而今天我们要讲的,就是这些小精灵们的 “趋近大冒险”—— 随机变量的不同…...
JavaScript 函数类型详解:函数声明、函数表达式、箭头函数
在 JavaScript 中,函数是构建逻辑的核心单元。本文将通过 定义对比、核心特性 和 使用场景 三个维度,全面解析以下三种函数类型的区别: 函数声明(Function Declaration)函数表达式(Function Expression&am…...
工作记录 2017-02-04
工作记录 2017-02-04 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、DataExport的设置中去掉了ListPayors,见DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改为 “Insurance Name”。 3、修改了Payment Posted的E…...
Etcd 服务搭建
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…...
【C++】stack和queue的使用及模拟实现(含deque的简单介绍)
文章目录 前言一、deque的简单介绍1.引入deque的初衷2.deque的结构3.为什么选择deque作为stack和queue的底层默认容器 二、stack1.stack的介绍2.stack的使用3.stack的模拟实现 三、queue1.queue的介绍2.queue的使用3.queue的模拟实现 前言 一、deque的简单介绍(引入…...
Spring Boot - Spring Boot 静态资源映射(默认静态资源映射、自定义静态资源映射)
一、静态资源映射 在 Spring Boot 中,静态资源的映射是指将特定的 URL 路径与静态资源关联起来 静态资源有例如,HTML、CSS、JS、图片等 这使得客户端可以通过 URL 路径访问这些资源 二、默认静态资源映射 概述 Spring Boot 默认会将以下目录中的文件…...
MySQL原理:逻辑架构
目的:了解 SQL执行流程 以及 MySQL 内部架构,每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层:连接层 3.1 数据库连接池(Conn…...
ora-600 ktugct: corruption detected---惜分飞
接手一个oracle 21c的库恢复请求,通过Oracle数据库异常恢复检查脚本(Oracle Database Recovery Check)脚本检测之后,发现undo文件offline之后,做了resetlogs操作,导致该文件目前处于WRONG RESETLOGS状态 尝试恢复数据库ORA-16433错误 SQL> recover datafile 1; ORA-00283:…...
Houdini :《哪吒2》神话与科技碰撞的创新之旅
《哪吒2》(即《哪吒之魔童闹海》)截止至今日,荣登全球票房榜第五。根据猫眼专业版数据,截至2025年3月15日,《哪吒2》全球累计票房(含预售及海外)超过150.19亿元,超越《星球大战&…...
flink 写入es的依赖导入问题(踩坑记录)
flink 写入es的依赖导入问题(踩坑记录) ps:可能只是flink低版本才会有这个问题 1. 按照官网的导入方式: 2. 你会在运行sql-client的时候完美得到一个错误: Exception in thread "main" org.apache.flink.table.client.SqlClientEx…...
PCL 高斯函数拟合(正太分布)
文章目录 一、简介二、实现代码三、实现效果一、简介 类似于之前最小二乘法的做法,我们需要先确定目标函数: 通过最小二乘法,找到使预测值与实际数据残差平方和最小的参数: 不过由于这是一个非线性最小二乘问题,因此这里无法使用矩阵的形式之间求解它的解析解了,因此这里…...
深度革命:ResNet 如何用 “残差连接“ 颠覆深度学习
一文快速了解 ResNet创新点 在深度学习的历史长河中,2015年或许是最具突破性的一年。这一年,微软亚洲研究院的何恺明团队带着名为ResNet(残差网络)的模型横空出世,在ImageNet图像分类竞赛中以3.57%的错误率夺冠&#…...
Java基础与集合
参考 Java基础知识详解:从面向对象到异常处理-CSDN博客 2024年 Java 面试八股文(20w字)_java面试八股文-CSDN博客 基础知识 java概述 什么是java? java是一种面向对象的编程语言 java特点 面向对象(继承&#…...
【Python 算法零基础 1.线性枚举】
我装作漠视一切,以为这样就可以不在乎 —— 25.3.17 一、线性枚举的基本概念 1.时间复杂度 线性枚举的时间复杂度为 O(nm),其中 n是线性表的长度。m 是每次操作的量级,对于求最大值和求和来说,因为操作比较简单,所以 …...
深入理解 Linux 的 top 命令:实时监控系统性能
在 Linux 系统管理和性能优化中,top 命令是一个不可或缺的工具。它可以实时显示系统的进程信息和资源使用情况,帮助管理员快速定位性能瓶颈。本文将详细介绍 top 命令的输出内容及其使用方法,帮助你更好地掌握系统性能监控。 一、top 命令简介 top 是一个动态显示系统状态的…...
003 SpringCloud整合-LogStash安装及ELK日志收集
SpringCloud整合-LogStash安装及ELK日志收集 文章目录 SpringCloud整合-LogStash安装及ELK日志收集1.安装ElasticSearch和kibana2.Docker安装logstash1.拉取docker镜像2.创建外部挂载目录3.拷贝容器内部文件到宿主机4.修改外部挂载文件5.运行docker容器 3.整合kibana1.进入kiba…...
AI预测体彩排3新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月18日第22弹
前面由于工作原因停更了很长时间,停更期间很多彩友一直私信我何时恢复发布每日预测,目前手头上的项目已经基本收尾,接下来恢复发布。当然,也有很多朋友一直咨询3D超级助手开发的进度,在这里统一回复下。 由于本人既精…...
数据结构入门(1)——算法复杂度
目录 一、前言 二、数据结构 2.1数据结构的概念 2.2数据结构的组成 2.3算法 三、oj题引进 四、复杂度 4.1复杂度的概念 4.2大O渐进表示法 4.3时间复杂度 4.4时间复杂度计算示例 4.4.1示例1 4.4.2示例2 4.4.3示例3 4.4.4示例4 4.4.5示例5 4.4.6示例6 4.4.7示例7 4.4.8示例8 4.5空…...
JavaScript基础-DOM 简介
在现代Web开发中,JavaScript与HTML和CSS一起构成了网页的核心技术。而在这三者之中,DOM(Document Object Model,文档对象模型)作为浏览器处理网页内容的一种接口,扮演着至关重要的角色。通过DOM,…...
VS Code + Git 分支操作指南(附流程图)
VS Code + Git 分支操作指南(附流程图) 本指南将手把手教你如何在 Visual Studio Code (VS Code) 中使用 Git 进行项目开发管理,配合标准分支模型(main、develop、feature/* 等),并附上直观的流程图,适合新手快速上手! 📌 前置准备 安装 Git安装 VS Code安装 VS Cod…...
Oracle ASM Failgroup故障组
Oracle ASM Failgroup故障组 1. 故障组的核心作用2. 故障组的配置规则3. 故障组的设计最佳实践4. 故障组的实际示例场景1:普通冗余(2个故障组)场景2:高冗余(3个故障组,跨数据中心) 关键注意事项…...
【最新版】智慧小区物业管理小程序源码+uniapp全开源
一.系统介绍 智慧小区物业管理小程序,包含小区物业缴费、房产管理、在线报修、业主活动报名、在线商城等功能。为物业量身打造的智慧小区运营管理系统,贴合物业工作场景,轻松提高物业费用收缴率,更有功能模块个性化组合,助力物业节约成本高效运营。 二.搭建环境 系统环…...
DeepSeek搭建本地知识库
1. 注册硅基流动 首先,打开浏览器,访问硅基流动的官方网站。 https://account.siliconflow.cn/ 在注册页面准确输入你的手机号,完成账号注册。这是搭建本地知识库的第一步,为后续获取重要权限做准备。 成功注册后,进…...
实验9 高级搜索技术1
实验9 高级搜索技术1 一、实验目的 (1)掌握高级搜索技术的相关理论,能根据实际情况选取合适的搜索方法; (2)进一步熟悉爬山法搜索技术,掌握其在搜索过程中的优缺点; (3&…...
【数据挖掘】Python基础环境安装配置
【数据挖掘】Python基础环境安装配置 一、摘要二、安装Python3.13.2三、安装Jupyter Notebook四、安装Numpy和Pandas以及matplotlib五、安装scikit-learn库和seaborn库 一、摘要 本文主要介绍如何在Windows上安装Python3.13.2,然后基于该Python版本安装Jupyter not…...
【2025新版本】【谷粒商城版】Kubernetes
本文作者: slience_me 文章目录 【2025】Kubernetes1. docker安装2. kubernetes安装前3. kubeadm,kubelet,kubectl3.1 简介kubeadmkubeletkubectl常用指令 3.2 安装3.3 kubeadm初始化3.4 加入从节点(工作节点)3.5 安装Pod网络插件(CNI)3.6 Ku…...
vulhub-Billu-b0x攻略
靶场下载链接 https://download.vulnhub.com/billu/Billu_b0x.zip 将kali和Billu,NAT连接 获取靶场ip arp-scan -l 使用diesearch进行目录扫描 dirsearch -u " " 查看目录中的信息 打开add.php,得到有上传文件功能的(看到后面你会发现其实这里就可以完…...
vue3+Ts+elementPlus二次封装Table分页表格,表格内展示图片、switch开关、支持
目录 一.项目文件结构 二.实现代码 1.子组件(表格组件) 2.父组件(使用表格) 一.项目文件结构 1.表格组件(子组件)位置 2.使用表格组件的页面文件(父组件)位置 3.演示图片位置 ele…...
