
个人笔记,随笔
文章平均质量分 66
年纪青青
嵌入式软件工程师:单片机编程,电路设计,Linux,Qt,opecv计算机视觉
展开
-
泰山派GPIO子系统驱动---亮灯
本文将以开发板第40引脚GPIO3_B4作为LED灯珠的控制引脚,高电平灯亮,低电平灯灭。原创 2024-12-26 16:07:43 · 914 阅读 · 0 评论 -
ESP32S3 Smartconfig配网模式下,使用nvs存储wifi信息,免去重复配网
使用Smartconfig配网,配网信息使用nvs存储,下次设备可使用配网信息直接联网原创 2024-05-14 10:31:23 · 813 阅读 · 0 评论 -
Linux开机启动程序添加root权限
DebainUbuntu系列Linux开机之后会执行文件中的命令,所以,如果是想添加登陆用户所具有权限的操作,可以在文件中exit 0之前添加开机自动执行的脚本命令。再加入自动执行脚本:在exit 0的上面新起一行,写入。以上情况均适用于脚本中的执行命令都不需要root权限才能执行的操作,但是,如果x.sh脚本中具有只有root权限才能执行的操作时,以上的方式便不能生效。原创 2023-08-17 13:13:04 · 1738 阅读 · 0 评论 -
LVGL V8.3 使用lvgl文件系统读取SD卡内容基于Arduino
基于Arduino,适配lvgl的文件系统读取SD卡内容原创 2022-11-02 11:34:49 · 5545 阅读 · 3 评论 -
MAX6675 带冷端补偿的热电偶测温芯片驱动-基于STM32 HAL库
MAX6675 简介MAX6675 是一款带冷端补偿的热电偶测温芯片,通过3线SPI总线直接输出热电偶测量温度值。引脚如下:与单片机连接关系如下:通信时序与数据格式如下:MAX6675 驱动.c#include "max6675.h"SPI_HandleTypeDef hspi2;/* SPI2 init function */void SPI2_Init(void){ hspi2.Instance = SPI2; hspi2.Init.Mode = SPI_MODE_原创 2021-02-04 11:09:29 · 5262 阅读 · 4 评论 -
HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库
HIH8121温湿度传感器代码基于STM32 HAL库HIH8121传感器简介驱动代码.c驱动代码.hmain函数HIH8121传感器简介HIH8121是霍尼韦尔公司生产的测量温湿度参数一体的传感器,测量范围满足湿度:0-100%温度:-40-125℃,湿度测量误差±2%,温度测量误差±0.5℃。四引脚封装,分别是电源、接地、IIC总线的两条数据线,在使用绘制PCB时要尽量避免与发热器件靠近。驱动代码基于STM32 HAL库编写,除微秒延时函数未给出(需要自己实现无法统一给出,根据自身单片机主频大小、是原创 2021-02-04 10:41:38 · 1232 阅读 · 0 评论 -
AWTRIX像素灯DIY制作过程
前言Lametric像素时钟很好看,但是无奈太贵(国外 200 刀,淘宝要卖到 1500-2000 人民币)。但 AWTRIX 2.0 项目,花很少的钱就能自己 DIY 一个 WIFI 像素时钟。下面提供一种DIY方案。AWTRIX实现原理:使用一台电脑或者树莓派作为AWTRIX时钟的服务器用来部署相关服务用来运行APP和数据传输,AWTRIX时钟连接服务器后获取数据进行显示。准备材料ESP8266开发板一块,最好是买官方推荐D1 Mini,其他ESP8266开发版也可以。(核心配件)...原创 2020-11-27 22:05:24 · 7901 阅读 · 2 评论 -
linux线程及线程同步(锁的应用)
linux线程 linux原本没有线程,后来在windows多线程编程影响下linux内核开发者在进程基础上在功能上做出了类似windows线程的linux版本的线程,linux线程归根到底还是进程,只不过是轻量级的进程,开销比真正进程要小得多,大家还是要明白linux与windows在线程方面功能虽然类似,但是底层实现是非常不同的。linux进程大概实现原理 在进程...原创 2018-06-08 15:36:33 · 4926 阅读 · 0 评论 -
QT入门(一)Qt工程简介、信号与槽初步练习
QT入门篇讲义笔记(一)标签(空格分隔): QT 信号与槽 信号重载 lambda函数QT程序结构程序特点跟普通程序一样,头文件,源文件,工程文件.pro头文件特点QT系统头文件没有.h头文件和类名一样命名Q开头,前两个字母大写工程文件.Pro的相关介绍# 模块QT += core gui# 高于4版本添加本句内容,增加兼容greaterTh...原创 2018-06-29 10:56:58 · 618 阅读 · 1 评论 -
Qt入门(二)做一个类似记事本的窗口
windows应用要素菜单栏工具栏状态栏核心窗体实现一个类似记事本的窗体#include "mainwindow.h"#include <QMainWindow>#include <QMenuBar>#include <QMenu>#include <QAction>#include <QToolBa...原创 2018-06-29 14:08:50 · 673 阅读 · 0 评论 -
基于JZ2440自己编写4.3寸LCD驱动
简介 linux内核自带LCD驱动,这里我们自己从头写一个LCD驱动程序,编写APP的人只知道使用open、read、write······,并不清楚原理图或者寄存器,这接口函数最终调用的是我们自己在驱动中实现的驱动层open、read、write,这些代码与硬件息息相关。一般写驱动基本步骤就是: 定义主设备号 写一个文件操作集合 register_chidev进行...原创 2018-08-26 09:48:24 · 883 阅读 · 0 评论 -
基于JZ2440实现linux驱动异步通信
按键驱动前期按键驱动无论是查询、中断、poll都是采用应用程序主动查询的方式,能不能有一种按键按下,驱动告诉应用程序该查询的机制呢?那是肯定的,类似于系统编程的信号机制。这里需要解决核心问题: 信号发出者 信号接收者 信号怎么发建立一个异步通信结构体该结构体存储相关信息static struct fasync_struct *button_fasync;建立系...原创 2018-08-23 08:19:45 · 239 阅读 · 0 评论 -
makefile快速入门
Makefile干嘛的? 当我们编程做一个项目,文件众多复杂,不可能每次编译都去敲gcc指令编译链接工程,一则效率不高,随便修改某个文件就需要把工程内所有文件都编译一遍,二则包含项目太多稍不注意就会遗漏、缺失容易出错,Makefile其实就是一个项目工程管理工具,只需要执行make指令,就能做到像编程IDE中的build按钮那样轻轻一点自动把项目编译完成。生成目标程序,效率很高,但要写好M...原创 2018-04-26 12:36:56 · 1060 阅读 · 1 评论 -
linux进程相关函数(获取、销毁、切换···)
进程概述进程:就是进行中的程序 程序:存放指令的程序文件,存放在磁盘上,固定不变的,保存着指令的有序集合。 程序执行过程:将程序从硬盘导入到内存,内存上分为代码区、静态变量区、堆栈区等等 文本区:储存处理器执行的代码 数据区:存储变量和动态分配的内存:全局变量,局部变量,静态变量, 堆栈区:存储着活动进程调用的指令和本地变量,指针变量->栈区,动态分配的内存->堆区 进...原创 2018-05-04 08:23:42 · 3888 阅读 · 0 评论 -
linux下gcc基本操作以及静态库、动态库的制作
c文件编译过程预编译(展开头文件、去掉注释、宏处理)(.c->.i)编译(.i->.s) 汇编 (.s->.o)链接 (.0->app)基本指令gcc-E:预处理将.c文件变为.i文件(其实也是c文件)-S:编译,将.i文件变为.s汇编文件-c:汇编,将.c文件变为.o二进制文件-o:指定名称-g:gdb调试的时候需要加-D:在...原创 2018-04-25 15:47:08 · 354 阅读 · 0 评论 -
vim 基本够用的操作命令
命令模式保存退出:ZZ 若果文件不存在,退出时不会创建新的文件代码格式化:gg=G光标移动 上下左右:hjkl光标移动到行首:0光标移动到行尾:$光标移动到文件开头:gg光标移动到文件末尾:G光标跳转到某行:行号+G行号回车:当前行向下跳转行号数行删除命令 删除字符:x:删除光标后面的字符;X:删除光标前面的字符删除单词(删除光标后面到单词尾):dw 删除某行光标前...原创 2018-04-24 13:16:36 · 285 阅读 · 1 评论 -
C++类的继承与派生
继承与派生概述 继承与派生是同一过程从不同的角度看 保持已有类的特征而构造新类的过程称为继承 在已有类的基础上新增自己的特性而产生新类的过程称为派生 被继承的已有类称为基类(或父类) 派生出的新类称为派生类(或子类) 直接参与派生出某类的基类称为直接基类 基类的基类甚至更高层的基类称为间接基类 继承的目的 实现设计与代码的重用原创 2018-04-13 15:05:34 · 389 阅读 · 0 评论 -
C++中string类简介
string类c风格的字符串,用数组或者指针接收字符串,字符串以‘\0’结束,否则不能被判定为字符串,用数组承接字符串时,若字符串长度未知,对数组长度不好掌握,在进行字符串的连接、比较等操作时需要调用标准c库函数十分不方便。在C++中专门定义了一个字符串类string 函数名 功能 示例 string() 默认构造函数,建立一个长度为0的串 string s1; strin原创 2018-04-12 16:52:46 · 286 阅读 · 0 评论 -
Linux进程通信之信号通信
信号通信信号通信很简单,将特定信号传递给进程,使进程进行相应动作,信号是软中断,只要执行过,就生效,不必一直卡死等待信号来临,以此达到通信的目的。linux信号量有很多在文章最后列举;信号通信函数结构#include <signal.h> void (*signal(int signo,void(*func)(int)))(int) 可以看到信号函数结构比较复杂 sign原创 2018-04-18 12:36:58 · 254 阅读 · 0 评论 -
Linux进程通信之消息队列
消息队列简介进程通信信号量方式传送信息量有限,管道只能传送无格式字节流,无疑给程序开发带来不便,消息队列克服了这些缺点。消息队列就是一个消息链表,可以把消息看做一个记录,具有特定格式,进程可以向其中按照一定规则添加新消息;另一些进程可以从消息队列读走消息。消息队列只有在内核重新启动,或者人工删除才会消失。消息队列内核持续性需要消息队列在系统范围内拥有唯一个键值,所以,要获得一个消息队列的描述字,必须原创 2018-04-18 11:34:20 · 179 阅读 · 0 评论 -
基于JZ2440编写触摸屏驱动
简介 JZ2440开发板配套的是一款4.3英寸电阻触控屏,电阻触控屏原理很简单,就是尖锐物体在某一个点按下,上面触控薄膜导电,由于这个点举例起始点暂且规定00点,距离不同,电阻薄膜导电电阻不同,电压压降也就不同,原理就是通过判断XY两个方向轴与零点之间的电压差确定触控位置。内核触控驱动 内核自带触摸屏驱动,在s3c2440_ts.c这个文件,实现这个文件的主体框架就是...原创 2018-08-26 16:36:06 · 1024 阅读 · 0 评论 -
Linux输入子系统框架
输入子系统自己写的驱动程序,自己可以调用,我们自己写驱动的流程一般是,建立fops结构,使用register_chrdev在初始化函数中进行注册,在应用中使用open函数打开该设备。这种驱动不标准只能在公司内部,别人知道驱动用法的情况下才能使用,当我们使用QT等标准程序时,这类标准程序不能打开像我们这样的野驱动,我们应该让我们的驱动程序融入“标准”中去,linux提供的输入子系统输...原创 2018-08-23 08:11:54 · 332 阅读 · 0 评论 -
QT以文本流形式读写文件操作
ui文件为两个按钮,一个文本编辑区,按钮控制读写操作,文本框显示文本内容#include "mywidget.h"#include "ui_mywidget.h"#include <QDebug>MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget){ ui...原创 2019-04-02 21:03:09 · 2604 阅读 · 1 评论 -
QT二进制流方式读写文件
ui内容为两个按钮加一个文本编辑控件,以字节流方式保存一个文件,然后以流方式打开并通过转码显示。#include "mywidget.h"#include "ui_mywidget.h"#include <QDebug>MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidg...原创 2019-04-02 20:27:14 · 8197 阅读 · 0 评论 -
QT字符格式相互转换
QT字符格式相互转换//QString->QByteArrayQString buf = “123”;QByteArray a = buf.toUtf8();a = buf.toLocal8Bit(); //转化为本地编码 windows一般ANSI编码 linux中文默认utf8//QByteArray->char *char *b = a.data()...原创 2019-03-28 22:06:15 · 609 阅读 · 0 评论 -
linux下QT文本文件读取与保存操作
一个简单的文本读写操作文本格式为utf8。开文件显示乱码应该是文件编码问题,使用utf8无此问题(代码运行在linux平台)代码如下:#include "mywidget.h"#include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget)...原创 2019-03-28 21:53:26 · 5537 阅读 · 0 评论 -
移植QT5.7到tiny4412开发板
移植前的准备 虚拟机:ubuntu16.04,硬盘空间尽量大一些,20G略微有点小,开发板根文件系统已经做好。 交叉编译环境:arm-linux-gcc使用4.8版本以上,否则对c++11支持度不好,这里使用arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 QT5.7源码包:针对嵌入式平台编译,编译...原创 2018-08-28 08:44:42 · 4384 阅读 · 4 评论 -
基于JZ2440的LED平台驱动写法
驱动分层分离 在前面介绍的输入子系统中,核心层input.c,设备层button.c包含硬件相关代码,软件层cdev.c纯软件处理部分。 linux驱动中有很多类似的驱动形式,例如总线驱动platform平台设备模型 platform.c属于核心层级别,设备层device包含硬件相关代码,driver层包含驱动层相关代码属于比较固化稳定的软件代码,设备发生改变只要改变设备层代码...原创 2018-08-23 22:53:23 · 324 阅读 · 0 评论 -
基于linux的socket实现简易QQ代码
网络编程示例,写一个简单的QQ程序服务器端#include<arpa/inet.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<unistd.h>#include<s...原创 2018-08-23 08:50:35 · 1640 阅读 · 3 评论 -
linux基于socket网络编程
socket简介 Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的...原创 2018-08-23 08:35:25 · 7401 阅读 · 0 评论 -
ubuntu16网络命令、缺少一些库的应对方法
设置静态ip的方法打开网络配置文件/etc/network/interfacesvi /etc/network/interfaces默认内容# Configure Loopbackauto loiface lo inet loopbackauto eth0iface eth0 inet dhcp修改内容为:# Configure Loopb...原创 2018-08-23 08:26:09 · 783 阅读 · 0 评论 -
基于JZ2440实现驱动互斥操作以及阻塞非阻塞操作
实现同一驱动不能被同时打开思路很简单,设置一个变量,打开时减一,如果另外程序再将其打开,数值变化,就并不能打开。下面看伪代码static int canopen=1;int xxx_open(){ if(--canopen!=0) { return -1; }else { 正常打开; }}void xx...原创 2018-08-23 08:18:21 · 162 阅读 · 0 评论 -
JZ2440开发板之LED支持lseek
驱动#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/device.h>#include <linux/delay.h>#include ...原创 2018-08-23 08:15:20 · 208 阅读 · 0 评论 -
基于JZ2440按键输入子系统代码实现
简介 自己写驱动流程 APP:open、read、write 驱动层: 实现相应的open、read、write函数 使用file_operation结构挂接自己的相关函数 使用chrdev_register注册 初始化 退出等等 现在有了子系统结构,核心层已经有人写好,我们只需要实现两层即可:设备层、操作层 设备层实现步骤...原创 2018-08-23 08:13:40 · 393 阅读 · 0 评论 -
linux下C语言基本的目录操作编程函数简介
目录简介对于linux文件目录操作函数其实使用命令就能实现,但是其实对于一些命令本质上就是调用系统函数的,比如:madir,umask,chown等命令。获取文件信息主要函数#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>//不能读取软连接文件int st...原创 2018-04-22 11:00:56 · 3307 阅读 · 1 评论 -
Linux进程通信之共享内存
共享内存进程间共享内存通信,原理很简单,系统开辟一块内存空间,将其映射到物理内存,不同进程可以通过访问这个公共的共享空间完成数据交换,达到进程间通信的目的。访问快,使用简单。不需要额外的函数(如read write等) 使用共享内存包含两个步骤: 创建共享内存,使用shmget函数。 映射共享内存,将这段创建的共享内存映射到具体的进程空间,使用shmat函数。 shm原创 2018-04-18 10:09:14 · 233 阅读 · 1 评论 -
C++类与对象初步认识
C++语言概述C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。类与对象类和对原创 2018-04-11 17:25:13 · 334 阅读 · 0 评论 -
书写驱动必要安全性检测
驱动安全性意义驱动直接操作的对象是硬件,运行在内核空间,如果驱动不可靠一旦出现问题,操作系统会出现异常,有很大几率造成系统崩溃。因此驱动安全性极为重要,在驱动代码中凡是有可能执行失败的函数,都需要对其返回值进行判断,成功后才可以进入下一个环节。最大限度减少出错的可能。示例代码(没有安全检测)#include<linux/kernel.h>#include<linux/module.h>#incl原创 2017-10-26 08:39:08 · 315 阅读 · 0 评论 -
linux2.6标准字符设备驱动模型(手动注册)
linux2.6标准字符设备核心结构//虽然linux26有核心结构体,但在代码中没有具体操作,他们的调用在相关注册函数中对其有操作struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list;原创 2017-10-25 13:35:18 · 832 阅读 · 0 评论 -
手把手移植tiny4412开发板uboot
uboot的作用类似电脑BIOS,是芯片上电之后启动的一个引导程序(裸机),引导操作系统(linux)的启动原创 2017-10-12 13:14:56 · 1629 阅读 · 0 评论