- 博客(95)
- 资源 (12)
- 收藏
- 关注
原创 C语言 int和unsigned int逻辑比较
判断两边符号相同时,判断结果和理论一样是正常的。判断两边符号不相同时,判断结果会和理论不一样,需要进行类型转换后再做比较。int和unsigned int 比较时,int会自动转换为unsigned int类型。其实也就是将int类型存储数值的补码当作unsigned int数据处理了。正数的补码等于原码,负数的补码等于反码+1。负数强转为正数,直接将负数补码当作原码处理就是强转后的值。都为int类型的判读汇编语句和都为unsigned int类型的判断汇编语句是不一样的。
2024-02-26 10:39:52 596
原创 STM32-UART-DMA HAL库缓冲收发
初始化接收即可,发送会在有数据时才会去操作DMA。单次DMA发送,需要开启DMA和UART中断。循环接收、需要开启DMA和UART中断。
2023-12-15 16:16:44 1740
原创 JaveScript 笔记 call apply
call,apply,bind函数目的都是为了将对象传递到函数里,只是带参方式不同js 函数内部如果使用了this,就不能直接调用函数,因为这样找不到this。
2022-11-24 15:55:42 112
原创 HX711电子秤芯片使用记录
HX711供电电压要提供一个稳定的电压,推荐使用稳压芯片输出的3.3V,(不要用手机充电头直接供电)HX711数据输出时间典型值为10Hz(100ms输出一次)。读取数据时,不要采用定时方式读取,数据可能没有准备好,去读取就需要等待延时。会造成间断性数据读取错误的问题;采用查询方式读取,读取完一次,开启下一次读取之后,采用查询DOUT为低电平作为读取的起始信号。
2022-11-24 09:18:57 2903
原创 C 二维数值指针访问
数组指针只是定义了程序的下标索引格式、偏移量等等。此时p是一个指针,它只需要开辟4字节的空间用来存放地址。访问地址的方式有指针操作符号*,也可以通过数组下表访问。对于32位运行平台,指针地址占用4字节。就是说存放一个指针的地址需要用4字节存储。p[0][0][2]貌似是3维度数组,其实可理解为三维数组的索引维0的数组,p[1][0][0] 结果是7,调到了下一个二维数组的开始位置。说白了就是存放指针的数组,是数组。通过二维数组指针去访问一个地址,以下测试说明针对32位处理器。64位,指针地址占用8字节。
2022-11-21 11:45:12 351
原创 micropython 解压实现.tar.gz
这部分代码参考upip.py文件。在micropython 1.19.1开源代码中可以找到。3.2、解压出来之后会多一个【@PaxHeader】文件,说是win10对压缩文件的处理问题。3.1、原始的文件夹大小168k,压缩打包后44k,esp32解压耗时4.391s。打包并压缩log路径下的所有文件到logo.tar.gz文件中。
2022-10-22 17:23:55 690 1
原创 RN7302/RN8302电能计量芯片使用记录
资料主要参考RN7302 用户手册,虽然说是很全面吧,但是似懂非懂,看个大概。本次记录是一个阶段的经验笔记,以免自己后续忘了。能容可能有错和不符,仅供参考。是实际做工消耗的功率,比如发热丝,电烤炉全为有功功率。功率因素为1是设备中电感电容元件存放在设备中的能量,当外部电压减小时,这些能量会反馈到电网中。家里的电表检测的就是有功功率。但是无功能功率会造成线路上的热损耗,这部分损耗电网自己承担了。如果电网能表检测设备到用户端距离远时,这部分的线损由用户承担,大型电机设备工厂就很在乎无功功率造成的损耗。
2022-09-23 14:58:48 6167
原创 STM32 IAP、栈
其实很多时候IAP是跳转到APP成功了,但是APP里面的模块已经被IAP使用过了,再次使用值就非复位初始化一样,需要重新复位这些使用到的模块其中包括串口,systick,RCC时钟模块,其他如果使用到了也需要复位。
2022-09-05 11:19:04 1389
原创 GD32E103 USB官方库 + STM32CubeMX
GD32E103 USB库和STM32是不兼容的,GD32E103是M4核,STM32F103是M3核。在STM32 HAL库的基础上,如何加入GD32的USB库程序,这显得有点麻烦。经过尝试,想到了一个偷懒的办法。将GD32的USB工程生成一个lib库文件,包括初始化已经OUT事件,IN事件提供出去就行。......
2022-08-05 18:08:17 1699
原创 USB模拟热拔插
USB设备断开之后,主机D+和D-都被内部电阻拉低,插回之后根据设备的上拉电阻确定设备接入。 拉低D+,D- 50ms, 初始化之前复位 GPIO在USB_Reset后会被USB的相关初始化函数设置。
2022-07-13 09:03:44 2319
原创 C# 图片显示占用问题
控件上显示图片实际使用没问题,但是图片会被占用,删除都不行。图片赋值之后pictureBox1并不会立即刷新,如果立即释放image.Dispose() 会导致图片后面pictureBox1刷新时找不到资源报错。所以在释放前刷新图片控件pictureBox1.Refresh() 即可 释放文件。实现如下:...
2022-06-27 17:21:13 1435
原创 接触式IC卡 - STM32(Smart Card)
目录1、复位1.1、冷复位1.2、热复位2、Smart Card功能2.1、初始配置2.2、波特率计算2.3、IO收发代码2.4、IC通讯测试接触IC的硬件通讯其实不难理解,上层逻辑层就复杂了,可根据ISO7816-3中规定的标准一一完善即可。这是一个漫长切枯燥的过程,但是一般都是站在巨人的肩膀上完善优化就好,自己动手慢慢敲可不太容易。逻辑协议是根具ISO7816来的,硬件平台是多变的。更换一个硬件平台做到底层修改即可。接触IC主要就两个操作,复位激活+APDU,复位有冷复位和热复位两种,复位只负责接收数据
2022-06-02 17:31:54 4109
原创 EM4100(EMID)卡使用记录
硬件部分测试读卡器实物:单片机RDM6300 ID卡读卡器 模块RFID射频/UART串口输出模块 125KHz-淘宝网 (taobao.com)实测读卡极限距离能到3.8cm,效果还不错。良心卖家,还给电路原理图了,淘宝自行下载。载波发射部分数据信号提取弱信号放大二值化数据处理部分数据存储结构:EM4100包含64位信息,分为5组信息。9位用于报头,10行奇偶校验位(P0-P9),4列奇偶校验位(PC0-PC3),40个数据位(D00-...
2022-05-16 11:04:52 3606 1
原创 NRF24L01调试的一些经验之谈
这次大大小小又搞了一个星期,还特地做了测试版。图中大部分是SI24R1,和NRF24L01+完全兼容,关键是还便宜。需求要做一个无线通讯大网,一个主机和上百个从机通讯。该模块有自动应答功能,发送一个包到应答数据收到,只需要1ms以内的时间就能完成,数据包还自带CRC校验。比485,CAN总线这些高效很多。还不需要布线。说说经验记录,1、不管是PTX还是PRX端,在初始化模块之后,CE一直保持高即可,不要去操作CE脚。PTX端发送缓冲区有数据就自动发送,无数据就等待有数据再.
2022-05-12 14:42:50 1424 4
原创 NRF24L01 PID问题
我在测试的时候遇到一个神奇的现象,因为是测试,所以PTX和PRX两端都重复发送一些数据。会出现如下现象:PTX发送端能正常发送数据并收到ACK应答包; 然而PRX端没有收到任何数据,状态寄存器STATUS和缓冲区寄存器FIFO_STATUS也没有任何变化。计时单片机不运行,PTX端收到依然还在正常进行。将PRX端断电PTX才发送失败了。分析:就是说,出现如上现象时,PRX端应答PTX了,但是PRX却不认为自己收到有效数据了. 再将发送端数据的第一个字节自增1,PRX就能正常收到数据。
2022-05-11 15:14:17 361
原创 磁条卡基础
接触一个知识就得记录下来,经验之谈很重要,隔一段时间就只记得自己干过这事,却不记得具体是啥事了。谈谈物理原理1、磁有正反两级,接触强磁可以改变附着材料的极性。这就是写磁道。2、磁头通电,信号在经过放大,磁卡刷过时将信号记录下来...
2022-04-08 16:40:49 1816
原创 STM32F407 ADC转换
计算方法可以参考STM32F4 ADC采样转换时间计算方法单次转换所需要的时间就如文档所说的。实测结果通过DMA连续采样30000个数据,定时器2(32位计时器)作为us计时器。经过测试,转换的时间是很精确的,基本等于理论值 15/21=0.71428us测试代码#define ADC_CON_NUM 30000uint16_t adc_value[ADC_CON_NUM];// PCLK2 84MHZ/4 4分屏 // 12位 单次:0.714300u.
2022-04-01 18:02:49 1547
原创 STM32/APM32 M0内核IAP升级
1、APP部分,M0内核的向量表必须拷贝到内存,并将中断向量修改为RAM#define SYSCFG_MemoryRemap_SRAM ((uint8_t)0x03)void IAP_Set(){ uint32_t i = 0; /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/ /* Copy the vector table from the Flash
2022-03-09 17:45:15 1489
原创 C - 栈操作
在不同的编译平台,对栈的汇编操作有所不同,windows平台volatile int* p = context->stack + context->stack_size / 4;__asm mov esp, p操作很方便,变量可直接传过去keil平台Cortex-M4int n = (int)&sp_buff+4*512; __asm volatile("msr msp, n");参数n也可以直接给,测试有效GCC编译Coretx-M4#def
2022-01-03 16:01:46 555
原创 C 伪线程四 - 线程及独立栈实现
接上文,已经验证可以自己定义栈空间了,那么这次移入到伪线程中setjmp longjmp两个函数是能够保存会恢复栈的。所以只需要在启动的第一次配置好伪线程栈的地址即可。当退出伪线程后,恢复主栈地址即可。上面这一切也是个人设想,没依据调度器void TaskScheduler(){ if (context_head == NULL) { return;//没有线程 } if (setjmp(SchedulerStack) == 0) //压入退出时的栈 { .
2021-12-30 18:00:46 761
原创 C 伪线程三 - 自定义栈地址
接上文,据我猜测,如果栈可以自己定义地址,每个线程设置不同的栈空间,那么伪线程的局部变量也将是安全的,不会被其他线程覆盖,所以。。。。测试代码uint32_t stack[500]; //自定义堆栈地址int test_fun(int param){ volatile int buff[20] = { 1, 2, 3, 4, 5, 6, 7, 8 }; return 9;}int fn(){ __asm { mov eax, esp //当前栈位置保存起来 lea
2021-12-30 16:34:31 550
原创 C 伪线程二 - setjmp longjmp 实践
上一章节,拿出一个线程来开口子,就是不希望因为线程占用了全部CPU,其他不被线约束的程序照常进行。只要从周期调用线程调度就可以,这是本次设计的基本要求。
2021-12-30 10:34:48 585
原创 C 伪线程一 - setjmp longjmp 验证
需求来源于困难,在单片机上我们一般都是跑逻裸机,主要就是单线程加中断的方式写代码。我个人很不喜欢用状态机的方式写代码,会很多的状态变量和全局参数。但是我在一些场合遇到了不得不用状态机的时候,我写起来又不想又很多的全局变量,还希望代码模块化。到最后把我自己的代码眶的超难受。所以就萌生了伪多线程的需求。之前就知道 setjmp longjmp两个函数可以实现函数间跳转,所以便尝试研究起来。测试一、3个任务成环#include "stdio.h"#include &l...
2021-12-29 17:54:22 542
原创 NRF24L01-状态寄存器
STATUS寄存器当接受到数据后BIT_RX_DR置1,并且RX_P_NO 设置为对应接收通道。当读取出接收缓冲区数据后,RX_P_NO 变为111,但BIT_RX_DR不变,需手动清除。BIT_RX_DR可以不清除,只需要把数据读出就可以再次接收。即使BIT_RX_DR清除,RX_P_NO和数据依然有效。所以,为了防止标志位BIT_RX_DR手动清除的延时问题,可以不关心BIT_RX_DR,只判断RX_P_NO,当他小于6时,说明有数据,读出自动清除RX_P_NO。FI..
2021-12-17 13:53:58 1656
原创 C位域操作和位操作比较
目录1、位域1.1、测试代码:1.2、汇编:1.3、分析:2、位操作2.1、测试代码2.2、位操作汇编对照结论1、位域通过Keil反编译研究了一下 位域的读写操作。之前一直以为位域的操作就像变量的读写操作一样,同MOV指令一样一条指令搞定,结果不是。1.1、测试代码:typedef struct{ int a : 1; int b : 1; int d : 1; int e : 1; int f : 1;} register_.
2021-12-13 16:35:22 1295
原创 组态屏-笔记
组态软件:EasyBuilder Pro组态屏:TK6071iQ软件和手册下载:威纶通 - 威纶通科技有限公司 (weinview.cn)软件可以实现在线模拟,就是可以模拟组态屏和PLC通讯,模拟单词使用时间限制是10min(防止不买人家的屏!!!)创建时设备添加好HMI和PLC,只有添加了才能操作设备地址,可以添加多个,一个屏操作多个PLC1、本机 HMI 内存地址范围 这一堆选项,在不看手册时是蒙圈的。其实这些都是寄存器组,不同的寄存器有不同的范围和功能.
2021-12-09 13:56:10 1900
原创 LCD12864(ST7920芯片)
ST7920自带中英文字库,要显示啥直接发送字符编码就行。注意两个点:清屏后加点延时,不然开头几个字符会乱 汉字和英文字符混用时,汉字的位置必须2字节对齐,否则乱码#include "xs.h"#include "stm32f10x.h"#define STD_GPIO GPIOC#define STD_PIn GPIO_Pin_4#define CS_GPIO GPIOA#define CS_PIn GPIO_Pin_7#define CLK_GPIO GPIOC#def
2021-12-01 18:18:52 1724
原创 USB CDC虚拟串口复合设备
CDC包含一个控制接口和一个数据接口1、控制接口必要的有CM功能描述符和接口绑定描述符(IAD/Union)在我电脑上测试控制接口的中断端点也可以不需要,及控制接口端点数量可以为01.1、ACM功能描述符: 在虚拟串口中,控制接口需要处理ACM 功能描述符。如下是一个ACM描述符,描述了虚拟串口的一些类特定请求,比如可以设置和获取的串口的波特率、停止位等等。参考:STM32 之 USB 虚拟串口_rannar的博客-CSDN博客_stm32 虚拟串...
2021-11-22 19:47:37 8024 7
原创 USB 打印机设备
目录1、参考现有打印机的枚举过程2、接口描述符3、GET DEVICE ID4、发送数据测试1、参考现有打印机的枚举过程2、接口描述符如下,简单配置好接口及端点描述符,打印机设备就出来了#if 1//打印机接口 /************** Descriptor of Printer interface ****************/ 0x09, /* bLength: Int
2021-11-18 10:57:58 1965 1
原创 小程序-连接和跳转
navigator 页面跳转navigator | 微信开放文档 (qq.com)tabBar "tabBar": { "list": [{ "pagePath": "pagePath", "text": "text", "iconPath": "iconPath", "selectedIconPath": "selectedIconPath" }] }redirectTo重.
2021-11-18 09:01:37 84
原创 USB HID上位机测试(C#)
目录1、基本测试1.1、通过Bus Hound可以看到设备列表1.2、通过API获取到设备接口文件列表1.3、用BUS Hound收发测试2、C#上位机2.1、打开设备报告ReportID2.2、发送数据注意:测试:2.3、异步接收3、其他测试3.1、中断端点时间测试下位机这两天已经折腾出一个一二了,在配合上位机完整学习一下,下位机芯片是STM32F103VB1、基本测试1.1、通过Bus Hound可以看到设备列表...
2021-11-17 18:14:31 9269 11
原创 VS Code正则表达式
微软官方文档注意事项:在VSCode中使用时,要先把通配符开关打开(开关是查找输入框右边的".*"符号)转义字符 匹配内容 \t tab \r 回车符号\r \n 换行符号\n \uxxxx 匹配Unicode编码为xxx的字符,如\u0020匹配空格,这个符号可以用来帮助匹配中文,后面说 \ 特殊符号转义,如"*" ,转义后匹配的是字符"*", “(” 匹配的是括号"(" [字符序列] 匹配[ ]中的任意字符,如[ae],字符a..
2021-11-17 13:54:32 5212
图像处理之轮廓跟踪算法及圆提取
2022-06-27
ConsoleApplication1-第二版.zip
2021-12-30
LuaDemo.zip
2020-07-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人