自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (2)
  • 收藏
  • 关注

原创 arm-none-eabi-addr2line和arm-none-eabi-objdump使用笔记

arm-none-eabi-addr2line 是一个用于将地址转换为文件名和行号的工具,用于在嵌入式系统中调试程序时定位代码位置。命令的一般格式是:arm-none-eabi-addr2line -e <可执行文件> <地址>

2024-04-08 15:56:47 889

原创 010 Editor常用语法

010editor 是一款十六进制编辑器,和 winhex 相比支持更灵活的脚本语法,可以对文件、内存、磁盘进行操作,是二进制分析中十分强力的工具,能够解析多种文件格式并以友好的界面呈现。其强大的内部引擎使得任何人都可以定制所需的解析脚本或解析模板。

2024-04-04 19:25:19 1354

原创 在C++文件中调用C文件定义的函数需要加 extern “C“ {

最近犯了了一个低级错误,在集成一个厂商的算法时,(C++文件)总是提示找到不函数的定义错误;所以一直怀疑是厂商给的算法库中没有打包该函数的定义;最后跟厂商battle了好久,发现厂商给的库中的头文件没有加 extern “C” ,特用此文记录一下该问题;

2024-04-03 20:02:38 274

原创 充电打嗝与DPM

当设备检测到VBUS输入时,会配置自己的充电电流,因此会充适配器拉取相应的电流;但是充电器 具有额定功率的限制,如果充电电流超出了适配器的输出能力,比如5V/1A适配器,设备设置充电电流 为2A,当设备从充电器抽取电流时,会将充电器的电压拉低;当适配器的电压降低到VBAT+Vpro时,设 备内部充电IC会触发保护,导致充电停止;充电停止后,充电器5V又恢复正常,又开始充电,又拉低, 充电停止。。。。

2023-08-04 17:06:52 563

原创 功耗管理总结

最近搞了一段时间的产品低功耗,由于从事的是消费类电子行业中的穿戴类电子产品的开发,这种产品形态(电池供电)就决定了续航特性在产品体验中占用很高的比重。

2023-08-03 11:34:33 190

原创 问题/项目复盘

无论项目是否成功都需要进行复盘;

2023-04-12 21:18:46 204

原创 给客户做选择题

在工作上,有时会遇到一个问题需要客户去决策,或者试图说服客户去按你所提的方案的时;

2023-04-02 17:20:54 125

原创 要学会倾听

日常沟通中,要学会倾听,要结构化倾听,倾听主要抓住3点:1. 对方所陈述的什么事情2. 对方的情绪以及态度3. 对方想让我做什么

2023-03-23 21:01:28 83

原创 list_for_each 详解

该宏写的很巧妙,将0地址强转为TYPE类型,在对其中的MEMBER进行取址,将该地址转为size_t类型就获得了MEMBER类型在TYPE类型中的偏移位置。上面的代码中遍历链表时下次访问的内存为pos->next,故在每次遍历时对pos->next进行预热,从而提升性能。container_of的作用表示先求出结构体成员(即member)在结构体(即type)中的偏移量,然后再根据member的地址(即ptr)来求出其所在结构体的地址。list_entry就表示ptr所在的结构体的地址,就是指针;

2023-03-23 20:53:59 999

原创 使用位域导致代码大小变大

使用位域导致代码大小变大问题场景:代码大小优化过程中,使用位域操作能够,有效的利用代码空间;因此在将一个结构体中的两个成员如下EAR_ACK_E leftAckFlag;EAR_ACK_E rightAckFlag;改为EAR_ACK_E leftAckFlag:4;EAR_ACK_E rightAckFlag:4;觉得代码大小会有优化;实际编译...

2021-09-13 15:27:14 204

原创 代码中指定数组Flash存放位置

const unsigned char gImage_Cry[153600] __attribute__((at(0x08035800))) = {此处写数据};参考https://blog.csdn.net/yifeng0710/article/details/74940909使用之后会发现Ro_data 暴增!!也就是代码大小增加很大------增大原因是MDK在代码与指定地址中间自动添加了0x0...

2021-08-30 16:38:45 582

原创 LPUART和USART

LPUART(Low-power universal asynchronous receiver transmitter),低功耗的通用异步串行口。特点:用电量少。USART(Universal synchronous/asynchronous receiver transmitter), 通用的同步/异步串行口。在STM32L431芯片上有3个这样的端口,这些端口除了具有串行通信功能外,还支持其他的一些功能,例如Smart Card Mode,LIN,IrDA SIR ENDEC 等。...

2021-07-17 11:39:46 5642

原创 串行数据(SPI/I2C/UART/USB)的时钟同步

串行数据的时钟同步一、串行数据的时钟同步问题串行数据的发送(如USB,UART,I2C, SPI等)是通过一条数据总线发送,于是就有如果通过一条数据总线连续发送连续的01信号给接收设备,由于发送者和接受者的时钟频率不同,信号的同步是个问题,举个例子,接受者接收到一段连续时间的低电平,无法得知这究竟代表3个0还是10个0。二、I2C和SPI数据的时钟同步解决上面的问题的办法I2C和SPI是在传输数据信号的同时,附加一个时钟信号,用来同步两端的数据传输,接受者可以在时钟信号的辅助下进行数据采样,就能正确

2021-04-27 11:07:44 4960

原创 RO、RW和ZI数据解析

Keil编译成功的最后会有如下信息,便是程序代码的数据信息:Code:代码的大小RO:常量所占空间(read only)RW:程序中已经初始化的变量所占空间(read - write)ZI:未初始化的static和全局变量以及堆栈所占的空间(zero init)映像文件(image)的组成映像文件就是指烧录到ROM中的bin文件,也称为image文件。以下用Image文件来称呼它。Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要

2021-04-23 13:51:58 3413 1

原创 回声消除(Echo Cancellation)理解

理解下回声消除(Echo Cancellation)基本原理(只是基本原理,非专业):回声的产生就是speeker的传来的声音又被mic接收,传给对方的话产生回声,回声消除的原理就是mic接收的声音将speeker传过来的声音减掉就是没有回声的原始声音;注意减的时候,有个时间延时(这个貌似需要算法计算)...

2021-03-26 16:54:43 2385

原创 SPI协议讲解

SPI ( Serial Peripheral Interface,串行外设接口)是一种同步、串行通讯接口规格,常用于短距离通讯,主要是在嵌入式系统中。此接口由Mototola公司推出,已成为一种事实标准(没有统一的协议规范,但是基于其广泛的使用,根据实际使用中大家通用的习惯形成了一个类似行规的标准)。对通信操作的实现只作一般的抽象描述,芯片厂商与驱动开发者通过data sheets和application notes沟通实现上的细节。SPI是一种高速的,全双工,同步的通信总线。分为主(master)、

2021-03-26 10:57:18 593

原创 基于Nucleo-F401RE点个灯(KEIL)

今天捡了个Nucleo-F401RE(其实是同事离职后,收拾他桌子时发现他遗留下来的);看着这块板子做的挺精致,拿来玩玩!搜索了点资料如下CN2的短接线主要是将SWD连接到了F401芯片上,若想用这块板子的st_link调试其他设备,可将跳线去除,将CN4用线连接到其他设备。• STM32F401RET6微控制器,基于ARM Cortex-M4处理器,带DSP,最高支持84MHz主频• 支持Arduino UNO R3 Shield扩展板,微控制器所有IO口引脚通过排针座引出• ST-LINK/

2021-03-24 18:38:14 1360 1

转载 电容的作用

电容是电路设计中最为普通常用的器件,也常常在高速电路中扮演重要角色。在电子线路中的作用一般概括为:通交流、阻直流。电容通常起滤波、旁路、耦合、去耦、转相等电气作用。用作贮能元件也是电容器的一个重要应用领域,同电池等储能元件相比,电容器可以瞬时充放电,并且充放电电流基本上不受限制,可以为某些设备提供大功率的瞬时脉冲电流。电容的用途非常多,主要有如下几种:1. 隔直流:作用是阻止直流通过而让交流通过。2. 旁路(去耦):为交流电路中某些并联的元件提供低阻抗通路。旁路电容:旁路电容,又称为退耦电容,

2021-03-23 19:13:14 633

原创 堆和栈的区别

堆和栈的申请方式和回收方式不同栈(stack)是系统自动分配空间的,如定义一个局部变量,系统会自动在栈上为其开辟空间;而堆(Heap)则是程序员根据需要自己申请的空间,例如malloc(10)表示开辟是个10个字节的空间。栈的数据空间是自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,程序结束就释放;而堆上的数据必须需要程序员主动释放(Free),只要不释放,就可以一直访问到;因此对会产生内存碎片;申请后的系统响应栈:只要栈的剩余空间大于申请空间,系统就会为程序提供内存,否则将报异常提示.

2021-03-22 08:41:56 309

原创 Cortex_M3 位带概念

在CM3中,有两个区实现了位带,其中一个是SRAM区的最低1MB范围,第二个是片内外设区的最低1MB范围,这两个区域的地址可以像普通的RAM一样使用外,还有自己的位带别名区,位带别名区把位带区的每个bit膨胀成一个32位的字。可以通过位带别名区访问这些字,就可以达到访问原始bit的目的。因此位带别名区的word值只是表示位带区的一个bit的值,也就是说这个word只有最低位LSB有效。...

2021-03-17 17:43:05 527

原创 Cortex_M3寄存器组概述

寄存器组R0—R12:通用寄存器R0—R12都是32位的通用寄存器,用于数据操作。R13:堆栈指针寄存器(sp)Cortex-M3拥有两个堆栈指针,但是他们是banked,因此任意时刻只能使用其中一个。主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括终端服务)。进程堆栈指针(PSP):由用户代码使用。由于堆栈指针总是4字节对齐,所以堆栈指针的最低两位永远是0.其最典型的应用就是在数据处理之前先保存寄存器的值,再在处理任务完成后从中恢复先前保护的

2021-03-17 08:50:27 1356

原创 CSR8670从ADK3.0软件DFU升级到ADK4.0软件

最近在做给dongle升级的工作,该dongle采用的是CSR8670芯片,旧软件版本是基于ADK3.0开发的,新的软件是基于ADK4.0开发的,发现DFU升级之后,系统启动不起来的问题。经过测试发现,PSR文件有问题,解决该问题的措施,就是有线升级到ADK4.0的软件版本后,使用pstool工具将所有的psr配置dump出来,将dump的出来的psr配置打包到DFU文件中(打包方法网上搜索CSR8670 DFU文件制作)。尝试从ADK3.0的软件版本DFU升级到ADK4.0的软件版本,测试OK,问题解

2021-03-16 17:29:40 386

原创 嵌入式软件----底层驱动书写的基本规则

1 对每个硬件对象编写独立的驱动程序每个对象对应一个头文件和源文件,如果对象是外部对象,则要在头文件用宏定义对象接在哪个脚上,头文件只声明供外部调用的功能函数,也就是说,其他人只要看头文件函数声明就知道如何使用此对象而无需去看源文件去阅读代码。一般函数的命名规则是:对象功能,比如初始化 Charger,函数名可以为 ChargerInit。如果一个函数只供对象功能函数内部调用,则此函数在源文件里面声明和实现,不出现在头文件里,并声明为 static 函数,因为声明为 static 的函数只能供定义此函数

2021-03-11 19:50:09 898

原创 锂电池充电管理介绍

锂电池管理锂电池特性概述锂离子电池(锂电池)是以锂合金的金属氧化物为阳极材料、以石墨为阴极材料、使用非水电解质的可充电电池。锂离子电池具有以下优点:重量轻,其能量密度是镍-镉电池的两倍;自放电比镍-镉电池少6〜8倍;没有记忆效应;单元电压大约3.6伏,属于较高水平,通常能满足大多数应用的需要。这些特点让锂离子电池在便携式电子产品中得到广泛的应用,下图是几种常见的锂电池样品。但是锂电池又因为其特性特别活泼,稍有不慎,容易燃烧,而燃烧带来的温度升高以及体积膨胀会给周围环境甚至人身造成很大的损害,甚至导

2021-03-11 15:21:25 2272

原创 Nor 和NAND Flash 比较

Nor 和NAND Flash区别1、操作速度在写数据和擦除大量数据时,由于NAND flash 支持整块操作,因此NAND比NOR快得多,两者相差近千倍;但是数据量小的时候,比如几个字节,Nor Flash比NAND flash 擦写速度快,因为对NAND flash的读写操作,虽然只是几个字节的操作,也需要重写整个数据块;由于NOR地址线和数据线分开,所以NOR芯片可以像SRAM一样连在数据线上。读取数据时,NOR比NAND快,NOR以字或字节为单位进行读取,NAND要先向芯片发送地址信息进行寻址

2021-03-10 09:03:39 1615

原创 软件电量计电量跳变问题以及TWS充电盒尽量不使用软件电量计的说明

主要问题------电量跳变;为避免电量跳变的问题可采取以下措施: 1. 检测在盒充电状态,在盒充电状态,电量只能升不能降,盒外状态只能降不 能升; 2. 在上述措施的基础上,如果算法给出的电量连续3个周期都要变化,则以最小的变 化区间变化; 3. 防止系统重启导致电量跳变,则需要在关机重启之前将电池电量存入Flash,下次 开机电量计计算出来的电量只能比这个电量小,不能大,如果大的话,以Flash中存 的电量为准;盒子软件电量计风险:放电场景较为复杂—单耳入盒充电、双耳入盒充

2021-03-02 15:30:11 760 1

转载 C语言中volatile关键字

volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量;volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。作用简单地说就是防止编译器对代码进行优化。比如如下程序:XBYTE[2]=0x55;XBYTE[2]=0x56;XBYTE[2]=0x57;XBYTE[2]=0x

2021-02-26 14:43:23 186

原创 #和##用法总结

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号。比如下面代码中的宏:#define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP “/n”); }

2021-02-20 15:24:40 44833

原创 BUCK BOOST以及BUCK_BOOST

处于稳定状态的电感,开关导通时间(电流上升段)的伏秒数须与开关关断(电流下降段)时的伏秒数在数值上相等,尽管两者符号相反。这也表示,绘出电感电压对时间的曲线,导通时段曲线的面积必须等于关断时段曲线的面积。降压转换器是一种切换式降压转换器,它可在较高的 VIN / VOUT 比和较高的负载电流之下,提供高效率和高弹性的输出。它的基本电路如图 3 所示。大多数降压转换器包含一个内部高侧 MOSFET 和一个低侧作为同步整流器的 MOSFET,借着内部占空比控制电路来控制两者的交替开、关 (ON/OFF) 以调

2021-02-19 09:43:20 6891

原创 结构体数据存入Flash中,元素位置偏移的问题分析

问题背景:今天调试Flash存储,其中存储数据是一个结构体变量,发现结构体变量中有一些元素位置往后偏移的问题!具体原因:如下面的结构体变量 test,把其存入flash中,其所占空间为6字节,而不是5字节;原因就是结构体有字节对齐的概念,即以结构体成员中占内存最多的数据类型所占的字节数为标准,所有的成员在分配内存时都要与这个长度对齐。以下面的结构体变量test为例,其元素中a和c是两个字节,则b要与其对齐,则会自动补充一个空字节;typedef struct{ uint16_t a; uint8_t

2021-02-18 15:22:40 792 3

原创 I2C通信协议介绍

I2C是本人在实际项目中使用最多的一个通信协议,其只用两条线(SDA和SCL)在连接到总线上的设备之间传送数据。每一个设备都由唯一的地址来识别(不管是MCU、外部sensor、LCD驱动器、存储器或者键盘接口),并且可以依照设备的功能作为发送器或者接收器使用。LCD驱动器可能只是个接收器,而存储器可以发送和接受数据。除了发送器和接收器,当传送数据时设备还可以作为主机或者从机。主机就是初始化数据传输和产生时钟信号的设备,在那个时刻,任何被寻址的设备都是从机。SDA和SCL信号SDA和SCL都是双向线路,通

2021-02-13 11:12:07 538

原创 NFC无线充电流程

NFC无线充电实际应用中,Listener端是一个TAG芯片,芯片中分为EEPROM区域和SRAM区域(原因是整个充电过程中,会循环擦写数据,EEPROM有擦写次数限制,实际过程在SRAM中进行),在EEPROM区域默认写入静态充电CAP信息,这样当入场后,Poller读取信息,默认静态充电,保持场常开状态。当Listener端检测到场打开之后,会将映射打开(打开后,poller端来读取信息时就会从sram读值),并且将CAP信息写入SRAM中充电状态是协商充电;整个充电过程如下图所示:...

2021-02-13 11:04:34 5681

转载 warning: CRLF will be replaced by LF in 出现的原因和解决办法

转载主要原因是,不同系统下,文件的换行符是用不同字符表示的。Linux采用换行符LF表示下一行;Windows采用回车+换行CRLF表示下一行;Mac OS采用回车CR表示下一行。解决方法是,切换git对待换行符的方式。git config core.autocrlf查询当前应对策略。为true时,Git会将你add的所有文件视为文本问价你,将结尾的CRLF转换为LF,而checkout时会再将文件的LF格式转为CRLF格式。为false时,line endings不做任何改变,文本文件保

2021-01-26 15:05:47 1949

原创 NDEF格式学习

NDEF(NFC Data Exchange Format )NFC数据交换格式:一般来说,一个NDEF数据是有几个Record数据组成,每一个Record可分为Header和payload;MB(message begain):该bit表示该记录是不是首记录,1表示该记录是首记录,0表示该记录不是首记录;ME(message end):该bit表示该记录是不是尾记录,1表示该记录是尾记录,0表示该记录不是尾记录;CF(chuck flag):该bit表示该记录是否被切块;SR(short rec

2021-01-17 19:47:41 5814 3

原创 NFC无线充电(WLC)介绍

NFC无线充电介绍NFC技术允许将功率传输到标签以实现通信传输。 这是通过提供恒定的载波信号来实现的。 NFC无线充电就是使用NFC通信链路来控制所传输的功率。 因此,就可将NFC的纯通信目的扩展到无线充电。该规范可用于为小型NFC设备充电,如智能手表,活动跟踪器,耳机和其他消费者的电子设备。使用NFC技术进行无线充电的好处是:使用现有的NFC规范来控制无线充电,共享相同的天线进...

2021-01-17 19:35:52 6158 1

原创 FreeRTOS的heap5.c

heap5 与heap4 比较相似,也是实现了malloc和free,同时也可以进行碎片合并。有的区别是heap5 可以有多个堆区,static void prvHeapInit( void ) 被换成void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions )这个函数。结构体HeapRegion_t(portable.h)如下:const HeapRegion_t * const pxHeapRegions 结构体如下

2021-01-15 19:49:34 732

原创 FreeRTOS的heap4.c代码逐行分析

直入主题----->这个函数目的主要是在第一次调用malloc函数时,将根据字节对齐计算出可以应用的分配空间,并且初始化可用的链表结构!(下图盗用网络图片,画的很好)xBlockAllocatedBit变量说明:Heap_4用了BlockLink_t中xBlockSize的最高一位来标识某个内存块是否处于空闲状态,这样一来,每一个分配出去的内存块大小就有限制了。例如,我用的是STM32F103,size_t是定义为unsigned int类型的,32位,可支持到4G的内存空间。但是最高1位用来

2021-01-12 16:11:36 445

原创 sizeof用法总结

sizeof是关键字,默认返回无符号整型数据;此外不要对指针应该用sizeof;数组的名字作为sizeof的参数时,数组名会被认为是指针;

2021-01-06 15:52:45 259

原创 产线电池电压ADC校准方案

校准方法如下:外部给固定电压V11,设备ADC采到的值为V1;外部再给出固定电压V22,设备内部ADC采到的值为V2;则:V11 = Gain * V1 + Offset;V22 = Gain * V2 + Offset;利用以上两个计算式,计算出Gain和 Offset;V矫正后 = Gain * V采集值 + Offset;...

2020-12-23 19:02:19 1744 4

原创 新学的一种电池电压滤波算法

新学的一种电池电压滤波算法之前对于ADC的采到的电池电压,为了计算电量,防止电池电压的波动导致电量计算偏差,一边会将采到的电池电压多取几次取平均,或者与前几次采到的值去滚动平均,这种方法一般是会创建一个数组来存放这些数值,会占用一定的内存值;今天在客户那学到一种新的处理方法,记录一下。其实方法很简单就是将电池电压进行一阶低通滤波,具体函数如下:Y(n) = αX(n)+(1-α)Y(n-1);X(n)表示此次的采样值;Y(n-1)表示上次的的计算值;Y(n)表示此次的计算值;α表示滤波系数,该

2020-12-23 14:33:02 2564 1

关于代码log的打印工具.7z

gq.7z

2021-07-19

Gun make(ver3.8)的中文手册.pdf

GUN make 中文手册

2021-01-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除