这一部分其实没什么重要的,听hld吹牛就完事了,主要看一下知识框架图:

在期末回过头来看这个框架,其实我们这一届授课的主要核心在下面的粉色部分,基本上就是把这些东西给讲解完,然后配合嵌入式的四个实验理解其中的内容。
嵌入式系统是一个计算机系统,它是大系统的一个组成部分,可以执行大系统的某些要求。(IEEE定义)
嵌入式系统硬件
嵌入式软件系统
嵌入式系统的开发工具
共性:专用性强,资源定制化,非功能属性约束多,一体化设计,技术途径丰富,知识与技术密集
嵌入式系统是面向领域的专用计算机系统
包括嵌入式硬件&嵌入式软件&嵌入式设计方法
嵌入式系统日益复杂,功能更为强大,应用领域更为广阔
嵌入式计算技术推动关联新技术发展
芯片:半导体材料制成的电路器件
引脚:半导体器件和外部连接的部分,排布在芯片两侧或周围
封装:将半导体以特定方式、特定材料包装起来,提高可靠性,便于使用
封装应该具有较强的机械性能,良好的电气性能,散热性能和化学稳定性能。
作用:
保护芯片免受物理损伤和环境影响
提供电气连接,使芯片能够与外部电路通信
便捷安装
散热
衡量芯片封装技术先进与否的指标:封装效率(芯片面积与封装面积之比),越接近1越好。
此外还有其他一些指标:
引脚要尽量短以减少延迟
引脚之间的距离应该尽量远,以保证互不干扰,提升性能(寄生电容)
基于散热的要求,封装越薄越好
封装的类型:
扁平式封装PQFP/PFP
四周均有引脚,大规模集成电路使用这种封装形式。
优点:操作方便,可靠性高,工艺成熟,价格低廉。
缺点:芯片边长有限,平行引脚,难以在高频工作(寄生电容)
双列直插式封装(DIP)
中小规模集成电路使用,适合在PCB上穿孔焊接,操作方便。封装效率低,体积较大。
球栅阵列封装(BGA)
高密度表面装配封装技术,以焊球代替引脚。
印制电路板(PCB):薄的纤维玻璃板,印有铜线来连接元件
原理图:用于表示电路的主要部分以及元件之间的连接
数据手册:芯片制造商提供的关于产品信息的文档,说明芯片的功能、结构、特性、使用方式等。
参考手册:提供给固件/软件设计师的芯片功能与编程细节。
接地电压/低电压:0V
接地引脚:接到一直是低电压的信号。
电源地:允许一定的电压波动
信号地:应该是稳定的
高电压/集电极电压:3V 5V 12V
Vcc标识对集电极的供电;Vdd表示对漏极的供电;Vee表示对发射极的供电;Vpp表示编程电压。
不同电平的区别:
TTL电平:+5V等同于逻辑1,0V等同于逻辑0。
CMOS电平:CMOS器件中12V电压表示逻辑1,低于3.6V表示逻辑0
RS-232电平:负逻辑电平,-3~-12V表示逻辑1,3~12V表示逻辑0
信号:信息的物理表示。在时-空域中,以特定载体(光,电,声音等)和特定形式传输信息的能量单元。
信号浮动与三态门。(这部分比较简单,略过)
如何解决信号浮动:
上拉电阻&下拉电阻
上拉电阻:连接在元件信号引脚和高电压之间的电阻,用于将引脚信号钳位在高电平,或者在驱动能力不足时提供电流。
下拉电阻:连接在元件信号引脚和低电压之间的电阻,用于将信号钳位在低电平,或者吸收电流。
负载问题:元件的输出驱动能力有限,输出对应过多元件输入的时候可能导致驱动过载,此时需要增加驱动器电路。
电容C

上图的三种电容,对应普通电容,电解电容,可变电容。
普通电容:没有正负极之分,可以任意方向接入电路
电解电容:有明确正负极,不能反接,体积较大,单位体积的容量高。
可调电容:可通过机械方式调节容量(如旋转旋钮)
电容的作用:隔直通交 调谐 滤波 整流 储能 退耦
退耦电容
芯片在改变输出端电压时,需要大量的电量改变输出信号,此时芯片的供电电路电压会急剧下降,可能导致芯片停止工作。
正常情况下,电容充电;当电路需要大量电量时,电容放电,因此可以将退耦电容连接在近供电端或信号输出引脚。
退耦电容基于滤波作用来消除电路的回拨噪声,或者基于储能来提供能量补充
放置在信号输出引脚时,将输出信号的干扰作为滤除对象
布设在电路板上距离可能需要大量电量的电路部分很近的位置
不要使用电解电容,在高频下表现为电感
旁路电容
主要将输入信号中的高频噪声作为滤除对象。
一张图描述两者功能:

晶体管
固体半导体制成的器件,具有检波,整流,放大,开关,稳压,信号调值等多种功能。
二极管
有两个极,一个PN结:

三极管(双极型晶体管)
三个极分别为N型与P型组成发射极Emitter,基极Base和集电极Collector,空穴和电子两种极性的载流子都参与导电。

箭头方向为电流流动的方向。
NPN型晶体管:基极为低电平时,基极与发射极之间无电流,此时三极管截断;基极为高电平时,基极与发射极之间存在微小电流,此时三极管导通,集电极信号可通过三极管到达发射极。
PNP型晶体管:基极为低电平时,发射极与基极之间有电流,此时三极管导通;基极为高电平时,发射极与基极之间无电流,此时三极管截断。
三极管工作的三种状态:
截止:C和E之间不导通
放大:B的电流大一点,C的电流会跟着变大(此时为正常工作)
饱和:C的电流大小不受B的影响
集电极开路(OC,也叫开集)

实际就是一个NPN三极管,当内部输入为低电平时,三极管导通,输出接地;当内部输入为高电平时,三极管截止,此时输出处于悬空状态。
现在已经学完I2C通信了,应该对开集和开漏有更深刻的理解。
上课讲的例子:

当输入为低电平,下面的三极管截止,上面的三极管导通,此时输出接地,为低电平;当输入为高电平,下面的三极管导通,此时+5V接地,所以上面的三极管输入为低电平,因此截止,输出为悬空状态。
场效应管
这部分内容强烈推荐视频:https://www.bilibili.com/video/BV1Y3t4etEtT
传统三极管存在电流,能耗较高,且体积较大,无法集成到高密度芯片中,因此出现了场效应管。场效应管利用电场效应控制,属于电压控制的半导体元件。(刚才的三极管属于电流控制的半导体元件)
场效应管分为两种:结型场效应管(JFET)和金属-氧化物半导体场效应管(MOS-FET)
JFET

对于N沟道的JFET,当栅极施加负电压时,PN结的截止区域扩大,使得N沟道被截止,三极管不导通;当栅极不施加负电压时,由于失去了反向高电压,绝缘区域不断消失,此时N沟道正常导通,三极管导通。
对于P沟道的JFET,当栅极施加正电压时,PN结截止区域扩大,使得P沟道被截止,三极管不导通;当不向栅极施加电压时,绝缘区域消失,此时P沟道正常导通,三极管导通。
JFET可以做如下类比:电路是一个水管,JFET就是一只手,当手松开时,水管正常流水,用手将水管捏紧后,水管就被堵住了。这个捏紧的过程就是施加电压的过程。常态下不论N型还是P型都是导通的,当施加电压(N沟道施加负电压,P沟道施加正电压)后,JFET的沟道被捏紧,使得电流无法通过。
为什么N沟道是负电压:栅极连接的是N沟道两边的P型半导体,如果接正电压,会正常导通的。我们的目的是接电压后将PN间的截止区域扩大直到彻底关闭,所以要接负电压,并且负电压要尽可能大,才能保证将沟道夹紧。对于P沟道同理。
此外,箭头方向表示沟道的类型,如果为N沟道则箭头朝内(上面的图),如果为P沟道则箭头朝外(下面的图)
JFET缺点:容易夹不紧,导致少量电流流过,对于需要严格控制电流的电路(如开关)无法接受。
MOS场效应管

对于NMOS管,当向栅极施加正电压时,电子聚集形成沟道,此时MOS管导通;当栅极无电压时,此时没有沟道,MOS管截止。
对于PMOS管,当向栅极施加负电压时,空穴聚集形成沟道,此时MOS管导通;当栅极无电压时,此时没有沟道,MOS管截止。
关于MOS管的结构,参照视频里面的图:

这是一个NMOS管,一般会将衬底和源极相连,引出源极S,所以在电路符号中的中间那个竖杠会和S那一侧的竖杠连接在一起。此外箭头方向为电子移动的方向,如NMOS中栅极施加正电压后电子向内移动形成N沟道,而PMOS中空穴聚集形成P沟道,所以电子是向外移动的。
注意这个图中,当漏极传来电流时,无法正常通过,因为N型半导体中间的P型半导体阻碍了电流;但是当源极S传来电流时,由于S和衬底连接,电流可以通过衬底到达漏极D,所以这里存在单向导通性:电流可以由源极流向漏极,但是不能由漏极流向源极。也就是说在MOS管中存在一个天然的寄生二极管。对于PMOS管中依然存在这个寄生二极管,只不过方向相反。
MOS管的其他类型:增强型和耗尽型。耗尽型MOS管在栅极电压为0时依然可以导通,所以在电路符号中三个竖杠是连在一起的。

漏极开路(OD,开漏)
与开集原理相同,不做过多介绍。
推挽电路

为什么使用推挽:强的驱动能力,将输出强上拉为1或者强下拉为0。
多个推挽电路不能线与:如果一条线路Vcc端导通,一条线路GND端导通,会导致电源接地,此时会产生大电流导致MOS管被击穿。
关于线与:

对于N1和N2两个三极管,当两者均截止时,输出OUT会被上拉电阻上拉为高电平,此时输出为1;如果其中有一个三极管导通,此时会导致输出OUT直接接地,那么此时输出为0。线与的结果就是,只有当两个三极管均截止(此图中输入均为0)时输出才会为1,只要有一个没有截止,输出就会为0。
这个逻辑类似于逻辑与,如果使用PNP型三极管的话可能更加清晰,图中使用的时NPN型,逻辑上可能有一些难以理解。
为了方便理解,画出上面电路图对应的真值表:
| OC门1 | OC门2 | OUT |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
对于上面的逻辑,如果将两个输入的所有值取反,那么得到的就是逻辑与的真值表;如果将OUT取反,得到的就是逻辑或的真值表。但实际上它们对应的电路图是一样的,只是做了不同的解释。
寄存器&计数器:电子电路讲过,虽然我已经忘了QAQ
嵌入式的核心逻辑与子系统:
处理器子系统,是嵌入式系统的核心,外设需要连接处理器进行工作。
存储子系统,片内存储和片外存储。
时钟子系统,为系统工作提供时钟控制脉冲信号。
I/O子系统
外围电路(最小系统:供电,复位,时钟)
调试子系统
课下自修(不可能的)
这一部分内容真不能怪我水,hld的ppt全都是这种格式的大段文字,图片也基本没几个有用的。
没听下啥东西
共同特征:
对外接口包括各类总线,辅助电路接口
都有指令系统
不同点:
指令的数量与功能(RISC和CISC)
结构设计(流水结构)
工艺和应用指标
嵌入式处理器的功能和内核与通用处理器具有相似性。区别在于嵌入式处理器可能采用不同的架构,集成大量I/O模块,构建嵌入式系统时不再需要外接这些模块,降低功耗。
MCU就是单片机,以某个微处理器为核心,芯片集成多种部件、功能和外设,与微处理器相比,最大的特点是单片化,体积大大减小,功耗和成本下降,可靠性提高,计算能力有限,主要用于控制等领域。
如51系列,ARM Cortex-M系列,AVR系列。
MCU的特点:
集成多种部件,功能和外设,一个芯片上具有CPU核,中断控制器,定时器,存储器核其他外设
计算核的指令数较少
位处理指令较丰富
计算性能通常不高
组件集成度较高,提供多种I/O接口
引脚数量相对较少
做较少扩充即可创建一个嵌入式系统
低成本,低功耗,使用方便
为数字信号处理等计算密集型的数学算法设计。
针对快速离散信号处理所需的高性能计算,对系统结构和指令进行特殊设计,编译效率,执行效率都较高。
在通用MCU中以普通指令实现DSP功能,但在专用嵌入式中需要专用的DSP处理器。
基本运算功能:
滤波:去掉不需要的频率信号
域变换:使用傅里叶变换将信号转换到频域,在频域中分析信号的频谱
如何提高DSP的处理能力:采用诸多软硬件优化设计。
计算核基于多级指令流水体系结构设计
采用多硬件乘法器单元,可在一个时钟周期并行完成多个乘加运算。
提供硬件控制循环,降低循环操作的开销
主要采用哈佛结构并支持多数据存储器,可以实现并行的多指令和多数据获取,提供DMS接口实现快速存储器访问
DSP分类:
定点DSP,只能完成顶点数的算术操作,通常16位的DSP用于定点计算。精度低,成本低,能耗低,适用于低端应用
浮点DSP,可处理浮点数,32位的DSP通常用于浮点运算。价格昂贵,但计算能力很强。
可编程逻辑器件PLD
嵌入式的内核一定有一个处理和控制功能的智能电路,能够执行实现设计的指令的部件,通过智能电路的运行,在硬件设计不变的情况下,通过修改指令完成不同的功能。
可编程器件PLD,主要代表是CPLD和FPGA
能够提高芯片乃至整个系统的灵活性,项目初期可以代替专用芯片
支撑可重构计算技术以及新兴多态计算技术的研究
即System on Chip,将一个完整的电子系统所需的所有或大部分组件集成在单个硅芯片上。多种处理器内核和各种外围芯片器件集成到一个芯片。
特点:集成度高,功能全,性能多样,定制化,功耗管理复杂,设计与制造成本高
一块SoC芯片通常包括如下逻辑组件:
多个处理器核心,MCU MPU DSP NPU GPU等
一种或多种嵌入式存储器,用于存储系统软件,用户程序运行时保存数据
一种或多种在片上互连总线,连接片上逻辑资源
一种或多种外部总线及接口,便于系统扩展
内置时钟电路及锁相环电路,提供稳定的多路时钟
计算装置所需的外围电路,电源电路,看门狗电路等
面向特定应用功能的外设组件
SoC分类:
通用型。如Apple A系列芯片,树莓派使用的Broadcom BCM等
专用型。如华为昇腾系列,基站Soc,比特币矿机芯片
两者的主要区别在于:
核心数量级不同。众核的核心数远远多于多核。
核心复杂度不同。多核的核心复杂度通常较高,众核相对简单。
缓存一致性机制不同
编程模型不同
应用场景不同
众核计算单元的应用:
图像、矩阵等数据具有并行处理特性,众核计算单元用于高性能并行处理数据。
ISA指令集:
定义了处理器可以执行的基本操作和指令
内核是指令集的具体硬件实现,一个指令集可以有多种不同的内核实现
指令集设计会影响内核的架构与性能,而内核设计会考虑如何高效执行指令集
指令集用于定义指令的格式,操作数的类型,寄存器的分配,地址的格式等
指令集的组成:
指令的分发、预取、解码、执行、写回
操作数的类型、存储、存取
Load/Store架构
寄存器
地址的格式、大端模式或小端模式
字节对齐、边界对齐
指令与汇编语言:
指令是可以被处理器识别、译码和执行的编码,是关联程序与处理器的关键接口
通常情况下,一条指令由操作码和算子(如果需要)组成,可执行程序是顺序存储的一组机器码的集合
汇编语句是处理器指令所对应的编程符号
代码密度:
衡量在给定内存空间中可以存储多少有意义程序代码的指标
由处理器的指令集架构(ISA)来决定
更高的代码密度意味着每条指令能执行更多操作
影响代码密度的因素:ISA,编译器与优化,处理器设计
代码密度高
代码密度影响存储,解码与功耗
冯诺依曼结构
一种将程序指令和数据存储在同一存储器,并使用同一套总线传输的计算机体系结构,用于实现通用图灵机
程序指令和数据具有相同的宽度,取指令和取操作数以分时复用的方式在同一套总线上进行
冯诺依曼结构通常包含:
一个存储器,实现程序指令和数据存储
一个控制器,控制程序的运行
一个运算器,用于完成算数,逻辑运算
输入和输出设备,用于进行人机交互和通信

哈佛结构:
独立的物理存储器,分别存储程序指令与数据,通过两套独立总线进行独立传输
提供更大的存储器带宽,实现更高效的指令流水机制,数据的移动和交换更加方便,适用于设计运算量大,运算速度和数据吞吐量要求高的处理器。

缺点:需要更多的地址线和数据线,使得处理器的设计以及外设连接与扩展的难度增加。
改进的哈佛结构:

ARM处理器的三大特点:
小体积、低功耗、成本低、高性能
16位/32位双指令集
全球众多合作伙伴
当前ARM体系结构的扩充:
Thumb:16位指令集(+32b混合),改善代码密度,与等价的32位代码相比,可节省存储空间
DSP:用于DSP应用的算术运算指令集
Jazeller:提供Java加速,允许直接执行Java字节码的扩充,与同等非Java加速内核相比,功耗降低80%
(TMD这个hld的PPT我是真不知道要放什么东西上来,她想考就考吧我不管了)
(自学......)
存储子系统:计算机系统中用于存放数据和程序的记忆性子系统,满足不同类型数据的临时/永久存储需要
分级的存储体系:
不同类型数据存储,访问要求具有差异,数据访问在时间、空间上的局部性原理;
通用计算机采用了Cache(SRAM),主存储器(DRAM),外部存储器(HDD)组成的多级存储体系。(围绕主存储器来组织和运行)
对于体积、重量、功耗、可靠性以及成本方面有特定要求的嵌入式系统的存储子系统,具有定制和多元的特征与要求
存储体:用于存储的介质
I/O接口:用于访问存储体
信号线:对外构成访问接口(地址线,控制线,片选线,辅助线)
信号线:
n位地址被分成行地址和列地址(n=r+c),r行地址数,c列地址数。行和列组合起来选择一个特定的存储单元。
存储器内部是一个逻辑上的二维阵列,数据存放在行地址和列地址交叉的存储单元中。
大部分存储器有一个使能信号,控制存储器数据引脚的三态。
在随机存储器上的读写信号,控制数据传输的方向,存储器芯片读写数据的引脚通常不是独立的。
读过程:
处理器对存储器访问时,遵循先地址有效,再数据访问的规则。首先将有效地址传输到地址总线,保持一段时间后,拉低
两次读取操作的最小时间间隔是读取周期

片选信号是选择存储器的信号,因为一个设备可能会使用总线连接多个存储器,需要使用一个信号来避免冲突,这个信号就是 。
是读取时间,即从地址有效到读取数据到地址总线后,片选信号拉高的时间。
是读取恢复的时间。在数据读取后,存储器需要做数据恢复(参考DRAM),这段时间不能再进行读取操作。 此外
是数据保持的时间,保证处理器可以读取到数据。
写过程:
依然遵循先地址有效,再数据访问的次序。将有效地址传至地址总线,使能片选信号和写入信号。然后需要等待一个数据建立时间
两次写操作的最小时间间隔是写周期

只读性:
当数据写入后,只能够读出,无法通过常规的方式对其进行重写,则这种存储器为只读存储器(ROM)。
当数据写入后,既可以读出,又可以写入,则这种存储器为可读/可写存储器,也叫随机存储器(RAM)。
易失性:
电源断开后,存储器的内容是否会丢失。
嵌入式系统中必须有一部分存储是非易失的,用来存储启动和初始化的代码
ROM为非易失性存储,RAM为易失性存储。
位容量:(hld这个b介绍位容量都不介绍概念的)
位容量 = 存储单元数量
1M * 4和4M * 1的器件位容量相同。前者读写1M内存单元,芯片有4个数据输入端和4个数据输出端(每个单元存储4bit)。后者读写4M内存单元,芯片有一个数据输入端和一个数据输出端(每个单元存储1bit)。
不同存储器的地址线和数据线宽度不同。
速度:存储器的访问时间,即存储器接收到稳定的地址输入到完成操作的时间。
功耗:静态功耗(器件处于待机状态的功耗),动态功耗(进行读写,刷新,I/O等操作时的功耗)
可靠性:平均故障时间
价格
hld给的存储器分类图:

随机存储器允许任意次数的读/写,主要分为:
SRAM,只要芯片有电,内容存在,掉电后内容会丢失。
DRAM,数据寿命短,通常只有0.25s,需要额外的刷新电路做周期性刷新。
特点:
SRAM比DRAM快。
工作时,SRAM耗电比DRAM多。
DRAM的存储密度大于SRAM,在一个芯片上可以放更多的DRAM。
DRAM需要周期性的刷新,所以需要专用的DRAM控制器。
为什么嵌入式系统更倾向于使用SRAM:
SRAM无需刷新,接口简单,实时性好,待机功耗低且易于片上集成
DRAM单位容量功耗更低,成本更低,但是需要专用控制器与周期性刷新,增加设计复杂度,时序不确定性与待机功耗,不适合很多小型/嵌入式场景。
六管SRAM,如图所示:

六个MOS管可以分为三组:
M5和M6为门控管,负责控制数据是否能够读写
M1和M3为工作管,由它们来进行数据的控制
M2和M4为负载管,为数据保持提供驱动
其余部分:
Q和
BL和
WL是字线,用于控制门控管M5和M6
静态存储:
此时字线WL为0,门控管关闭,电路存储数据。
假设此时Q为1,那么M2截止,M1导通,会导致
假设此时Q为0,那么M2导通,M1截止,此时
由于正反馈的存在,SRAM无需刷新就可以稳定保存数据。
写入数据:
假设要写入1,BL为1,
假设要写入0,首先将数据传到位线
SRAM的引脚:

数据,地址,读写,片选,其他(时钟,复位等)
存储元以电容中的电荷状态来表示1和0,由于电容中的电量会发生泄露,即使是连续供电,动态RAM中的信息也会因电荷泄露而丢失。

关于这张图,可以看到一个DRAM存储元就是一个电容加一个MOS管,数据保存在电容中,通过MOS管来对数据进行读写(这里的MOS管作用类似于SRAM的门控管)。
DRAM芯片模型:
CE,片选信号,前文有介绍,选择某个存储器
Adrs,地址线的输入
Data,数据线,读写数据时传输数据,双向。
关于
和 这两个有点疑问,为什么不用同一个引脚的上升沿和下降沿区分,而是要使用两个引脚的下降沿,但是时间紧张没时间看了。

只读存储器:按照向其中写入新数据的方法以及可重写次数来划分为掩膜ROM,PROM,EPROM,EEPROM,FLASH。
PROM:
PROM属于一次性编程的只读存储器,初始处于未编程状态,全1
编程时通过向芯片的管脚加电,每次向设备写入一个字节
一旦PROM被编程,其内容就不可更改。嵌入式中曾广泛使用的PROM称为OTP,常与微控制器集成在一起
EPROM:
可以多次进行擦除和重写的ROM
擦除时需要使用紫外线:将EPOM暴露在强紫外线光源下,从而将整个芯片重置到其初始状态,一般需要(10min-50min)
为了使EPROM具有可修改性,芯片的上方有一个石英窗,允许紫外线穿过而照射到电路上
EEPROM(
电可擦除可编程ROM,内部和EPROM类似,但擦除操作依赖电力,通常需要较高的电压
EEPROM中的任何一个字节都可以进行擦除和重写
一旦写入,数据就永久保留在设备中,直到被擦除
价格比EPROM高,写入周期比RAM长,不能代替RAM作为内存
(原理看不懂)
FLASH:
又称为单电压的EEPROM,在其安装的电路板上直接擦除和重写,且FLASH可以一次擦除一个扇区
具有高密度,低价格,非易失,快读(读取)以及电可编程的特点
重写时间比EEPROM快,具备RAM的功能以及高速编程的特点
允许某些块被保护,将引导代码放进保护快而允许更新设备上的其他存储块,被称为引导块闪存
FLASH的分类:NOR和NAND
NOR是在EEPROM的基础上发展出来的,它可以随机读取任意单元的内容(一次读取一个字,字大小需考虑实际情况,取决于接口),适合程序代码的读写与存储,因此常用于BOOT Loader代码的存储。
NAND将几个NMOS单元使用同一根线连接,可以按顺序读取存储单元的内容(一次读取一页,类似硬盘的扇区),适合数据或文件的串行读写存储。
FLASH的一些其他知识点:
FLASH适用于嵌入式处理器内部集成,也适合做片外扩展
在读操作时,处理器只需要提供片选信号,读信号,地址,存储器就可以返回数据
在写操作时,所有存储位置必须要先擦除再重写,并且一次擦除要擦除一个块,不能单独擦除某个字节
HNU的STC学习板使用的芯片是STC15F2K60S2,其中的2K表示有2048字节的SRAM,60表示有60K的FLASH。其中60K的FLASH ROM是程序存储器,用来保存运行的程序。2K的SRAM是数据存储器,具体的分配如下图:

数据存储器的2k分为256字节的idata区和1792字节的xdata区。idata区的0x00-0x1F表示寄存器组(R0-R7),一共有四个寄存器组,0x20-0x2F为位寻址区,一共128个可寻址位,0x30-0x7F为用户RAM区,0x80-0xFF为idata区,同时这部分地址通过不同的访问方式做区分,和sfr定义的寄存器地址复用。
xdata区的1792字节中,从0x00到0xFF的256字节为pdata区,这部分的访问速度比其他xdata区更快,但比idata区慢。0xFF-0x1FF为剩余的xdata区。
关于STC的寻址方式:
立即寻址 MOV A, #70H 表示将立即数70H送到累加器A中
直接寻址 ANL 70H, #48H 表示与70H地址单元中的数与立即数48H做与运算。 直接寻址最常用的是操作SFR寄存器,通常地址在0x80-0xFF,操作SFR的寄存器必须使用直接寻址
间接寻址 MOV A, @R1 表示将R1中存储的地址所包含的数据传送到累加器A。 (假设R1中的数据为40H,内部数据存储器40H中包含的数据为55H,那么这里就是将55H给到累加器)
寄存器寻址 INC R0 将R0的数+1,就是直接操作寄存器
例子:写P1端口的几种方法
直接使用宏定义
sfr P1 = 0x90; P1 = 0xFF;
直接写地址
*(unsigned char*)0x90 = 0xFF;
使用指针(错误,不能使用间接寻址) unsigned char* ptr = (unsigned char*)0x90; *ptr = 0xFF; 汇编代码为: MOV R0, #90H MOV @R0, #FFH
使用xdata指针(错误,访问外部RAM) xdata unsigned char* ptr = (xdata unsigned char*)0x90; *ptr = 0xFF;
支持4GB的线性地址空间
具有多个总线接口,允许对CODE区域和SRAM区域的操作同时进行
支持小端存储和大端存储
写缓存,提高程序执行速度
支持非对齐传输
位带访问
存储空间图如下:

code区为代码区,用于存储程序代码,或者存储启动后缺省的中断向量表;SRAM区用于片上静态SRAM;外设区用于片上外设;片外RAM区用于扩展外部存储器;片外外设区用于扩展片外外设。
存储器的访问属性:
可否缓冲(对存储器的写操作由写缓冲执行)
可否缓存(存储器读到的数据能否复制到存储器缓存)
可否执行(能否从本不存区域取出并执行程序代码)
可否共享(能否被多个总线设备共享)
代码区(512MB):
存放程序代码(不可缓存,直写Write through)
允许数据访问(通过数据总线接口进行,写操作是可缓冲的)
内部SRAM区(512MB):
通过系统总线来访问,写操作缓冲
重点——位带区,最低地址0x2000_0000处存在1MB的位带区,对应32MB的位带别名区(0x2200_0000开始),位带别名区的每个字(这里的字表示四个字节)对应位带区的一个bit。(位带区只能数据访问)
位带数据访问如下图,位带别名区的四个字节空间大小对应位带区的一个bit,例如0x2200_0000对应的是0x2000_0000地址的bit0,那么0x2200_0004对应的就是0x2000_0000的bit1,以此类推。

为什么要使用位带:原本每个地址对应一个字节,当我们对一个地址的数据做操作时,需要访问这个地址,然后对这个字节进行操作。但是在单片机场景中,很多时候我们需要对单个bit进行操作而不是整个字节。例如在控制led亮灭时,我们如果想要让led0灭,那么需要写代码:
P0 &= ~(1<<0);,这实际是对整个字节的操作,将P0和0xFE做与运算,从而清零最低位。但是如果我们为P0的每个bit都分配一个地址,那么对这个bit的操作就可以直接使用这个地址,而不是使用麻烦的位运算,比如P0_0 = 0。小扩展:STC中也有类似这样的操作,它为SFR寄存器中所有地址为8的倍数的寄存器提供了按位操作的方式,也就是sbit声明,相同的地址,如果用sfr声明,那么会访问到正常的sfr寄存器,如果使用sbit声明,那么会访问到它对应寄存器的对8取余的那一位。比如:P0的地址是0x80,能被8整除,所以可以位寻址,对于地址0x84,如果声明的方式为
sbit P0_4 = 0x84,那么可以正常对P0.4进行读写;如果声明的方式为sfr P0_4 = 0x84,那么这个会访问到串口4的控制寄存器S4CON。
位带操作的优越性:
原子性,硬件级别保证操作不可分割,避免中断导致的数据紊乱
代码简洁,将位操作变为赋值语句,提高可读性
效率提升,减少指令数量,提高执行效率
中断安全,多任务环境下无需关闭中断即可安全操作
片上外设区(512MB):
包括各类外设状态控制/状态寄存器,同样支持位带操作(0x4000_0000对应0x4200_0000)
不允许执行指令
为什么在片上SRAM和片上外设区设有位带:
片上SRAM
任务标志、事件标志等本身就是以bit为单位
实时操作系统(RTOS)或裸机并发场景中,单个bit的原子访问很常见
SRAM的访问延迟小,映射成本低,收益大
片上外设
外设寄存器大量采用位来控制功能(使能、中断清除标志等)
位带让修改某一位意义明确,且具备原子性
片外RAM(1GB):
前512MB布设片上/片外RAM,可缓存,可执行指令
后512MB不可缓存,用于片外存储器等其他RAM
可以存放程序代码和数据
片外外设(1GB):
前后半段功能完全一致
用于片外外设的寄存器,或者多核系统的共享内存
不允许执行指令
AHB内部私有外设总线:
NVIC,中断控制器
FPB,用于调试操作
APB外部私有外设总线:
供应商自定义
其他东西没时间看了,她要考我也没法
嵌入式系统硬件:以处理器与存储器为核心,以电子线路连接所有电子元件和接口所形成的器件网络。
最小系统:一个仅具有进入正确执行模式所需最少资源的系统
通常包括:
嵌入式处理器
片上/片外存储器
电源供电,复位,时钟
通过设计和验证最小系统硬件,可以掌握以特定型号处理器为核心的嵌入式硬件设计方法,为进一步功能,接口,总线扩展奠定基础。
理想情况下,信号应该在某个精确时间出现精确的电压值
在理想点轻微的晃动,提前或延后,这类不可避免的随机偏差,称为”抖动“。
抖动的原因:
时钟与供电
电磁与布局
数字与软件侧
模拟前端与阈值
消除抖动:硬件消抖是根本的解决方式
RC消抖电路:

当按键未按下时,电容被充满电后,输出被上拉电阻上拉为1;按键按下后,输出接地,电容放电后稳定为低电平。此时如果因为按键机械结构发生跳变,使得接触点短暂断开,电容会抑制突变,将信号维持在低电平,从而实现消抖。
除RC消抖外,还有一些专用消抖器件。
硬件消抖的缺点:
增加硬件设计的复杂度和成本
硬件中的噪声不可避免时,优化硬件可能无法解决问题
由于硬件的加工、调试会使整个项目周期显著增长
软件消抖:
延时消抖(拉完了)
计数消抖(顶级,通常都有比较好的性能,但是无法检测状态,如按下状态和抬起状态,只能知道有按键事件发生)
滑窗消抖(夯,能够检测按下Press和抬起Release,不过相较计数消抖需要多占用一点空间)
复位电路的用途:
初始化处理器/系统
在系统出现故障或异常时,通过复位使系统回到已知的初始状态
电源电压达到可以正常工作的阈值电压时,集成电路内部开始初始化,使整个芯片在上电后的一段时间内进入已知状态。在完成初始化之前会忽略除复位引脚(例如STM32的BOOT[1:0])之外的任何外部信号。
STM32的内部上电复位:使用可编程电压检测器(PVD),与Vdd的电压比较,如果超出PVD的阈值,触发PVD中断

关于复位:
上电复位
断电复位
欠压复位:电压不足。低于可靠运行所需
欠压检测:对电路进行保护
复位的实现方式:
阻容复位电路
手动复位
看门狗复位
专用复位电路
软件复位
推荐视频:

左边是高电平复位,右边是低电平复位
优点:简单,成本低,大部分时间正常工作
缺点:电源瞬时跌落和恢复的过程中,电容充放电的指数特性导致电容未完成放电时又开始充电,无法产生合格的复位脉冲
改进方法:在电阻位置并联一个二极管,使电容能够快速放电

原本Vcc掉电后放电需要经过
另一种方法:接奇数个反向器
还可以接施密特触发器。
手动RC复位电路,可以简单理解为:人为制造一个Vcc的掉电再上电,在电容两端并联一个按钮,按下后RC电路会跳过电容,此时Vcc直接接地导致掉电,按键抬起后Vcc又重新上电,触发复位。

改进方案:
增加快速放电通路;使用三极管控制等
专用的集成电路,输出复位信号
状态监控电路,检测运行状态,在系统跑飞时重新初始化硬件并加载软件重新执行。
MCU需要周期性向WDT进行喂狗操作,如果隔一段时间(就是一个定时器,当计数溢出时),WDT会认为MCU故障,重启系统。
以软件方式对系统进行复位管理
软复位
PC寄存器更新为软件的入口向量地址
硬件模块、寄存器、I/O接口不会初始化,即硬件内部复位逻辑不产生复位信号
硬复位:软件指令触发芯片的复位脉冲,系统级初始化硬件
RC正弦波振荡电路,LC正弦波振荡电路,RL正弦波振荡电路,石英晶体正弦波振荡电路
这两部分直接不看了,她考我也没办法
为什么要区分AHB与APB:
实现性能与功耗之间的平衡。AHB用于连接高速,高带宽的模块(CPU,FLASH,SRAM等);APB连接低速,低功耗的外设模块(GPIO,UART,IIC等)。
AHB/APB是串口还是并口:
都是并口,属于片上并行总线,用于模块间高速通信。
AHB Lite是什么?
AHB的轻量级版本,AHB支持多主设备,需要复杂的总线仲裁器,AHB Lite省去仲裁逻辑,节省面积与功耗。
总线协议:四周期握手
设备1将查询信号置1
设备号收到信号后,准备接受数据,将应答信号置1
数据发送完毕后,设备2将应答信号置0,表示接受完毕
设备1收到信号后,将查询信号置0

DMA,桥接,随便看看。
ARM中的所有I/O口都是通用I/O,允许用户进行配置
下面是非常重要的一张图:

浮空输入,引脚无内部上拉或下拉电阻,电平完全由外部电路决定。(图中的I/O引脚直接到读出) 易受干扰,通常用于连接外部上拉/下拉器件
上拉输入,在浮空输入的基础上闭合VDD的开关,连接一个内部上拉电阻
下拉输入,在浮空输入的基础上闭合VSS的开关,连接一个内部下拉电阻
模拟输入,引脚直接与内部相连,中间无任何其他模块(功耗最低)
推挽输出,PMOS和NMOS共同构成推挽电路,在写入数据后从推挽电路输出(注意输出控制里应该是有一个反向器的)
开漏输出,只有NMOS工作,在输入为1时输出悬空,在输入为0时接地输出0(内部的上拉电阻不会激活,需要自己在外部接上拉电阻)
复用功能推挽输出,与推挽的区别在于输入来源,推挽输出信息来源于数据寄存器,可以由软件控制GPIO->ODR来操作,复用功能推挽输出的信息来自于片上外设
复用功能开漏输出,类似
通用异步收发UART:(通用 异步 串行 全双工)
通用:数据格式和速率可根据不同应用特征配置
异步:不采用公共时钟同步信号
串行:按位传输
全双工:独立的接受和发送引脚(TX与RX),能够同时收发
USART:在UART的基础上增加了同步功能
同步模式:将TX RX中的一根线设置为时钟来控制时序,一根线作为数据线传数据。
只能以半双工模式工作
接收方不需要知道发送方的波特率,从时钟信号可以获得
以块为单位传数据
这部分实验四已经很熟悉了就不多看了
SPI串行外设接口:
四线制总线:
串行时钟总线SCLK
主机输出/从机输入MOSI
主机输入/从机输出MISO
片选引脚

CAN:(Controller Area Network)控制器局域网
为车用电子设备设计,具备实时性与可靠性。
CAN协议:物理层采用无格式的二进制位流(不想看了,直接过了)
四种通信总线比较:

自学
计算机系统的启动与运行:BIOS(Basic Input Ouput System)
开机启动项,第一个可执行程序
在主板的ROM中
一般使用汇编语言编写
包含如下程序:
自诊断程序(识别硬件配置,自检和初始化)
CMOS设置程序(引导过程中,用特殊热键启动)
系统自检装载程序(引导扇区上的主引导程序MBR装入内存,运行加载操作系统)
主要I/O设备驱动程序和中断服务
通用PC的启动过程:
上电/复位
系统启动(BIOS/BootMonitor——硬件初始化)
阶段1 BootLoader(主引导记录——读取FAT32分区)
阶段2 BootLoader(LiLi,GRUB等——加载分区的.efi文件)
内核镜像(Linux等)
Init(用户空间)
运行
嵌入式系统的启动与运行:
上电复位
引导加载程序 BootLoader
加载操作系统(如果有的话)
操作系统初始化
启动应用程序
MCS-51的启动:
上电复位,PC寄存器的初值为0x0000,指向第一条指令的存储地址
0x0000-0x0002这三个单元放了一条无条件跳转指令,当从该地址执行时直接跳转到主程序的入口地址
STC51的启动过程:
第一阶段 ISP引导区
冷启动检测,芯片内部复位
握手检查,运行ISP检测UART是否有来自PC的STC-ISP下载指令
有指令,进入下载模式,擦除用户flash,写入新代码
无指令,通过跳转将控制权交给用户flash(0x0000)
第二阶段 汇编启动代码 用户flash的0x0000地址,存放的是一条跳转指令,跳去执行一段汇编(STARTUP.51)
初始化堆栈指针(SP)
清零RAM
初始化非零变量
第三阶段 进入main.c
第二阶段完成后,执行LCALL _main(长调用main函数)
程序指针PC指向main函数,开始运行代码
STM32F103的启动:
电压稳定,拉高复位电平
硬件采样BOOT引脚
在复位的第4个时钟周期,锁存BOOT1和BOOT0的电平状态
根据BOOT模式,将相应地址内容映射到0号地址
处理单元硬件取值,读0x0000_0000,取MSP;读0x0000_0004,获取复位中断入口
跳转执行复位中断服务程序
系统初始化
C库环境初始化
运行用户程序
嵌入式系统的启动存在差异,但有一些相同点:
初始跳转到入口地址
执行基本的引导程序初始化资源
(在片内存储中)加载应用并启动执行
BIOS与BootLoader的区别:BIOS是PC平台上用于初始化硬件并加载BootLoader的固件;而BootLoader是真正负责加载操作系统的程序,存在于包括PC、手机、单片机在内的所有计算设备中。
在非PC系统中,只有BootLoader,没有BIOS。
BootLoader:
驻留在嵌入式处理器的片上ROM或者板上FLASH存储区保留分区中的、与具体处理器和硬件特性密切相关的一段可启动代码
具有最小功能要求,即:至少驱动一个外部的数据通信接口,且应该至少提供一种读、写、擦除FLASH的方法
不包括应用系统功能,但具备与外界通信的能力,支持UART,IIC,SPI,CAN等通信接口和协议,同时应该清除系统内存的映射模型
具备校验应用代码并将其移动到内存中的引导执行能力
BootLoader运行模式:
正常启动——启动加载模式,执行硬件资源初始化,内存映射,应用/用户代码启动
交互式启动——进入用户交互页面,由用户对启动参数进行配置与管理
(在引导系统正常启动后,BootLoader不再发挥作用,成为系统中的哑代码)
BSP(Board Support Package)板级支持包
介于嵌入式系统硬件和操作系统之间
具有对硬件、外设的初始化功能,支持EOS(嵌入式操作系统)能够更好的运行与硬件平台
不是独立的执行体
不同的EOS有不同形式的BSP

CMSIS与HAL:

内核(kernel)
OS的核心组件,是一个可以独立运行的软件对象,与操作系统的其他组件协同工作以提供系统级服务
提供任务管理、同步、调度及定时器、中断与异常处理、基本的内存管理等功能
微内核与宏内核:

Linux:宏内核
Windows:混合内核
MacOS:微内核
内核分类:
非抢占式内核(FIFO)
抢占式内核(高优先级抢占处理器资源)
调度策略:
基于优先级的抢占式调度
轮转调度
优先级翻转问题:
低优先级任务持有高优先级任务所需的临界资源,导致高优先级任务被延迟执行。(低优先级任务持有临界资源,此时高优先级任务如果需要这个临界资源,就会被阻塞无法执行;而低优先级任务会被中优先级任务抢占,导致低优先级任务也无法很快执行完毕,长期占有临界资源)

解决优先级翻转的方案:
PIP优先级继承协议:优先级翻转问题发生时(高优先级任务因为没有临界资源被阻塞),让持有临界资源的低优先级任务临时获取被阻塞的高优先级任务的优先级,让其尽快执行完毕释放临界资源,从而使高优先级任务能够得到快速响应。

PCP标准优先级天花板协议:每个资源赋予一个高优先级(所有需要该资源的任务的最高优先级)。
任务在临界资源以外时,以自己的优先级运行;
任务
如果任务
否则,任务
立即优先级天花板协议IPCP:
每个任务有一个静态优先级,每个临界资源有一个静态的优先级天花板;
任务的动态优先级是其静态优先级和所持有的所有临界资源优先级天花板的最大值。


实时性与实时操作系统
计算结果具有时间约束,不论任务什么时候到来,都能在可估计的时间内响应和完成。
实时系统是指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。
实时系统的基本特点:
时间约束性:硬实时,软实时
可预测性
可靠性
外部环境的交互作用
任务的调度特性
可调度,对于一个有截止时限要求的任务,不论何时,只要在施放时间时(后)启动,就能够在截止时限前完成。
可调度性,对于一个调度算法,一组任务总是有可行的调度方案。如果一个系统中的所有任务都是可调度的,就说这个系统是实时的。
调度优化:只要存在,调度算法总是可以找到这个可行的调度序列
错失率:完成执行但超过截止时限的任务所占的比例
丢失率:丢弃的任务所占的比例
失效率:错失率+丢失率
硬实时:截止时限必须被满足。硬实时系统:所有具有截止时限的任务,截止时限都必须被满足(飞行控制,核电站)
软实时:任务的截止时限被错过时,不会引发严重的后果(多媒体应用)
任务调度:任务调度器根据调度算法和策略对就绪队列中的任务进行调度管理
经典调度算法:单调速率调度(RMS){单调截止时限调度DMS},最早截止时限调度(EDF),轮转调度(RR)
RMS
抢占式,静态优先级
被调度任务集S,周期越短的任务,其优先级越高

DMS:
deadline越短的任务,优先级越高。(截止时限越短的任务优先级越高)

EDF:
只看任务的绝对截止时限
