当前位置: 首页 > news >正文

w嵌入式分享合集68

自己的原文哦~          https://blog.51cto.com/whaosoft/14133002

一、一键开关机电路的设计方案

方案一:电路图

    一键开关机电路分析如下:

电路工作流程如下:

  • Key按下瞬间,Q2、Q1导通,7805输入电压在8.9V左右,7805工作,输出5V电压给单片机供电。
  • 单片机工作后,将最先进行IO口初始化,IO1设为输入状态,启用内部上拉;IO2设为输出状态,输出高电平。这时Q2、Q3导通,LED1发光,7805能够正常工作,单片机进入工作状态。
  • 当Key再次按下时,检测IO1电平为低,单片机可以通过使IO2输出低电平,Q2、Q3不导通,此时7805输入电压几乎为0,单片机不工作,系统关闭。

方案二:电路图

 原理很简单,Q1,Q2组成双稳态电路。由于C1的作用,上电的时候Q1先导通,Q2截止,如果没按下按键,电路将维持这个状态。Q3为P沟道增强型MOS管,因为Q2截止,Q3也截止,系统得不到电源。

    此时Q1的集电极为低电平0.3V左右,C1上的电压也为0.3V左右,当按下按键S1后,Q1基极被C1拉到0.3V,迅速截止。Q2开始导通,电路的状态发生翻转,Q2导通以后将Q3的门极拉到低电位,Q3导通,电源通过Q3给系统供电。

    Q2导通后,C1通过R1,R4充电,电压上升到1V左右,此时再次按下按键,C1的电压加到Q1基极,Q1导通,Q1集电极为低电平,通过R3强迫Q2截止,Q3也截止,系统关机。整个开关机的过程就是这样。

    如果要求这个电路的静态功耗低,可以全部采用MOS管,成本要高点,电路如下图,原理都是一样的,双稳态电路。

方案三:电路图

单键实现单片机开关机

  • 控制流程,按下按键,Q1导通.单片机通电复位,进入工作。
  • 检测 K-IN 是否低电平,否 不处理.是 单片机输出 K-OUT 为高电平,Q2导通,相当于按键长按.LED指示灯亮。
  • 放开按键,K-IN 经过上拉电阻,为高电平.单片机可以正常工作。
  • 在工作期间,按键按下,K-IN 为低电平,单片机检测到长按1秒,K-OUT 输出低电平,Q2截止.LED指示灯熄灭.放开按键,Q1截止,单片机断电。
  • 通过软件处理,可以实现短按开机,长按关机。

    单片机用PIC16F84A,通过简单的程序演示,证实此电路的可行性。

    这种电路如果这样用,是体现不出它的优点,用到开关电源控制,控制光耦.可以做到完全关断电原,实现零功耗待机.有些打印机上就是用这种电路。

方案四:用 CD4013 构建的电路

 CD4013电路关断时已经把后面电路切断了,而4013本身的电源不需关闭,COMS电路静态工作电流极少,1uA以下,可以忽略不计。

    用 4013 的电路对电源范围适用较广,3~18V都没问题,电路唯一需调整的就是根据电源电压和负载电流适当更改R1的值。

    开关管可使用MOSFET,效果更佳。

 .

二、单片机程序崩了...

在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象、原因及解决方法。

1 数组越界/溢出

现象:

    单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。

原因:

    数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。

解决方法:

    如果在调试程序时,发现程序总是在函数执行完毕时跑飞,多数情况是发生了数组越界(数组溢出)的错误,仔细检查函数中调用的数组是否存在越界(溢出)的情况。

2 中断服务程序缺失

现象:

    程序运行过程中总是跑飞。

原因:

    程序中打开了某个中断,但是却没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。

解决方法:

    检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。

3 看门狗复位

现象:

    在执行一段较为耗费时间的程序时,程序跑飞,并且总是跳到复位位置处。

原因:

    程序中使用了看门狗,但是没有及时“喂狗”,从而导致看门狗复位,使程序直接跳到复位位置。

解决方法:

    根据程序运行时间,尤其是一定要计算清楚最耗时的那段程序的运行时间,然后准确设置看门狗的复位时长,定时“喂狗”,尤其是如果有死循环的情况,一定要在死循环中记得“喂狗”。

狗确实还是挺重要的~~~

三、蜂鸣器播放音乐

就是无聊弄一下~~

开发软件是STM32CubeIDE

蜂鸣器

有源蜂鸣器

    内部有震荡源,只要通电就会有响声,但是声音频率固定。

无源蜂鸣器

    内部不含振荡源,蜂鸣器管脚输出一定频率的信号,才能发声。

    本实例中用到的是无源蜂鸣器,控制频率高低发出不同声调的声音。

电路原理图

 由电路原理图可知,蜂鸣器在PB5管脚,以一定频率翻转PB5管脚的电平,可以使蜂鸣器发声。

STM32工程

    打开STM32CubeIDE软件,新建STM32工程。

    配置时钟。

   项目设置。

 设置调试模式。

开启PB5管脚。

   写延时函数。

    开启定时器TIM7,是为了写延时函数HAL_Delay_us()。

    保存,生成代码。 

    打开gpio.c,添加如下代码。 

依次从音调数组中取music[i]。

    根据music[i]的值在tone数组中得到该音的发声频率(tone[music[i]]),调用sound函数控制蜂鸣器发声。

    声音的发声时间由time数组控制。

    蜂鸣器演奏音乐的两个要素就是声音频率、声音持续时间,分别对应乐谱中的音调、节拍。

.

四、SPI原理详解

什么是SPI

    SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。

    SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

SPI主从模式

    SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。

    SPI是全双工且SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps

SPI信号线

    SPI接口一般使用四条信号线通信:

    SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

    MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。

    MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。

    SCLK:串行时钟信号,由主设备产生。

    CS/SS:从设备片选信号,由主设备控制。它的功能是用来作为“片选引脚”,也就是选择指定的从设备,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。

    硬件上为4根线。

SPI一对一

SPI一对多

SPI设备选择

    SPI是[单主设备( single-master )]通信协议,这意味着总线中的只有一支中心设备能发起通信。当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”,如下图:

SPI数据发送接收

    SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。

    首先拉低对应SS信号线,表示与该设备进行通信

    主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据

    这里要注意,SCLK时钟信号可能是低电平有效,也可能是高电平有效,因为SPI有四种模式,这个我们在下面会介绍

    主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。

    从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

SPI通信的四种模式

    SPI的四种模式,简单地讲就是设置SCLK时钟信号线的那种信号为有效信号

    SPI通信有4种不同的操作模式,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式,具体如下:

    时钟极性(CPOL)定义了时钟空闲状态电平:

  • CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
  • CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时

    时钟相位(CPHA)定义数据的采集时间:

  • CPHA=0,在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。,在第2个边沿发送数据
  • CPHA=1,在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。,在第1个边沿发送数据

    例如:

typedef struct
{
uint16_t SPI_Direction; /*!< 传输方向,两向全双工,单向接收等*/
uint16_t SPI_Mode; /*!< 模式选择,确定主机还是从机 */
uint16_t SPI_DataSize; /*!< 数据大小,8位还是16位 */
uint16_t SPI_CPOL; /*!< 时钟极性选择 */
uint16_t SPI_CPHA; /*!< 时钟相位选择 */
uint16_t SPI_NSS; /*!< 片选是硬件还是软件*/
uint16_t SPI_BaudRatePrescaler; /*!< 分频系数 */
uint16_t SPI_FirstBit; /*!< 指定数据传输是从MSB还是LSB位开始的。M
SB就是二进制第一位,LSB就是最后一位 */
uint16_t SPI_CRCPolynomial; /*!< CRC校验 ,设置 CRC 校验多项式,提高通
信可靠性,大于 1 即可*/
}SPI_InitTypeDef;
  • Mode0:CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。
  • Mode1:CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
  • Mode2:CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
  • Mode3:CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

   它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极(clock polarity)CPOL与时钟期(clock phase)CPHA。

SPI的通信协议

主从设备必须使用相同的工作模式——SCLK、CPOL 和 CPHA,才能正常工作。如果有多个从设备,并且它们使用了不同的工作模式,那么主设备必须在读写不同从设备时需要重新修改对应从设备的模式。以上SPI总线协议的主要内容。

    是不是感觉,这就完了?SPI就是如此,他没有规定最大传输速率,没有地址方案,也没规定通信应答机制,没有规定流控制规则。

    只要四根信号线连接正确,SPI模式相同,将CS/SS信号线拉低,即可以直接通信,一次一个字节的传输,读写数据同时操作,这就是SPI

    些通信控制都得通过SPI设备自行实现,SPI并不关心物理接口的电气特性,例如信号的标准电压。

    PS:这也是SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。

SPI的三种模式

    SPI工作在3中模式下,分别是运行、等待和停止。

运行模式(Run Mode)

    这是基本的操作模式

等待模式(Wait Mode)

    SPI工作在等待模式是一种可配置的低功耗模式,可以通过SPICR2寄存器的SPISWAI位进行控制。在等待模式下,如果SPISWAI位清0,SPI操作类似于运行模式。如果SPISWAI位置1,SPI进入低功耗状态,并且SPI时钟将关闭。如果SPI配置为主机,所有的传输将停止,但是会在CPU进入运行模式后重新开始。如果SPI配置为从机,会继续接收和传输一个字节,这样就保证从机与主机同步。

停止模式(Stop Mode)

    为了降低功耗,SPI在停止模式是不活跃的。如果SPI配置为主机,正在进行的传输会停止,但是在CPU进入运行模式后会重新开始。如果SPI配置为从机,会继续接受和发送一个字节,这样就保证了从机与主机同步。

SPI原理图连接

STM32中SPI初始化配置

1.初始化GPIO口,配置相关引脚的复用功能,使能SPIx时钟。调用函数:void GPIO_Init();

2.使能SPI时钟总线:RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE)

3.配置SPI初始化的参数,设置SPI工作模式:SPI_Init(SPI1,&SPI_Initstructure)

4.使能SPI外设:SPI_Cmd(SPI1,ENABLE);

SPI配置设置

void SPI2_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 RCC_APB1PeriphClockCmd(  RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOBGPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;    //设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;    //设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;    //串行同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;  //串行同步时钟的第二个跳变沿(上升或下降)数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;    //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;    //定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;  //CRC值计算的多项式SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI2, ENABLE); //使能SPI外设SPI2_ReadWriteByte(0xff);//启动传输     
}

SPI发送函数(标准库/HAL库)

//标准库:
u8 SPIx_ReadWriteByte(u8 TxData)
{u8 retry=0;while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个byte 数据while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个bytereturn SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
}//HLA库:
uint8_t SPI_SendByte(uint8_t byte)
{uint8_t d_read,d_send=byte;if(HAL_SPI_TransmitReceive(&hspi1,&d_send,&d_read,1,0xFFFFFF)!=HAL_OK)d_read=0XFF;return d_read;

五、PCB为什么一定要做阻抗

在具有电阻、电感和电容的电路里,对交流电所起的阻碍作用叫做阻抗。阻抗常用Z表示,是一个复数,实部称为电阻,虚部称为电抗。

其中电容在电路中对交流电所起的阻碍作用称为容抗,电感在电路中对交流电所起的阻碍作用称为感抗,电容和电感在电路中对交流电引起的阻碍作用总称为电抗。

那么,阻抗对于PCB电路板的意义何在,PCB电路板为什么要做阻抗?一起往下看。

阻抗类型有五种:

  • 特性阻抗

在计算机﹑无线通讯等电子信息产品中, PCB的线路中的传输的能量, 是一种由电压与时间所构成的方形波信号(square wave signal, 称为脉冲pulse),它所遭遇的阻力则称为特性阻抗。

  • 差动阻抗

驱动端输入极性相反的两个同样信号波形,分别由两根差动线传送,在接收端这两个差动信号相减。差动阻抗就是两线之间的阻抗Zdiff。

  • 奇模阻抗

两线中一线对地的阻抗Zoo,两线阻抗值是一致。

  • 偶模阻抗

驱动端输入极性相同的两个同样信号波形, 將两线连在一起时的阻抗Zcom。

  • 共模阻抗

两线中一线对地的阻抗Zoe,两线阻抗值是一致,通常比奇模阻抗大。

PCB线路板为什么要做阻抗?

PCB线路板阻抗是指电阻和对电抗的参数,对交流电所起着阻碍作用。在PCB线路板生产中,阻抗处理是必不可少的。原因如下:

1、PCB线路(板底)要考虑接插安装电子元件,接插后考虑导电性能和信号传输性能等问题,所以就会要求阻抗越低越好。

2、PCB线路板在生产过程中要经历沉铜、电镀锡(或化学镀,或热喷锡)、接插件焊锡等工艺制作环节,而这些环节所用的材料都必须保证电阻率低,才能保证线路板的整体阻抗达到产品质量要求,并能正常运行。

3、PCB线路板的镀锡是整个线路板制作中最容易出现问题的地方,是影响阻抗的关键环节。化学镀锡层最大的缺陷就是易变色(既易氧化或潮解)、钎焊性差,会导致线路板难焊接、阻抗过高导致导电性能差或整板性能的不稳定。

4、PCB线路板中的导体中会有各种信号传递。为提高其传输速率而必须提高其频率时,线路本身如果因蚀刻、叠层厚度、导线宽度等因素不同,将会造成阻抗值的变化,使其信号失真,导致线路板使用性能下降,所以就需要控制阻抗值在一定范围内。

阻抗对于PCB电路板的意义

对电子行业来说,化学镀锡层最致命的弱点就是易变色(即易氧化或潮解)、钎焊性差导致难焊接、阻抗过高导致导电性能差或整板性能的不稳定、易长锡须,导致PCB线路短路以至烧毁或着火事件。

因为PCB线路板的主体线路是铜箔,在铜箔的焊点上就是镀锡层,而电子元件就是通过焊锡膏(或焊锡线)焊接在镀锡层上面的。

事实上,焊锡膏在融熔状态焊接到电子元件和锡镀层之间的是金属锡(即导电良好的金属单质),所以可以简单扼要地指出,电子元件是通过锡镀层再与PCB板底的铜箔连接的,所以锡镀层的纯洁性及其阻抗是关键;

未有接插电子元件之前,我们直接用仪器去检测阻抗时,其实仪器探头(或称为表笔)两端也是通过先接触PCB板底的铜箔表面的锡镀层,再与PCB板底的铜箔来连通电流的,所以锡镀层是关键。它是影响阻抗的关键和影响PCB整板性能的关键,也是易于被忽略的关键。

除金属单质外,其化合物均是电的不良导体或甚至不导电的(这也是造成线路中存在分布容量或传布容量的关键),所以锡镀层中存在这种似导电而非导电的锡的化合物或混合物时,其现成电阻率或未来氧化、受潮所发生电解反应后的电阻率及其相应的阻抗是相当高的(足以影响数字电路中的电平或信号传输,)而且其特征阻抗也不相一致。所以会影响该线路板及其整机的性能。

总的来说,PCB板底上的镀层物质和性能是影响PCB整板特征阻抗的最主要原因和最直接的原因,但又由于其具有随着镀层老化及受潮电解的变化性,所以其阻抗产生的忧患影响变得更加隐性和多变性。

其隐蔽的主要原因在于:第一不能被肉眼所见(包括其变化),第二不能被恒常测得,因为其有随着时间和环境湿度的改变而变的特性,所以易被人忽略。

.

六、PCB布局思路

分析好整个电路原理以后,就可以开始对整个电路进行布局布线,下面,给大家介绍一下布局的思路和原则。

1.首先,我们会对结构有要求的器件进行摆放,摆放的时候根据导入的结构,连接器得注意1脚的摆放位置。

2.布局时要注意结构中的限高要求。

3.如果要布局美观,一般按元件外框或者中线坐标来定位(居中对齐)。

4.整体布局要考虑散热。

5.布局的时候需要考虑好布线通道评估、考虑好等长需要的空间。

6.布局时需要考虑好电源流向,评估好电源通道。

7.高速、中速、低速电路要分开。

 8.强电流、高电压、强辐射元器件远离弱电流、低电压、敏感元器件。

9.模拟、数字、电源、保护电路要分开。

10.接口保护器件应尽量靠近接口放置。

11.接口保护器件摆放顺序要求:

  • 一般电源防雷保护器件的顺序是:压敏电阻、保险丝、抑制二极管、EMI滤波器、电感或者共模电感,对于原理图 缺失上面任意器件顺延布局。
  • 一般对接口信号的保护器件的顺序是:ESD(TVS管)、隔离变压器、共模电感、电容、电阻,对于原理图缺失上面任意器件顺延布局,严格按照原理图的顺序(要有判断原理图是否正确的能力)进行“一字型”布局。

12.电平变换芯片(如RS232)靠近连接器(如串口)放置。.

13.易受ESD干扰的器件,如NMOS及CMOS等器件,尽量远离易受ESD干扰的区域(如单板的边缘区域)。

14.时钟器件布局:

  • 晶体、晶振和时钟分配器与相关的IC器件要尽量靠近;
  • 时钟电路的滤波器(尽量采用“∏”型滤波)要靠近时钟 电路的电源输入管脚;
  • 晶振和时钟分配器的输出是否串接一个22欧姆的电阻;
  • 时钟分配器没用的输出管脚是否通过电阻接地;
  • 晶体、晶振和时钟分配器的布局要注意远离大功率的元器件、散热器等发热的器件;
  • 晶振距离板边和接口器件是否大于1inch。

15.开关电源是否远离AD\DA转换器、模拟器件、敏感器件、时钟器件。

16.开关电源布局要紧凑,输入\输出要分开,严格按照原理图的要求进行布局,不要将开关电源的电容随意放置。

17.电容和滤波器件 :

  • 电容务必要靠近电源管脚放置,而且容值越小的电容要越靠近电源管脚;
  • EMI滤波器要靠近芯片电源的输入口;
  • 原则上每个电源管脚一个0.1uf的小电容、一个集成电路一个或多个10uf大电容,可以根据具体情况进行增减。

.

七、STM32和51的区别

无聊的话题也说一下哈哈 不知道还有人弄51吗

单片微型计算机简称单片机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件,在我们自己的个人电脑中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在了一个芯片上而已。

51单片机

    应用最广泛的8位单片机当然也是初学者们最容易上手学习的单片机,最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。

51单片机特性

    51单片机之所以成为经典,成为易上手的单片机主要有以下特点:

    从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。

    同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活,这一功能无疑给使用者提供了极大的方便。

    乘法和除法指令,这给编程也带来了便利。很多的八位单片机都不具备乘法功能,作乘法时还得编上一段子程序调用,十分不便。

51单片机缺点

AD、EEPROM等功能需要靠扩展,增加了硬件和软件负担

虽然I/O脚使用简单,但高电平时无输出能力,这也是51系列单片机的最大软肋

运行速度过慢,特别是双数据指针,如能改进能给编程带来很大的便利

51保护能力很差,很容易烧坏芯片

51单片机应用范围

    目前在教学场合和对性能要求不高的场合大量被采用,使用最多的器件是8051、80C51。

STM32单片

    由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度。

STM32单片机特性

    由STM32简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名,其强大的功能主要表现在:

内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周期乘法和硬件除法

存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器

时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。POR、PDR和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振荡电路。内部40 kHz的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振

调试模式:串行调试(SWD)和JTAG接口。最多高达112个的快速I/O端口、最多多达11个定时器、最多多达13个通信接口。

STM32使用最多的器件:

STM32F103系列

STM32 L1系列

STM32W系列

51单片机和STM32单片机的区别

    51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机,后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,他的代表型号就是ATMEL公司的AT89系列。

    STM32单片机则是ST(意法半导体)公司使用arm公司的cortex-M3为核心生产的32bit系列的单片机,他的内部资源(寄存器和外设功能)较8051、AVR和PIC都要多的多,基本上接近于计算机的CPU了,适用于手机、路由器等等。

.

八、拆解新能源车

是不是钱多了难受 吃多了~?? 就是这么土豪

比亚迪“元”的电池系统和电驱系统~~~

电池系统-电池包

元EV电池采用独立铝制托盘,安装于底盘下,电池采用三元锂离子电池,容量为43. 2kWh,电池包能量密度为127Wh/kg,全部为比亚迪自制。

电池系统-电池包内部由石棉绝热垫起到阻隔保护作用。

元EV360的电池包总计43. 2kWh,由11个串联电池模组,其中6个模组为10节单体串联,5个模组为8节单体串联,即电池包由共计100节单体串联组成。

电池系统-电芯、模组

电池包采用单体电池为120Ah的三元锂离子电池,额定电压3.6V。单体电芯尺寸参数:173*122.5*50mm。

电池系统-BMS CECU

电池包的BMS采用分布式架构,包括一个中央控制器(CECU,电池包外)和3个局部控制器(LECU,电池包内),其中CECU采用飞思卡尔MC9S12XET256MAA(HCS12系列),其主要作用是实施监测电池状态(SOC、温度、SOH等)。

电池系统-BMS CECU

电池包内包括3个LECU,对别对应11个电池模组的采样数据。

LECU的主要作用是采集电池模组内的一次状态信息,主要是各个串联电芯的电压和温度传感器测量的模组内2个温度数据,其采用的数据采集IC芯片是美信的MAX17823B。

电驱系统

元EV采用三合一的电驱总成,即电机、减速器和控制器集成的方案,电驱总成核心部件均为比亚迪自制。

电驱系统-电机、减速器

电机采用单电机方案,为永磁同步电机,峰值功率70kW,额定功率35kW。

电机控制器采用TI的DSP(数字信号处理器)芯片TMS320配合Lattice的CPLD(复杂可编程逻辑器件)芯片LAMXO256C。

小三电模块

元EV采用三合一的小三电集成方案,即车载充电机(OBC)、DC-DC、PDU集成在一个模块内。

充电接口在整车前部,分为6. 6kW的慢充接口和60kW的快充接口,支持7小时慢充或者0. 5小时快充(冲至80% SOC)。 

启停电池

元EV的12V低压系统仍然采用铅酸电池,为天能的38B20L,主要为低压系统供电可以通过DC-DC由高压系统充电。

热管理系统

本车的热管理系统采用传统的空调制冷+PTC加热的方式,热管理系统总体包括了空调制冷系统、PTC加热系统、冷却液/冷媒管路和控制面板等组成。

空调制冷系统

一个典型的空调制冷系统包括电动压缩机、电子膨胀阀和冷凝器/蒸发器等核心部件。压缩机是空调系统的“心脏”,其作用是将低温低压的气态冷媒从低压侧吸入压缩,使其温度和压力升高,再泵入高压侧成为高温高压的气态冷媒,往复循环,是连接空调回路低压侧和高压侧的关键。

生产厂家来自比亚迪工业,单车价值量1500-2000元。

膨胀阀又称节流阀,是空调系统中的关键部件,在空调的基本回路中置于冷凝器和蒸发器之间,作用是将中温高压的液态冷媒节流为低温低压的液态冷媒(湿蒸汽形态),同时控制冷媒的流量不过高或过低。与压缩机相对的,膨胀阀是连接空调回路高压侧和低压侧的关键。

空调散热器总成(前端冷却模块)置于汽车前部,包括了冷媒回路下的冷凝器、冷却液回路下的散热器和电子风扇。

冷凝器是空调回路中与外部进行热交换的部件。

散热器是冷却液回路中与外部进行热交换的部件。 

电子风扇的作用是加速散热器模块的空气流通速率,从而提升热交换的效率。 

空调箱总成(HVAC)是制冷空调的车内模块,其主要部件包括蒸发器、鼓风机和控制器,配合外部出风口为座舱送风。 

电池热管理系统

电池的热管理系统需要实现对电池包的加热和制冷两个作用,其中与电池的热量交换主要由电池盒内的水冷板实现,而电池包的能量与外界传递的主要中转站就是电池冷却器(Chiller),其融合了蒸发器和换热器的功能。

水暖PTC制热系统

该车型采用PTC制热的方式,其利用PTC热敏电阻元件为发热源,本质是常见的电流热效应。

热量的传递模式是水暖,也即采用冷却液管路配合鼓风机为座舱加热,在电池制热回路中与冷却液制冷模式共用管路。

多媒体系统

元的多媒体系统包括中控主机和车机屏幕两大部分,其中屏幕为8英寸液晶屏;整套系统由比亚迪自主研发设计。

多媒体系统拆解后,包括两大部分PCB板:

1)8英寸屏幕后PCB板;

2)主机内有两层PCB板。

 8寸屏幕后PCB板包括:车机屏幕的驱动板、以及车机屏幕下按钮对应的按键板两部分。

主机内PCB板包括:

1)上层板:核心芯片包括NXP i.MX6、Sandisk e.MMC、NANYA DRAM及ADI视频解码芯片等;

2)下层板:为车机主板,包括多媒体收音机模块等。

组合仪表控制器中核心芯片包括:NXP MCU、ISSI SDRAM、MXIC Nor Flash等。 

灯具

比亚迪前大灯共两个,单个长宽高分别为70*30*20cm,单个总重4. 25KG。根据零部件经销商报价,前大灯单个价值量约为1200元。

比亚迪尾灯共2个,单个长宽高分别为47*20*12cm,单个总重1. 2KG。根据零部件经销商报价,尾灯单个价值量约为450元。

 比亚迪雾灯共2个,单个长宽高分别为30*20*12cm,单个总重0. 35KG。根据零部件经销商报价,雾灯单个价值量约为100元。

哈哈哈 最后希望byd的人看不到~~ 

 .

九、什么是眼图

  眼图是一系列数字信号在示波器上累积而显示的图形,它包含了丰富的信息,从眼图上可以观察出码间串扰和噪声的影响,体现了数字信号整体的特征,从而估计系统优劣程度,因而眼图分析是高速互连系统信号完整性分析的核心。

    另外也可以用此图形对接收滤波器的特性加以调整,以减小码间串扰,改善系统的传输性能。

    用一个示波器跨接在接收滤波器的输出端,然后调整示波器扫描周期,使示波器水平扫描周期与接收码元的周期同步,这时示波器屏幕上看到的图形就称为眼图。

    示波器一般测量的信号是一些位或某一段时间的波形,更多的反映的是细节信息,而眼图则反映的是链路上传输的所有数字信号的整体特征。

    观察眼图的方法是:用一个示波器跨接在接收滤波器的输出端,然后调整示波器扫描周期,使示波器水平扫描周期与接收码元的周期同步,这时示波器屏幕上看到的图形像人的眼睛,故称为“眼图”。

    从“眼图”上可以观察出码间串扰和噪声的影响,从而估计系统优劣程度。另外也可以用此图形对接收滤波器的特性加以调整,以减小码间串扰和改善系统的传输性能。

眼图是怎么形成的?

    对于数字信号,其高电平与低电平的变化可以有多种序列组合。以3个bit为例,可以有000-111共8中组合,在时域上将足够多的上述序列按某一个基准点对齐,然后将其波形叠加起来,就形成了眼图。

    如下图。对于测试仪器而言,首先从待测信号中恢复出信号的时钟信号,然后按照时钟基准来叠加出眼图,最终予以显示。

眼图中包含的信息有哪些?

    对于一幅真实的眼图,如下图,首先我们可以看出数字波形的平均上升时间(RiseTime)、下降时间(FallTime)、上冲(Overshoot)、下冲(Undershoot)、门限电平(Threshold/CrossingPercent)等基本的电平变换的参数。

    上升时间(RiseTime):脉冲信号的上升时间是指脉冲瞬时值最初到达规定下限和规定上限的两瞬时之间的间隔。除另有规定之外,下限和上限分别定为脉冲峰值幅度的10%和90%。

    下降时间(FallTime):脉冲信号的下降时间是指从脉冲峰值幅度的90%下降到10%所经历的时间间隔。

    上冲(Overshoot):也叫过冲就是第一个峰值或谷值超过设定电压,主要表现为一个尖端脉冲,并且能导致电路元器件的失效。

    下冲(Undershoot):是指下一个谷值或峰值。过分的过冲能够引起保护二极管工作,导致过早地失效。过分的下冲能够引起假的时钟或数据错误。

    门限电平(Threshold/CrossingPercent):是指在系统传输特性劣于某一特定误码率的情况下,收信机所能达到的最低接收电平。

如何根据眼图情况分辨信号质量?

    信号不可能每次高低电平的电压值都保持完全一致,也不能保证每次高低电平的上升沿、下降沿都在同一时刻。由于多次信号的叠加,眼图的信号线变粗,出现模糊(Blur)的现象。

    所以眼图也反映了信号的噪声和抖动:在纵轴电压轴上,体现为电压的噪声(VoltageNoise);在横轴时间轴上,体现为时域的抖动(Jitter)。如下图示。

    当存在噪声时,噪声将叠加在信号上,观察到的眼图的线迹会变得模糊不清。若同时存在码间串扰,“眼睛”将张开得更小。一般眼图的眼睛睁得越大,眼图眼高越高,代表信号质量越好。

    做信号仿真可以获取眼图情况,然后根据眼图情况判断信号的质量,如果眼图情况不好,可以调整硬件设计或者PCB设计,使眼图眼高变高,保证生产出的产品信号质量。

.

十一、STM32启动文件

STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此文件的代码在任何一个STM32F10x工程中都可以找到。

启动文件使用的ARM汇编指令汇总

Stack——栈

Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=
Stack_Mem SPACE Stack_Size
__initial_sp

    开辟栈的大小为 0X00000400(1KB),名字为 STACK, NOINIT 即不初始化,可读可写, 8(2^3)字节对齐。

    栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM 的大小。如果编写的程序比较大,定义的局部变量很多,那么就需要修改栈的大小。如果某一天,你写的程序出现了莫名奇怪的错误,并进入了硬 fault 的时候,这时你就要考虑下是不是栈不够大,溢出了。

    EQU:宏定义的伪指令,相当于等于,类似于C 中的 define。

    AREA:告诉汇编器汇编一个新的代码段或者数据段。STACK 表示段名,这个可以任意命名;NOINIT 表示不初始化;READWRITE 表示可读可写, ALIGN=3,表示按照 2^3对齐,即 8 字节对齐。

    SPACE:用于分配一定大小的内存空间,单位为字节。这里指定大小等于 Stack_Size。

    标号__initial_sp 紧挨着 SPACE 语句放置,表示栈的结束地址,即栈顶地址,栈是由高向低生长的。

Heap——堆

    开辟堆的大小为 0X00000200(512 字节),名字为 HEAP, NOINIT 即不初始化,可读可写, 8(2^3)字节对齐。__heap_base 表示对的起始地址, __heap_limit 表示堆的结束地址。堆是由低向高生长的,跟栈的生长方向相反。

    堆主要用来动态内存的分配,像 malloc()函数申请的内存就在堆上面。这个在 STM32里面用的比较少。

PRESERVE8THUMB

   PRESERVE8:指定当前文件的堆栈按照 8 字节对齐。

    THUMB:表示后面指令兼容 THUMB 指令。THUBM 是 ARM 以前的指令集, 16bit,现在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超集。

向量表

AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size

    定义一个数据段,名字为 RESET,可读。并声明 __Vectors、 __Vectors_End 和__Vectors_Size 这三个标号具有全局属性,可供外部的文件调用。

    EXPORT:声明一个标号可被外部的文件使用,使标号具有全局属性。如果是 IAR 编译器,则使用的是 GLOBAL 这个指令。

    当内核响应了一个发生的异常后,对应的异常服务例程(ESR)就会执行。为了决定 ESR的入口地址, 内核使用了―向量表查表机制‖。这里使用一张向量表。向量表其实是一个WORD(32 位整数)数组,每个下标对应一种异常,该下标元素的值则是该 ESR 的入口地址。向量表在地址空间中的位置是可以设置的,通过 NVIC 中的一个重定位寄存器来指出向量表的地址。在复位后,该寄存器的值为 0。因此,在地址 0 (即 FLASH 地址 0) 处必须包含一张向量表,用于初始时的异常分配。要注意的是这里有个另类:0 号类型并不是什么入口地址,而是给出了复位后 MSP 的初值。下图是F103的向量表。

__Vectors DCD __initial_sp ;栈顶地址
DCD Reset_Handler ;复位程序地址
DCD NMI_Handler
DCD HardFault_Handler
DCD MemManage_Handler
DCD BusFault_Handler
DCD UsageFault_Handler
DCD 0 ; 0 表示保留
DCD 0
DCD 0
DCD 0
DCD SVC_Handler
DCD DebugMon_Handler
DCD 0
DCD PendSV_Handler
DCD SysTick_Handler
;外部中断开始
DCD WWDG_IRQHandler
DCD PVD_IRQHandler
DCD TAMPER_IRQHandler
;限于篇幅,中间代码省略
DCD DMA2_Channel2_IRQHandler
DCD DMA2_Channel3_IRQHandler
DCD DMA2_Channel4_5_IRQHandler
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors

    __Vectors 为向量表起始地址, __Vectors_End 为向量表结束地址,两个相减即可算出向量表大小。

    向量表从 FLASH 的 0 地址开始放置,以 4 个字节为一个单位,地址 0 存放的是栈顶地址, 0X04 存放的是复位程序的地址,以此类推。从代码上看,向量表中存放的都是中断服务函数的函数名,可我们知道 C 语言中的函数名就是一个地址。

    DCD:分配一个或者多个以字为单位的内存,以四字节对齐,并要求初始化这些内存。在向量表中, DCD 分配了一堆内存,并且以 ESR 的入口地址初始化它们。

复位程序

AREA |.text|, CODE, READONLY

    定义一个名称为.text 的代码段,可读。

    复位子程序是系统上电后第一个执行的程序,调用 SystemInit 函数初始化系统时钟,然后调用 C 库函数_mian,最终调用 main 函数去到 C 的世界。

    WEAK:表示弱定义,如果外部文件优先定义了该标号则首先引用该标号,如果外部文件没有声明也不会出错。这里表示复位子程序可以由用户在其他文件重新实现,这里并不是唯一的。

    IMPORT:表示该标号来自外部文件,跟 C 语言中的 EXTERN 关键字类似。这里表示 SystemInit 和__main 这两个函数均来自外部的文件。

    SystemInit()是一个标准的库函数,在 system_stm32f10x.c 这个库文件中定义。主要作用是配置系统时钟,这里调用这个函数之后,单片机的系统时钟配被配置为 72M。__main 是一个标准的 C 库函数,主要作用是初始化用户堆栈,并在函数的最后调用main 函数去到 C 的世界。这就是为什么我们写的程序都有一个 main 函数的原因。

     LDR、 BLX、 BX 是 CM4 内核的指令,可在《CM3 权威指南 CnR2》第四章-指令集里面查询到,具体作用见下表:

 中断服务程序

    在启动文件里面已经帮我们写好所有中断的中断服务函数,跟我们平时写的中断服务函数不一样的就是这些函数都是空的,真正的中断服务程序需要我们在外部的 C 文件里面重新实现,这里只是提前占了一个位置而已。

    如果我们在使用某个外设的时候,开启了某个中断,但是又忘记编写配套的中断服务程序或者函数名写错,那当中断来临的时,程序就会跳转到启动文件预先写好的空的中断服务程序中,并且在这个空函数中无线循环,即程序就死在这里。

NMI_Handler PROC ;系统异常
EXPORT NMI_Handler [WEAK]
B .
ENDP
;限于篇幅,中间代码省略
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC ;外部中断
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMP_STAMP_IRQHandler [WEAK]
;限于篇幅,中间代码省略
LTDC_IRQHandler
LTDC_ER_IRQHandler
DMA2D_IRQHandler
B .
ENDP

   B:跳转到一个标号。这里跳转到一个‘.’,即表示无线循环

用户堆栈初始化

ALIGN

    ALIGN:对指令或者数据存放的地址进行对齐,后面会跟一个立即数。缺省表示 4 字节对齐。

;用户栈和堆初始化,由 C 库函数_main 来完成
IF :DEF:__MICROLIB ;这个宏在 KEIL 里面开启
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory ; 这个函数由用户自己实现
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END

    首先判断是否定义了__MICROLIB ,如果定义了这个宏则赋予标号__initial_sp(栈顶地址)、 __heap_base(堆起始地址)、 __heap_limit(堆结束地址)全局属性,可供外部文件调用。有关这个宏我们在 KEIL 里面配置,具体见下图。然后堆栈的初始化就由 C 库函数_main 来完成。

    如果没有定义__MICROLIB,则才用双段存储器模式,且声明标号__user_initial_stackheap 具有全局属性,让用户自己来初始化堆栈。延庆川北小区45孙老师 收卖废品破烂垃圾炒股 废品孙 再回收

    前文的汇编代码,需要注意:

  • IF,ELSE,ENDIF:汇编的条件分支语句,跟 C 语言的 if ,else 类似
  • END:文件结束

.

十二、发一发曾经的程序员看看都有谁啊 哈哈一看吓一跳

王小波

    对于王小波也就读过一本《一只特立独行的猪》,让我对王小波产生兴趣的是在读到《Mac Talk》这本书里写到王小波除了作家的身份外,还是一名程序员,并且是一名很牛的程序员。在 90 年代初的时候因为国内应用软件缺乏,爱捣鼓东西的王小波利用闲暇时间学习了汇编和C语言,编了中文编辑器和输入法。中文编辑器和输入法任何一个都是大牛级的 GEEK 才会去尝试的东西。

许嵩

    音乐才子许嵩在医学、烹饪方面都非常在行,在他15岁的时候就参加了全国中学生网页设计大赛,成为了安徽省的第一名,而且他最初的梦想是开发一个比windows更牛的操作系统。

马东

    说到马东,大家首先想到的可能是他前央视主持人的身份,以及他在《奇葩说》中的搞笑形象。

    身为相声大师马季的儿子,马东曾被父亲下了“不许学相声”的死命令。在他很小的时候,便被家里送往澳大利亚读书,读的正是计算机专业。毕业后,马东进入当地一家大公司工作,成了一名朝九晚五的程序员,一干就是10年。

http://www.dtcms.com/a/336750.html

相关文章:

  • 《动手学深度学习v2》学习笔记 | 1. 引言
  • 【每日一题】Day 6
  • 《算法导论》第 26 章 - 最大流
  • 华为云之Linux系统安装部署Tomcat服务器
  • 【C#补全计划】协变逆变
  • C++入门自学Day11-- String, Vector, List 复习
  • Linux 下基于 TCP 的 C 语言客户端/服务器通信详解(三个示例逐步进阶)
  • 高级堆结构
  • STM32学习笔记13-通信协议I2CMPU6050
  • Vue深入组件:Props 详解1
  • 文本邮箱提取工具
  • ARM汇编代码新手入门
  • 信号量机制中---生产者 - 消费者问题
  • LeetCode 1323: 6和9组成的最大数字
  • 计算机网络技术学习-day2《IP地址分类解析》
  • 中国星网发展情况全面分析
  • 每日Java面试系列(15):进阶篇(String不可变的原因、性能问题、String三剑客、自定义不可变设计、组合优于继承等相关问题)
  • 数据结构——线性表
  • 蓝桥杯C++
  • 下降路径最小和
  • 《Java高并发核心编程》笔记汇总
  • 【Java企业级开发】(八)Spring框架中Web项目构建
  • 【高等数学】第九章 多元函数微分法及其应用——第六节 多元函数微分学的几何应用
  • Transformer架构的数学本质:从注意力机制到大模型时代的技术内核
  • AI 编程在老项目中的困境与改进方向
  • 负载测试与压力测试详解
  • MySQL黑盒子研究工具 strace
  • 基于因果性的深层语义知识图谱对文本预处理的积极影响
  • Perf使用详解
  • AI系统性思维复盘概述