名词解释

(1)VCC:C=circuit 表示电路的意思, 即接入电路的电压

(2)VDD:D=device 表示器件的意思, 即器件内部的工作电压;

(3)VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压

(4)VEE:负电压供电;场效应管的源极(S)

(5)VBAT:当使用电池或其他电源连接到VBAT脚上时,当VDD 断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到VDD引脚上。

(6)VPP:编程/擦除电压。

(7)GND:在电路里常被定为电压参考基点。

(8)CC与DD的区别是:供电电压与工作电压的区别(通常VCC>VDD)

(9)V与VA的区别是:数字与模拟的区别

1
2
3
4
- 数字电路供电VCC
- 模拟电路供电VCCA
- VDD是指数字工作电压,就是供电进芯片的
- VDDA是模拟电压或者叫模拟正电源,是从芯片向外供电的

应用解释

1、对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc>Vdd),VSS是接地点。例如,对于ARM单片机来说,其供电电压VCC一般为5V,一般经过稳压模块将其转换为单片机工作电压VDD = 3.3V

2、有些IC既带VDD引脚又有VCC引脚,说明这种器件自身带有电压转换功能。

3、在场效应管(或COMS器件)中,VDD为漏极,VSS为源极,VDD和VSS指的是元件引脚,而不表示供电电压。

4、一般来说VCC=模拟电源,VDD=数字电源,VSS=数字地,VEE=负电源

5、从电气意义上说,GND分为电源地和信号地。PG是 Power Ground(电源地)的缩写。另一个是 Signal Ground(信号地)。实际上它们可能是连在一起的(不一定是混在一起哦!)。两个名称主要是便于对电路进行分析。

进一步说,还有因电路形式不同而必须区分的两种“地”:数字地,模拟地。

数字地和模拟地都有信号地、电源地两种情况。数字地和模拟地之间,某些电路可以直接连接,有些电路要用电抗器连接,有些电路不可连接。

原码补码反码移码

反码:解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则;
补码:解决负数加法运算正负零问题,弥补了反码的不足。

总之,反码与补码都是为了解决负数运算问题,跟正数没关系,因此,不管是正整数还是正小数,原码,反码,补码都全部相同。

总结:

  • 正数的原码、补码、反码均为其本身;
  • 负数(二进制)的原码、补码、反码公式:
    反码 = 原码(除符号位外)每位取反
    补码 = 反码 + 1
    反码 = 补码 - 1
    移码 = 补码符号位取反

计算机可靠性模型

串联系统

系统可靠性image-20240418103809734

系统失效率image-20240418103855822

并联系统

系统可靠性image-20240418103948295

系统失效率image-20240418104000114

hisi常用debug查看

  • hiddrs查看ddr占用
  • cat /dev/logmpp 查看设备mpplog

媒体处理部分

单片机复位介绍

经典的STM32内部复位电路如下

image-20240410090253667

可以看到复位分为两大类:内部复位和外部复位

  • 内部复位源通过脉冲发生器在 NRST 引脚产生延时至少 20μs 的脉冲,引起 NRST 保持电平产生复位;

  • 外部复位源则直接将 NRST 引脚电平拉低产生复 位。

外部复位

NRST 引脚上的低电平。

软件复位

将 Arm® Cortex®-M3 中断应用和复位控制寄存器中的 SYSRESETREQ 置“1” 时,可实现软件复位。JLINK对设备的复位就是控制的这一位。Reset: Reset device via AIRCR.SYSRESETREQ.

内核复位

在Cortex-M内核文档中大概有这样的描述:通过设置 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位,可只复位处理器内核而不复位其它片上设施。

也就是说,这样操作只复位Cortex-M内核,不会复位UART这些片内外设。

1
2
3
4
5
6
7
8
9
void NVIC_CoreReset(void)
{
__DSB();
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_VECTRESET_Msk); //置位 VECTRESET
__DSB();
while(1) { __NOP(); }
}
系统复位

软件复位中的系统复位操作的寄存器位(SYSRESETREQ)不同,复位的对象为整个芯片(除后备区域)。

系统复位函数:

1
2
3
4
5
6
7
8
9
void NVIC_SysReset(void)
{
__DSB();
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk); //置位 SYSRESETREQ
__DSB();
while(1) { __NOP(); }
}
电源复位

分为上电复位(POR 复位),掉电复位(PDR 复位),从待机模式唤醒。

依靠单片机内部的电源监控电路,在供电电压达不到设定值时自动进行复位。当检测到 VDD/VDDA低于阈值电压 VPOR和 VPDR 时,芯片将会自动保持为复位状 态,上电复位和掉电复位的波形图如下。

image-20240410114131548

低功耗复位

低功耗管理复位的产生有两种情况,一种是进入待机模式时,另一种是进入停止 模式时。在这两种情况下,如果把用户选择字节中的 RSTSTDB 位(待机模式 时)或 RSTSTOP 位(停止模式时)清零,系统将被复位而不是进入待机模式或 停止模式。

复位源查看

可以通过查看 RCM_CSTS(控制/状态寄存器)中的复位标志位识别复位事件来源,也可以相应清除标志位。

image-20240410114427398

PLL原理

image-20240409175353208

由一个基准频率振荡器(晶体振荡器),相位频率比较器VCO(电压控制振荡器),回路滤波器组成。晶振产生频率为fr的时钟,与VCO产生的fo的时钟同时传入相位频率比较器中进行比较,产生比较结果以脉冲波的形式传入回路滤波器,回路滤波器通过低频将脉冲波转变为直流低压VR,传入VCO对fo进行控制,形成反馈控制电路。

image-20240409175428500

当fr>fo时产生PD为正脉冲,VR变大,当fr<fo时,PD产生负脉冲波,VR减小,形成对fo的闭环控制,最终目的,是fo==fr

倍频器

PLL的主要功能还是倍频。倍频的实现其实很简单,只要在VCO的后面加一个分频器,时参与比较的Fvco=(1/n)fo,fo’是VCO产生的。这样就实现了Fvco=n*fr。

image-20240409175451397

分频器原理

分频器原理就是之前上的简单的数电知识,在这就一块说了。
主要就说一个偶数分频
偶数分频器的实现简单,用计数器在上升沿或者下降沿计数,当计数器的值等于分频系数的一半或等于分频系数时,信号翻转。
电路原理是用一个上升沿计数的计数器,每次计数到2时输出信号clkout翻转一次,每次计数到4时clkout再翻转一次,一直周期重复下去。其他的偶数分频器原理也是一样。

option byte介绍

串口波特率计算补充

由于单片机内部的RC时钟引起的误差而导致的产品失效,比如 Uart串口通信(常温不可以通信,温度高才行)、Watchdog看门狗复位失灵等等。所以在这里补充一下串口波特率相关计算。“串口波特率的最大偏差多少,对方就不能接收了或出错了?”

最常见的10位串口的输出时序( 1个起始位 + 8个数据位 + 1个停止位 )

image-20240401172627745

我们要确保实际波特率对应的 D0 ~ D7 时区段,都分别落在对方波特率的采样点的范围内,

从多个常见的波特率推送来看,****最大偏差一般在5% 以内都可以正常通信。

但考虑到不同芯片的采样点的方式有所不同,以及一帧的串口位不同(数据位越长,累计的偏差会更多),建议确保波特率控制在2%以内最好。

image-20240401174220374

  • 值得注意的是,每次接收数据采样点均会从第1 bit 数据初始化,这意味着采样偏差并不会累积至下一次数据传输,如图1所示,每次检测到下降沿时将重新开始进行数据采样。

image-20240401174311722

转载 –> 单片机冷启动下重启问题分析

问题现象

客户反馈MCU作为他们产品的控制芯片,在常温下工作是正常的,但是稍微冷冻下就会启动失败,重现率100%,再次加热或者恢复到常温又能正常工作。

问题分析解决

从客户描述上来看,猜测很大可能是硬件问题,因此带了一块STM32F030-NUCLEO板过去,想着做个芯片交换测试看下结果。

到达客户现场,了解到客户只是使用了内部高速晶振HSI。先使用示波器抓下VDD和NRST的启动波形,在常温下发现并没有明显异常。于是做低温测试,为了对比,基于STM32F030-NUCLEO板了写了一个只使用内部高速晶振HSI , 翻转一个LED灯的程序。

结果显示,STM32F030-NUCLEO板能正常启动,而客户的板子问题重现,再次测量其VDD和NRST的启动波形,发现VDD上电过程中有稍微不规则波形,但感觉不至于导致MCU无法启动。考虑到当前客户板子上的MCU跑的是客户自己的程序,为了统一对比,将客户板子上的MCU烧录成NUCELO板上一样的程序,再次做低温测试,结果显示客户的板子也能正常启动!

于是可以初步断定,此问题与客户自己的软件有关,而与外围电路无关。

接下来对比测试代码与客户自己的代码,并再次做低温测试验证结果,最终发现客户的时钟树配置有个参数有问题:

image-20240329095021747

如上红色代码所示,RCC_OSCILLATORTYPE_NONE改成RCC_OSCILLATORTYPE_HSI后。问题现象明显改善,但经过测试,发现偶尔还会启动不正常的时候。但相对于之前100%可以重现的现象,至少说明之前软件的失误至少是一个因素。

现在问题变成偶尔重现,已经向前迈进一大步。接下来怀疑与硬件有关了,理由是同样的测试软件跑在用户的板子上和跑在NUCELO软件上的结果不一致。

因此接下来首先对于用户的板子的外围电路与STM32F030-NUCLEO板子的外围电路,发现客户MCU的BOOT0引脚是悬空的,于是加上一个外部10K下拉电阻,再次测试问题不再重现。

至此,问题解决!

后话

回过头来看这个问题,发现客户知道MCU使用的是HSI,可偏偏在代码中配置时钟树时使用的晶振类型却是NONE !这种问题现在看来是非常低级的问题,但在代码量大,或者代码迭代的过程中,之前写代码的人离职,后续接手的工程师又不能全盘了解所有代码的情况下时就会变得束手无策,当碰到此类莫名其妙的问题,特别是无法判断到底是硬件问题还是软件问题的时候,保持清晰的思路是非常重要的。(另外,对于这个现象,看门狗也是可能是一种思路。比如说冷启动的时候导致看门狗模块异常不能及时喂狗所导致的重启)。继续补充一下。在低温环境,要注意晶振负载电容随温度的变化

这里我需要强调的是,最有效的解决方法就是快速找到一个 “参照物”,而ST的DEMO板和示例代码就是在硬件上和软件上扮演这样一个参照物的角色。可以通过MCU交换测试来判断是不是芯片外围电路的问题或者芯片问题,可以使用Cube库下的示例代码,对比其运行结果来判断是否与软件有关。先从大方向明确问题到底是与硬件有关还是与软件有关,然后再做下一步分析,这种方法希望读者能有效掌握。

总结

转载这篇文章,对思路进行一下开阔,有的问题可能看似与软件无关,实则确实息息相关。遇到异常的时候,首先分析时钟,电源,复位是否都是正常,不论是从软件还是从硬件上来确认。

Linux下网卡命名规则

rename 规则
1
2
3
4
5
6
7
8
9
10
11
step1 依据/usr/lib/udev/rules.d/60-net.rules, 查看是否有ifcfg-xx配置文件(路径在/etc/sysconfig/network-scripts/),
是否有定义了指定MAC地址的配置文件(ifcfg-xx ,xx必须和配置文件的内容DEVICE一致),如果有,则命名改网卡;

step2 依据/usr/lib/udev/rules.d/71-biosdevname.rules,如果biosdevname使能了(安装了biosdevname这个包,且内核启动参数显式设置为1),
且网卡没有在step1中定义,则按照biosdevname命名规则rename网卡;(注意,如果没有安装biosdevname这个包,就没有这个文件)

step3, 依据/lib/udev/rules.d/75-net-description.rules,将udev工具会根据device属性将填写网卡的属性命名,可能一个网卡会有多个维度的名称;

step4,udev 根据step3中的赋值,按照指定的scheme规则,去给在step1 step2中没有命名的网卡命名;

强调:这个step顺序是在我们没有自定义自己的rules的前提下,如果用户自定义了自己的rules,则用户自定义为优先级最高
传统命名

centos6之前采用的都是传统的命名方式,如eth0,1…

可预测的命名

cenos7之后提供了可预测性的网卡命名方式。

1
2
3
4
5
如果从BIOS中能够取到可用的,板载网卡的索引号,则使用这个索引号命名,例如: eno1,如不能则尝试2
如果从BIOS中能够取到可以用的,网卡所在的PCI-E热插拔插槽(注:pci槽位号)的索引号,则使用这个索引号命名,例如: ens1,如不能则尝试3
如果能拿到设备所连接的物理位置(PCI总线号+槽位号?)信息,则使用这个信息命名,例如:enp2s0,如不能则尝试4
传统的kernel命名方法,例如: eth0,这种命名方法的结果不可预知的,即可能第二块网卡对应eth0,第一块网卡对应eth1
使用网卡的MAC地址来命名,这个方法一般不使用
自定义规则
1
2
3
4
5
6
7
在用户没有自定义rules文件前提下,step1中的网卡命名方式也可认为是一种用户自定义的网卡命名,
即在/etc/sysconfig/network-scripts/ifcfg-xx 文件,xx就是这个网卡名称,文件内容中体现MAC_ADDRESS、NAME,
这种情况下,则会按照配置文件中指定的名称来命名网卡

如果用户自定义了rules文件,放在/etc/udev/rules.d/目录下,则这个优先级是最高的;
比1中ifcfg-xx方式优先级更高,但是如果两者不一致,则在重启network服务时,会依据ifcfg-xx,
所以用户不应该同时采用里两种方式给同一个网卡命不同的名称

udevadm info /sys/class/net/网卡名

可以显示此时这个网卡的pcie信息,vendor_id,idbus等等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@Bai5gc:/sys/class/net/eth1# udevadm info /sys/class/net/eth1
P: /devices/pci0000:00/0000:00:02.2/0000:03:00.0/net/eth1
E: DEVPATH=/devices/pci0000:00/0000:00:02.2/0000:03:00.0/net/eth1
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=Ethernet Connection X552 10 GbE Backplane
E: ID_MODEL_ID=0x15ab
E: ID_NET_DRIVER=ixgbe
E: ID_NET_LINK_FILE=/lib/systemd/network/99-default.link
E: ID_NET_NAME_MAC=enxb4a9fca897e7
E: ID_NET_NAME_ONBOARD=eno3
E: ID_NET_NAME_PATH=enp3s0f0
E: ID_PATH=pci-0000:03:00.0
E: ID_PATH_TAG=pci-0000_03_00_0
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR_ID=0x8086
E: IFINDEX=3
E: INTERFACE=eth1
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/eth1
E: TAGS=:systemd:
E: USEC_INITIALIZED=5061037
E: net.ifnames=0

ps:解释一下pci地址

  • /pci0000:00:这是根 PCIe 控制器的地址,pci0000:00 表示根控制器。
  • /0000:00:02.2:这是连接到根控制器的第一个 PCIe 设备的地址。0000:00:02.2 表示这个设备的总线号、设备号和功能号。
  • /0000:03:00.0:这是连接到第一个 PCIe 设备的下一个 PCIe 设备的地址。0000:03:00.0 表示新设备的总线号、设备号和功能号。
命名rule.d
biosdevname和net.ifnames两种命名规范
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
net.ifnames的命名规范为:设备类型+设备位置+数字

设备类型:

en 表示Ethernet
wl 表示WLAN
ww 表示无线广域网WWAN

实际的例子:

eno1 板载网卡
enp0s2 pci网卡
ens33 pci网卡
wlp3s0 PCI无线网卡
wwp0s29f7u2i2 4G modem
wlp0s2f1u4u1 连接在USB Hub上的无线网卡
enx78e7d1ea46da pci网卡


biosdevname的命名规范为: 要么是em开头,要么是p开头
实际的例子:

em1 板载网卡
p3p4 pci网卡
p3p4_1 虚拟网卡
0%