cathy的博客

资深工程师:图说CRC原理应用及STM32硬件CRC外设

在嵌入式产品应用中,常常需要应对系统数据在存储或者传输过程中的完整性问题。

所谓完整性是指数据在其生命周期中的准确性和一致性。这些数据可能存储在EEPROM/FLASH里,或者基于通信协议进行传输,它们有可能因为外界干扰或者程序错误,甚至系统入侵而导致被破坏。如果这些数据在使用前不做校验,产品功能可能失效。在一些特定领域,严重时可能会危及用户财产甚至生命安全。

本文就来聊聊使用较为广泛的循环冗余校验技术,以及在STM32中的一些具体使用体会。

所谓循环冗余校验(CRC:Cyclic Redundancy Check)是一种错误检测算法,通常在通信协议中或存储设备中用于检测原始数据的意外变动。可以简单理解成对有用数据按照一定的算法进行计算后,提取出一个特征值,并附加在有用数据后。在应用中将有用数据按照特定的算法提取特征值与预先存储的特征值进行比对,如相等则校验通过,反之校验失败,从而识别出数据是否异常。

为何要校验数据完整性(Data Integrity)?

数据在存储以及传输的过程中可能发生异动。以数据通信应用场景为例,常见的错误大致有两种失效模式:

单个位错误(Single Bit Error):仅仅某一个数据位出现错误,如图:

博文分享 | 嵌入式常见笔试题收集

一、系统相关

波特率

1)定义:

波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。

在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。波特率是传输通道频宽的指标。

2)计算:

波特率115200 = 115200 (位/秒)

以最普通的串口(起始位+8位数据+停止位)为例:

除以10,得到的是每秒字节数:
波特率115200 = 115200 (位/秒) = 11520 (字节/秒)

再除以 1024,就是每秒 KB 数:
波特率115200 = 115200 (位/秒) = 11.25 (KB/秒)

如果有一位奇偶校验位,就应该除以 11,得到的是每秒字节数。

最后:

波特率115200 = 115200 (位/秒) = 10.27 (KB/秒)

备注:

二进制环境下,波特率 = 比特率。

博客分享:单片机内部FLASH的字节操作

一般32位单片机的内部FALSH是不支持字节操作的,有的可以按字节读取,但是不能按字节写入。

而且,一般单片机内部FALSH擦除的最小单位都是页,如果向某页中的某个位置写入数据,恰好这个位置的前面存了其他数据,那么就必须把这页擦除,存的其他数据也会丢失。

实际上就是说内部的FALSH不好做改写的操作,如果有很多数据需要存放,最好是分页存储。这也是FALSH与E2PROM最大的区别,后者支持按字节操作且无需擦除,即使某一个地址写坏了,也不影响其他地址。

下面介绍一种方法让内部FLASH"支持"字节操作,且同一页的其他数据不受影响。

方法原理很简单,下面简单介绍下原理:

1.根据要写入地址,计算出该地址位于哪一页;

2.读出整个页,存入缓存BUF;

3.将要写入的数据按位置更新到BUF中;

4.擦除该页;

5.写入整个BUF。

可以看出这种方法弊端很明显:

1.耗时长 每次写都要读整个BUF,然后还要先把数据存到BUF里,然后再写入整个BUF;

2.FALSH擦写次数增加,降低使用寿命;

下面给出测试代码:

警惕!CAF效应导致PCB漏电~

最近碰到一个PCB漏电的问题,起因是一款低功耗产品,本来整机uA级别的电流,常温老化使用了一段时间后发现其功耗上升,个别样机功耗甚至达到了mA级别。仔细排除了元器件问题,最终发现了一个5V电压点,在产品休眠的状态下本该为0V,然而其竟然有1.8V左右的压降!耐心地切割PCB线路,惊讶地发现PCB上的两个毫无电气连接的过孔竟然可以测试到相互间几百欧姆的阻值。查看该设计原稿,两层板,过孔间距焊盘间距>6mil,孔壁间距>18mil,这样的设计在PCB行业中实属普通的钻孔工艺。洗去油墨,排除油墨或孔表层的杂质导电问题,实测过孔间阻值依然存在!百思不得其解一段时间后,才发现原来是“CAF效应”导致的漏电问题!

“”

什么是CAF效应:

CAF,全称为导电性阳极丝(CAF:Conductive Anodic Filamentation), 指的是PCB内部铜离子从阳极(高电压)沿着玻纤丝间的微裂通道,向阴极(低电压)迁移过程中发生的铜与铜盐的漏电行为。

硬件电路中的上拉电阻为什么能上拉?看完这篇文章你就懂了~

电阻在电路中起限制电流的作用。上拉电阻和下拉电阻是经常提到也是经常用到的电阻。在每个系统的设计中都用到了大量的上拉电阻和下拉电阻。

“”

在上拉电阻和下拉电阻的电路中,经常有的疑问是:上拉电阻为何能上拉?下拉电阻为何能下拉?下拉电阻旁边为何经常会串一个电阻?

电感的损耗有哪些?

最近在整理电感的相关知识,说实话,对于电感这类非常基础的东西,也并没有掌握得很好,因为我又温故而知新了。这个新,就是电感的损耗了,我们在工作中或多或少都会遇到电感发烫的问题,那下面就来具体的说一说电感的损耗有哪些,希望能对我们构建知识体系有帮助。

电感的损耗主要有以下两种:

线圈损耗:DCR,ACR

磁芯损耗:磁滞损耗,涡流损耗,剩余损耗

线圈损耗

DCR,一般认为是电感线圈的直流电阻,这个参数一般在厂家给出的电感规格书中都有。DCR这个比较容易理解,线圈的线总长越长,电阻越大,线圈越细,电阻也越大。

所以,一般来说,电感量越大,DCR越大,因为需要的线圈越长。过流能力大的电感,线圈线径越粗,所以DCR会小一些,但是体积会更大。

ACR,可称之为交流电阻。我们在实际的DCDC开关电源中,电感的电流并不是恒定的,而是周期性变化的。可以理解为可一个直流电流上面叠加一个交流电流,之所以要分开,那是因为,两种电流所感受到的电阻不同。直流电流分量感受到的电阻为DCR,交流电流分量感受到的电阻要大于DCR,我们称之为ACR,需要注意,我这里说的是交流电阻,不是阻抗,就是不包含电感的感抗。

工程师必备:硬件EMC设计规范

一、引言

广义的电磁兼容控制技术包括抑制干扰源的发射和提高干扰接收器的敏感度,我们都知道干扰源、干扰传输途径和干扰接收器是电磁干扰的三要素,同时EMC也是围绕这些问题进行研究,而运用最为广泛的抑制方法是屏蔽、滤波和接地,用它们来切断干扰的传输途径。

本文将着重在单板的EMC设计上,介绍一些重要的EMC知识及法则。在最初电路板的设计阶段就着手考虑对电磁兼容的设计,种类包括公共阻抗耦合、串扰、高频载流导线产生的辐射和通过由互连布线和印制线形成的回路噪声等。

在高速逻辑电路里,这类问题特别脆弱,原因很多:

(1)电源与地线的阻抗随频率增加而增加,公共阻抗耦合的发生比较频繁;
(2)信号频率较高,通过寄生电容耦合到步线较有效,串扰发生更容易;
(3)信号回路尺寸与时钟频率及其谐波的波长相比拟,辐射更加显著;
(4)引起信号线路反射的阻抗不匹配问题。

二、总体概念及考虑

1. 五一五规则,即时钟频率到5MHz或脉冲上升时间小于5ns,则PCB板须采用多层板。
2. 不同电源平面不能重叠。
3. 公共阻抗耦合问题。

模型:

深入剖析锂电池保护电路的工作原理

今天介绍一下常见的锂电池保护电路的工作原理。

前言

举一个不恰当的例子,电池的充放电就像孩子喝母乳一样。

1,如果一直让孩子喝,家长不加以控制,那么这个奶可能会被喝光,类似电池过放;
2,如果家长一直不给孩子喝奶,这个奶就会积攒越来越多,类似电池过充;
3,如果孩子喝奶喝的急,容易呛奶,类似电池的过电流保护;

科学喝奶,规律喝奶,需要家长的监督,那电池如何做到科学充电和放电呢?

锂电池都有一个使用的安全电压区间,最高和最低电压一般被称为充放电终止电压或截止电压,当电池的实际工作电压长时间低于放电终止电压或者长时间高于充电终止电压时,电池内部将发生不可逆转的伤害,严重伤害电池,导致性能下降,俗称电池衰减,电池衰减的表现就是电池的内阻增大,容量下降等。

所以一般锂离子电池内部会有一个小的PCB板,和电池封装在一起,如下图所示,主要作用就是用来保护电池。

STM32四种库对比:寄存器、标准外设库、HAL、LL

1.我是选择寄存器开发STM32,还是标准外设库呢?
2.你有STM32L0标准外设库吗?
3.HAL库和LL库有什么差异?

下面就来讲讲开发STM32的四种库:

  • STM32Snippets
  • Standard Peripheral Library
  • STM32Cube LL
  • STM32Cube HAL

1、STM32Snippets

什么是STM32Snippets?

STM32Snippets可翻译为“代码片段”、“裁剪”,其实他就是我们常说的“寄存器”开发STM32的底层驱动代码。

比如配置ADC引脚的代码片段:

单片机测量PWM占空比的三种方法

PWM(Pulse Width Modulation),一般指脉冲宽度调节,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中,比如LED亮度调节、电机转速控制等。

而在某些特殊应用中,我们也需要通过测量输入PWM的占空比,来实现不同的输出控制,这就需要使用到PWM占空比的测量方法。这里介绍三种不同的测量方法:阻塞方式、中断方式以及定时器捕获功能。

1. 阻塞方式

MCU阻塞方式测量PWM占空比的原理比较简单,也只需要使用到一个普通的IO端口(设置为输入模式,对于51而言那就是一个普通的双向口)。具体实现流程为: