![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程
wenkic 小琪
这个作者很懒,什么都没留下…
展开
-
串口DMA 收发测试(部分代码)
【代码】串口DMA 收发测试(部分代码)原创 2023-03-29 09:28:40 · 122 阅读 · 1 评论 -
记录--嵌入式设备生成二维码
开源项目 STMQRcode二维码原创 2022-06-12 20:25:15 · 1741 阅读 · 0 评论 -
关于PID的调试
专家PID依赖经验与规则的制定,同样也依赖调参。专家PID使用时多用于电机环。if (pid->errABS < sErr) { //小偏差 较小误差, 调小比例 pid->outPut = offineK * pid->outPut;} else if (pid->errABS > lErr) { //大偏差 //串联BangBang-PID pid->outPut = (pid->errNow > 0)转载 2022-04-19 09:22:28 · 476 阅读 · 0 评论 -
Java命名规范参考
以下文章来源于Java填坑笔记,作者李强简洁清爽的代码风格应该是大多数工程师所期待的。在工作中笔者常常因为起名字而纠结,夸张点可以说是编程 5 分钟,命名两小时!究竟为什么命名成为了工作中的拦路虎。每个公司都有不同的标准,目的是为了保持统一,减少沟通成本,提升团队研发效能。所以本文中是笔者结合阿里巴巴开发规范,以及工作中的见闻针对 Java 领域相关命名进行整理和总结,仅供参考。一,Java 中的命名规范好的命名能体现出代码的特征,含义或者是用途,让阅读者可以根据名称的含义快速厘清程序的脉.转载 2022-04-13 11:21:12 · 1259 阅读 · 1 评论 -
HSV/HSL与RGB 的互相转换
void RGB2HSV( uint16_t * h, uint16_t * s, uint16_t * v, uint8_t r, uint8_t g, uint8_t b){ double rr, gg, bb; double hh, ss, vv; double cmax, cmin, cdes; rr = r; gg = g; bb = b; cmax = (rr > gg) ? rr : gg; if (bb > cmax) { cmax = bb;.原创 2022-01-17 09:21:33 · 368 阅读 · 0 评论 -
记录-使用TM1640 数码管驱动芯片
//芯片1sbit TM_DAT1 = P0^7; //数据sbit TM_CLK1 = P0^6; //时钟//芯片2sbit TM_DAT2 = P1^1; //数据sbit TM_CLK2 = P0^0; //时钟//芯片3sbit TM_DAT3 = P0^4; //数据sbit TM_CLK3 = P0^3; //时钟//芯片4sbit TM_DAT4 = P1^4; //数据sbit TM_CLK4 = P1^3; //时钟#define TM1640_DELAY .原创 2021-11-19 10:06:31 · 1977 阅读 · 0 评论 -
批处理--使用脚本把hex文件复制到根目录中
创建CopyHex_Flash.bat 编辑写入:#;copy Objects\*.hex ..\*.hex //复制到根目录: copy Objects\*.hex .\*.hex //复制到文件的上一个目录中copy Objects\*.hex ..\*.hex效果原创 2021-11-18 11:31:50 · 632 阅读 · 0 评论 -
通用FIFO轻量级环形缓冲管理器开源库lwrb---测试,理解
lwrb是一款通用FIFO环形缓冲区实现的开源库,并遵循 MIT 开源许可协议。优点:使用C99语法编写,并且没有平台相关代码; 没有动态内存分配; 使用更优的内存复制而不是循环从内存读取数据/向内存写入数据;lwRB.c 文件/** * \file lwrb.c * \brief Lightweight ring buffer *//* * Copyright (c) 2020 Tilen MAJERLE * * ...原创 2021-07-23 23:53:22 · 1038 阅读 · 0 评论 -
2021-06-06根据日期计算星期几
/// <summary> /// 根据年月日来计算那一天是星期几 /// </summary> /// <param name="y">年</param> /// <param name="m">月</param> /// <param name="d">日</param> /// <retur...原创 2021-06-06 01:30:58 · 677 阅读 · 0 评论 -
2021-05-28 新唐M051芯片--串口0,定时器
1.系统初始化void SYS_Init(void){ /* Unlock protected registers */ SYS_UnlockReg(); //操作寄存器解锁 { //切换外部晶振-->频率为50Mhz(默认内部晶振22.1184MHz) CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk); /* Enable Internal RC 22.1184MHz clock原创 2021-05-28 20:12:51 · 817 阅读 · 0 评论 -
DS1991 多密钥iButton加密芯片(单线通信)
一、单总线协议(1-wire)1.定义:主机和从机通过1根线进行通信,在一条总线上可挂接的从器件数量几乎不受限制。2.特点:它采用单根信号线,既可传输时钟,又能传输数据,而且数据传输是双向的。3.优点:单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等。二、单总线通信过程1.初始化初始化过程 = 复位脉冲 + 从机应答脉冲。主机通过拉低单总线480 ~ 960 us产生复位脉冲,然后释放总线,进入接收模式。主机释放总线时,会产生低电平跳变为高电平的上升沿,单总线器件检原创 2021-04-29 17:46:53 · 765 阅读 · 0 评论 -
内存数据匹配函数 (适合短查询) 暴力匹配
/**dest 要被检索的内存起始地址DestSize 检索匹配大小*str 要搜索的内存起始地址StrSize 搜索的大小*/// 内存数据对比匹配/* 要被检索的内存起始地址,检索匹配大小,要搜索的内存起始地址,搜索的大小*/char * tm_strstr(const char *dest,unsigned int DestSize, const char *str,unsigned int StrSize){ char *ptr=NULL; .原创 2021-01-13 16:19:48 · 313 阅读 · 0 评论 -
编程常用词汇表
Aabstract 抽象的abstract base class (ABC)抽象基类abstract class 抽象类abstraction 抽象、抽象物、抽象性access 存取、访问access function 访问函数access level访问级别account 账户action 动作activate 激活active 活动的actual parameter 实参adapter 适配器add-in 插件address 地址ad.转载 2020-11-25 16:59:47 · 1481 阅读 · 0 评论 -
SPI编程时,时钟相位(CPHA)和时钟极性(CPOL)怎么理解?
SPI是单片机外设电路中常用的一种通讯方式,适用于近距离通信,通常用于芯片间的通讯,有四根线。在SPI通讯中总线时钟和总线相位也两个比较重要的概念,一般在使用SPI通信时都使用默认设置,所以容易把这两个参数忽略。和大家分享一下SPI通讯、时钟极性以及时钟相位的基础知识。什么是SPI通讯总线SPI总线的英文全称为S“Serial Periphral Interface”,意思是串行外设接口,由于通讯距离比较短,适用于芯片级别的短距离通讯。SPI的通讯分为主机和从机,属于高速全双工的总线通讯方式,SPI翻译 2020-11-11 16:12:48 · 811 阅读 · 0 评论 -
SPI基础函数模版(STM32F1标准库)
/********************************End of Head************************************/#include "NRF24L01.h"#include "stm32f10x.h"#define NFRCS#define NFRCLK#define NFRMOSI#define NFRMISO#define NFRIRQ#define NFRCE /* PB12 PB14 PD8 (2).原创 2020-09-05 14:15:50 · 576 阅读 · 0 评论 -
MultiTimer开源定时器(多任务回调)----链表分析
/* * Copyright (c) 2016 https://blog.csdn.net/Wekic * All rights reserved */ #ifndef _MULTI_TIMER_H_#define _MULTI_TIMER_H_#include "stdint.h"#include "stddef.h"typedef struct Timer { uint32_t timeout; //超时时间 uint32_t repeat; .原创 2020-08-28 10:43:15 · 697 阅读 · 0 评论 -
des 加解密程序,可以直接使用(STM32)
/********************************************************************************* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.* AS A RESUL.原创 2020-07-11 16:12:06 · 1668 阅读 · 0 评论 -
10进制与16进制 互相转换(字面的转换)
unsigned int _10Code_to16Code(unsigned int dat){ unsigned int temp = 0; //例子12345678 to 0x12345678 for (int i = 0; i < 8; i++) { temp >>= 4; temp |= ((dat % 10) * 0x10000000); dat /= 10; } return t.原创 2020-07-11 11:19:50 · 1251 阅读 · 0 评论 -
获取STM32的唯一ID序列号(可用于加密)
1、基本描述在STM32的全系列MCU中均有一个96位的唯一设备标识符。在ST的相关资料中,对其功能的描述有3各方面:用作序列号(例如 USB 字符串序列号或其它终端应用程序)在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以提高 Flash 中代码的安全性激活安全自举过程等在资料中对其特性的描述是:96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码。用户永远不能改变这些位。96 位的唯一设备标识符也可以以单字节/半字/字等不同方式原创 2020-07-11 09:05:28 · 6366 阅读 · 2 评论 -
CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库
0、CmBacktrace 是什么CmBacktrace(Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:支持的错误包括: 断言(assert) 故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault) 故障原因自动诊断:可在故障发生时,自动分析出故障的...原创 2020-06-20 10:19:21 · 477 阅读 · 0 评论 -
嵌入式架构 的 重要性
链接:芯片之家嵌入式架构有多重要?要做到嵌入式应用的代码逻辑清晰,且避免重复的造轮子,没有好的应用架构怎么行?如果没有好的架构,移植将会是一件很痛苦的事情。如果没有好的架构,复用是最大的难题,没法更大限度的复用原有的代码。如果没有好的架构,一旦驱动改了,所有的地方都要改,费时费力且很容易出错。如果没有好的架构,应用层中穿插着...转载 2020-04-14 16:02:57 · 799 阅读 · 0 评论 -
STM32 USB使用的一些硬件教训
画USB的电路时,必须在USB线上串一个小电阻(R1,R2)33R或者22R,DP上拉为1.5K遇到的问题现象,如果不串小电阻,很容易创建COM_Port(虚拟串口)不成功,而且串的两个电阻要相等,不相等也会创建不成功...原创 2020-03-31 15:36:52 · 4162 阅读 · 3 评论 -
软件模拟SPI基础函数--以及一些框架思想
/*编辑框架: 基础层===》隔离层===》驱动层===》应用层基础层:包含管脚初始化,配置管脚输入输出脚的基础函数到隔离层 例如:void FM25_IOInit(void); void FM25_CS(u8 IO); void FM25_CLK(u8 IO); void FM25_MOSI(u8 IO); u8 ...原创 2020-03-30 10:39:34 · 404 阅读 · 0 评论 -
MDK/Keil 中configuration wizard窗口的使用
概述在写程序时经常会进行一些配置,比如开启关闭某些功能、修改一些常量等,会反复去修改配置文件。实际上MKD可以将其变为配置界面,这样在修改时更加直观、方便。只需要根据configuration wizard的格式来编写我们的配置文件即可。功能介绍 1.头尾文件中的开头和结尾需要用两段字符串来包含开头://<<< Use Configuration Wizar...原创 2020-03-05 14:20:42 · 1007 阅读 · 0 评论 -
GitHub搜索项目
github高级搜索帮助 https://help.github.com/en/github/searching-for-information-on-github/searching-for-repositories代码搜索网站:代码:GitHubCodaseOhlohkrugleMerobase Component FinderGoogle Code Archive Symbo...原创 2020-02-11 14:37:25 · 434 阅读 · 0 评论 -
FM25CL64程序(C51版)
FM25CL64芯片手册:https://wenku.baidu.com/view/dabf5e71168884868762d6aa.html#ifndef FW25CL64_H#define FW25CL64_H#include "reg51.h"#include "intrins.h"#define WREN 0X06 //写使能操作码#define WRD...原创 2019-12-02 16:02:10 · 2733 阅读 · 0 评论 -
C的面向对象化
1.**在面向对象的语言里面,出现了类的概念。类是对特定数据的特定操作的集 合体。类包含了两个范畴:数据和操作。而C语言中的struct仅仅是数据的 集合,我们可以利用函数指针将struct模拟为一个包含数据和操作的”类”。**2.用C程序模拟一个最简单的“类”**#define C_Class struct**C_Class A {C_Class A *A_this; /...转载 2018-07-22 10:06:57 · 951 阅读 · 0 评论 -
指针了解
今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。1.int *p;2.int **p;3.int *p[10];4.int (*p)[10];5.int *p(int);6.int (*p)(int);7.int (*p[10])(int);这七个难度还不...转载 2018-08-02 09:59:27 · 184 阅读 · 0 评论 -
函数动词收集
get 获取/set 设置, add 增加/remove 删除create 创建/destory 移除 start 启动/stop 停止open 打开/close 关闭, read 读取/write 写入load 载入/save 保存, create 创建/destroy 销毁begin 开始/end 结束, ...转载 2018-11-15 09:26:05 · 272 阅读 · 0 评论 -
c语言模块功能集合方法---伪类创建
最近有使用到一个模块,编程使用了C语言伪类,整合模块时觉的很好用,以下贴出一个简略的代码,方便自己多多参考 /*使用C语言伪类,可以很好的整合模块的编程使得模块思路更加清晰,并避免程序变量混乱现象*///=========C语言伪类.h=====================#ifndef _AS608_APP_H#define _AS608_APP_H#inclu...原创 2018-11-24 20:34:35 · 397 阅读 · 0 评论 -
STM32F1 串口接受不定长数据总结
串口接受不定长数据,就是数据格式不确定,长度不确定,我们需要找到判断是否接收完成的.如果是一个数据侦,接收时数据字节之间的间隔时间是很短,但接收完成时,我们就无收到数据了,所以我们判断是否接收完成,就是判断数据字节间的间隔我想到的到的方法有2:1.串口接收数据+定时做超时判断2.串口接收数据+IDLE空闲中断3.DMA串口数据接收+IDLE空闲中断 以下是我整理的代码:...原创 2018-12-03 11:20:43 · 1954 阅读 · 0 评论 -
MDK代码格式化
常用的C/C++代码格式优化工具有两个,一是老牌的indent,再一个就是astyle了。astyle不但可以对C/C++进行格式优化,还可以处理Java和C#。版本一直在保持更新,很不容易,截止2011-12-02,已经升级到V2.02.1。 通过命令““astyle -V”可以查询版本信息,最新版本的源代码和可执行文件可以在此处【下载】。网络上已经有很多博客介绍过astyle,如《在...原创 2018-07-02 11:42:12 · 1432 阅读 · 0 评论 -
圆形缓冲区(循环buffer)
用法 圆形缓冲区的一个有用特性是:当一个数据元素被用掉后,其余数据元素不需要移动其存储位置。相反,一个非圆形缓冲区(例如一个普通的队列)在用掉一个数据元素后,其余数据元素需要向前搬移。换句话说,圆形缓冲区适合实现先进先出缓冲区,而非圆形缓冲区适合后进先出缓冲区。 圆形缓冲区适合于事先明确了缓冲区的最大容量的情形。扩展一个圆形缓冲区的容量,需要搬移其中的数据。因此一个缓冲区如果需要经常调整其容量...翻译 2018-06-27 10:57:29 · 1582 阅读 · 1 评论 -
C语言中的位域
有些信息在存储时,并不需要占用一个完整的字节,而只需要一个或几个二进制位即可;比如:在存放一个开关量时,只有0和1两种状态,只需要使用一个二进制位即可存储;为了节省存储空间,C语言提供了一种数据结构,称为”位域”或”位段”;所谓”位域”就是把一个字节中的8个二进制位划分为几个不同的区域,并说明每个区域的二进制位数;每一个位域都有一个位域名,允许程序员在程序中按照位域名进行访问;这样就可以把几个不同...转载 2018-03-12 16:17:57 · 1296 阅读 · 0 评论 -
stm32-串口接受不定长数据方法(3种)
方法1:串口接受数据,定时器来判断超时是否接受数据完成。方法2:DMA接受+IDLE中断实现思路:采用STM32F103的串口1,并配置成空闲中断IDLE模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是200个字节,那么在单片机接收到一个字节的时候并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。转载 2018-01-18 11:57:48 · 4593 阅读 · 0 评论 -
keil C51 重定向printf到串口
概述进行C/C++开发的时候我们都会需要打印调试信息,打印调试信息时我们习惯使用printf函数,但是在Keil C51环境下,由于我们的程序是下载到单片机里,使用printf函数时不能直接打印到串口上,这个时候就需要我们对printf函数输出重定向。重定向重定向printf很简单,我们知道,printf函数是调用putchar实现字符数据传送的。我们只要重写putchar函数,就可以...转载 2017-08-20 19:37:21 · 2122 阅读 · 1 评论 -
C51用宏定义代替printf函数
问题提出有时候我们想用宏定义来决定是编译debug版本的代码还是release的代码,dubug版本的代码会通过printf打印调试信息,release版本的代码则不会。我们总不能对每一条printf都这样写:#if _DEBUG_printf("hello world!");#endif1 2 31 2 3这样子实在是太麻烦了!万一要各个地方都要打印,会使版面看起来...原创 2017-08-20 19:35:58 · 3817 阅读 · 3 评论 -
c语言编程技巧
C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了。 指定的初始化 很多人都知道像这样来静态地初始化数组: C代码 int fibs[] = {1, 1, 2, 3, 5}; C99标准实际上支持一种更为直观简单的方式来初转载 2017-07-05 11:33:04 · 959 阅读 · 0 评论 -
STM32F1 串口接收不定长数据总结(使用DMA)
串口接收不定长数据,判断侦数据结束的方法:判断字节与字节之间的间隔时间串口接收不定长数据方法可以分为3种:1:串口数据接收 + 定时超时判断2:串口数据接收 +IDLE空闲中断3:DMA串口接收+IDLE空闲中断//=======以下是我的一些代码===============关于Usart_init函数,可以看链接STM32F1 串口接受不定长数据总结...原创 2018-12-03 11:34:02 · 2656 阅读 · 0 评论 -
C语言 ---计算连个日期之间的天数转换
/* 返回绝对值 */int abs(int a,int b){ if(a>=b) return (a-b); else return (b-a);}/* 判断是否为闰年:是,返回 1 ; 不是, 返回 0 . */int IsLeap(int year){ if(((year%4==0)&&(year%100!=0))||year%400==0...原创 2018-12-11 11:36:44 · 1907 阅读 · 0 评论