STM32-LCD
LCD显示 SRAM与FLASH最近在玩STM32的LCD显示时,发现了一些关于内存空间的问题。
stm32的FLASH可以类比于ROM(相当于硬盘),SRAM可以类比于RAM(内存),但也有一些区别,先不具体了解了,后面再说。
图片的表示有多种方式:RGB、HSV等。在传输图片时,一般是将图片的RGB转换成三种颜色对应的数字,数字的范围我们一般是采用从0-255,但是这也不是绝对的,可将范围变大变小,有时为了减少数据量,适当牺牲色彩的细腻也是可以接受的。由于采用的芯片STM32F103C8T6的SRAM太小,因此采用16bety的数据对每个像素进行表示,这依然有两种方式:
RGB565:用5位表示红、6位表示绿、5位表示蓝RGB555:16位数据中用5位表示红、5位表示绿、5位表示蓝,浪费一位
这里采用RGB565的方式。
由于我使用的屏幕是128*160分辨率,故需要先对图片进行按比例缩放,同时将图片数据解析为数字信息。采用python实现该功能:
1234567891011121314151617181920212223242526272829303132333435363 ...
STM32F10*系列单片机开发
STM32F10*系列单片机开发开发方式常用于开发STM32的有三种方式:
直接操作寄存器
使用官方库函数
ST官方推出的HAL库
这三者区别在于:操作寄存器过于麻烦,库函数只适合某系列的STM32单片机(比如STM32F1的代码就不能直接移植到STM32F4上去),HAL库则适用于STM32全系列单片机。且目前库函数版本官方已经停止更新,大势所趋是使用__HAL库__。
不同芯片的开发不同的STM32芯片可以共用同一份HAL库,但是并不意味着代码可以完全不改,不同的芯片引脚数、引脚用处可能不尽相同。比如STM32F103ZET6有144个引脚,STM32F103C8T6只有48个引脚。
在开发时,我们需要查看相应的数据手册和电路板的原理图。
以网上找到的STM32F103C8T6资料为例(方便后续查找):
可以看到虽然引脚数不同,但是对于同一引脚对应的主要功能和额外功能都是相同的。因此我们在将其他芯片的代码迁移过来时,需要额外关注使用的芯片是否具有该引脚,没有则需要寻找合适的引脚替代以实现想要的功能。此外我们还需要关注芯片的外设,以下图为例,正点原子的精英版STM3 ...
RC522
认识RC522模块RC522是一种常用的无线射频识别(RFID)模块,广泛用于门禁系统、身份识别、支付系统等领域。它基于13.56MHz的射频技术,与NFC(近场通信)技术兼容,能够读取和写入符合ISO/IEC 14443 A/MIFARE协议的标签和卡片。
ic卡结构ic卡,比如我们日常使用的校园卡,以最常见的MIFARE Classic IC卡为例:包含16个扇区,每个扇区由4个块组成,每个块可以存储16个字节的数据。每个扇区的最后一个块是尾块,包含了两个密钥(Key A和Key B)以及访问条件。这些密钥和访问条件用于控制对相应扇区的读写权限。
其中扇区0:第一个扇区(扇区0)的第一个块(块0)被称为制造商块,它包含了卡片的唯一标识符(UID)、制造商数据等信息,是出厂时就写入的,而且在大多数情况下无法更改。
其他扇区可用于存放个人信息:姓名、性别、出生日期等;账户信息:余额、最近交易记录等……
因此当你给校园卡充值后,需要通过某种形式的刷卡操作,将新的金额信息写入到卡内,这样卡内保存的金额信息才会更新。
例子:扇区1的布局
**块0 (扇区1的第1块)**: ...
dji Manifold2 C++开发
dji Manifold2 C++开发下载疆官方的onboard-sdk的原始工程项目,并进入示例代码的目录:,使用如下命令将示例代码编译为示例程序:
123mkdir build && cd buildcmake ..` 或 `cmake .. -DADVANCED_SENSING=ON#(使用视觉功能)make
执行示例程序1. 复制配置文件将配置文件UserConfig.txt拷贝到bin文件中:
1cp ../sample/platform/linux/common/UserConfig.txt bin/
2. 输入程序运行命令(如下以运行flight control 示例代码为例)1./djiosdk-flightcontrol-sample UserConfig.txt UserConfig.txt
Cmake的使用在文件的根目录下有一个CMakeLists.txt文件:
12345678910111213141516171819202122232425262728cmake_minimum_required(VERSION 2.8)project( ...
dji妙算2装python3.8
dji妙算2装python3.8去官网下载Python-3.8.1.tar.xzwget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz
如果下载失败 1.将服务器DNS改成 8.8.8.8 2.将源改为清华或者豆瓣源
解压并进入解压文件的目录:12tar -xvJf Python-3.8.1.tar.xzcd Python-3.8.1/
安装依赖(非必要,但建议都装一下,不装可能会在step5 或者 装完跑代码的时候报错)
执行下列命令安装依赖过程中,如有提示,一律输入 y 。
12sudo apt-get install python-dev libffi-dev libssl-devsudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz- ...
about labelImg
目标检测自制数据集下载打标工具:labelImg(https://github.com/tzutalin/labelImg/releases或者[labelImg · PyPI](https://pypi.org/project/labelImg/))
Open Dir打开存放待标定图片的文件夹。
选择需要的format(比如yolo或者PascalVOC)。
接下来就可以开始打标签了。
分享好用的快捷键:
w 开始创建矩形框;
d 切换到下一张图;
a 切换到上一张图;
此外还可以通过view的Auto Save Mode自动保存(当切换下一张图片时自动保存),以及Single Class Mode减少工作量。
★ 一定要自定义一下标签,在下载完后会得到windows_v1.8.1这样的文件夹,进去后有一个data的子目录,目录中有一个存放标定标签的文件predefined_classes.txt,里面会有一些初始的标签,要根据自己的需要进行修改。
about server
关于云服务器安装ssh:ubuntu:
1sudo apt-get install ssh
centOS:
1yum -y install openssh
启动服务:
1service sshd start
配置端口:
1vim /etc/ssh/sshd_config
取消root 22和PermitRootLogin yes的注释
远程访问:输入ssh root@120.26.208.83(@后面填写公网IP),再输入密码后可以访问云服务器。
查看服务器端口使用情况
1netstat -nultp
云服务器开放某端口后,服务器可以访问本地服务,但是不能通过公网IP进行访问时,需要修改云服务器提供商的安全组手动添加允许访问的端口。
好用的curl命令,可以检查某端口是否开放了:
1curl IP:端口
设置开机自启动自己写一个shell脚本 将写好的脚本(.sh文件)放到目录 /etc/ ...
云服务器之搭建chatgpt
搭建chatgpt搭建过程比较简单,首先用ssh根据连接自己的服务器,然后
1.安装docker环境:
1apt update && apt install docker.io -y
2.拉取pandora镜像
1docker pull yidadaa/chatgpt-next-web
3.启动容器
这里设置的端口是3000,也可以自己改成其他端口
1234docker run -d -p 3000:3000 \ -e OPENAI_API_KEY=sk-xxxx \ -e CODE=your-password \ yidadaa/chatgpt-next-web
这里推荐使用国内中转网站https://api.chatanywhere.tech,API_KEY可以在https://github.com/chatanywhere/GPT_API_free?tab=readme-ov-file中申请。
12345docker run -d -p 3000:3000 \ -e OPENAI_API_KEY=sk-xxxx \ -e CODE=you ...
关于python的一些注意点
about python赋值不可变对象时,(如:整数、元组等),赋值的是这个值的新引用,例如:当你创建一个新的整数变量时,python实际上为那个整数值创建了一个引用。
而对于可变对象(列表、字典、集合等),则是对同一个对象创建了引用,浅拷贝也是如此,例如:
12345i={"name":"jim"} #创建这样一个字典a=i #赋值给aa["name"]="jack" #修改a的字典print(i) #结果:{"name":"jack"}
如想对可变对象拷贝一个完全独立的变量可采用深拷贝:
123456import copyoriginal_list = [[1,2],[3,4]]copy_list = copy.deepcopy(original_list)copy_list[0][1] = 'a'print(original_list)#结果:[[1,2],[3,4] ...
Building Cloud Storage
云服务器之搭建私有云下载docker并安装
1curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
开启docker服务
1systemctl start docker
拉取镜像
1docker pull seafileltd/seafile
查看镜像
1docker images
运行容器
1234567docker run -d --name seafile-e SEAFILE_SERVER_HOSTNAME=xx.site(IP)-e SEAFILE_ADMIN_EMAIL=mail.xx@qq.com-e SEAFILE_ADMIN_PASSWORD=your_password-v /opt/seafile-data:/shared-p 80:80seafileltd/seafile:latest
找到创建的seafile容器contanier id
1docker ps -a
输入刚才contanier id
1docker stop ${contanier id } ...