存储器的分类:
存储器首先根据断电后存储的数据是否会丢失,可以分为易失存储器和非易失存储器,易失存储器主要应用于内存,非易失存储器主要用于外存。
易失存储器以RAM随机存储器为代表,随机的含义是存储器中的数据读取或写入所花费的时间与位置无关。根据存储机制RAM可分为DRAM动态随机存储器和SRAM静态随机存储器,DRAM以电容电荷表示数据,电荷会随着时间发生变化,因此需要定期的刷新操作,DRAM又可以根据通讯时是否需要时钟信号分为同步和异步两种,同步SDRAM使用同步时钟通讯速度更快,所以SDRAM使用更加广泛,之后推出的双数据速率同步动态随机存储器DDR SDRAM更进一步提高了SDRAM的通讯速率,DDRIII SDRAM速度得到了进一步的提升。静态SRAM以锁存器存储数据,不需要刷新充电也能保持状态。DRAM结构更简单,生成成本低,存储速度较慢,一般用于外部拓展内存,SRAM结构复杂生产成本高,存储速度快,一般用于CPU内部的高速缓存。
非易失存储器种类较多,半导体类的有ROM和FLASH,其他有光盘、机械硬盘等。
只读存储器ROM随着技术的发展,也可以写入数据。mask ROM在出厂时使用特殊的工艺固化内部数据,一旦出厂数据就不可修改,主要优势是大批量生产时成本低。OTPROM是一次性可编程存储器,可以使用专用的编程器将自己的资料写入,但只能写入一次,写入后不能修改。EPROM是可重复擦写存储器,可使用专用设备通过紫外线照射芯片内部擦写数据,现已被淘汰、EEPROM是电可擦写存储器,不需要外部设备就能按字节重复擦除和写入数据,EEPROM成为了ROM的主流。EEPROM主要存储一些配置信息,以便重新上电时候加载配置数据。
FLASH称为闪存,容量比EEPROM大得多,多个字节组成一个扇区,最小擦除单位是一个扇区,在写入数据前都需要进行擦除操作,根据电路不同,FLASH可分为NOR FLASH和NAND FLASH,NOR FLASH的地址数据线分开,NOR FLASH可以按照字节读取数据,可以直接存储代码指令,NAND FLASH数据线和地址线共用,只能以扇区为单位读数据,无法之间直线代码指令,需要相机指令从NAND FLASH加载到RAM上,再由CPU执行。NOR FLSAH一般应用于代码存储场合例如嵌入式控制器内部的程序存储空间,NAND FLASH一般应用于大数据量存储场合,例如SD卡U盘固态硬盘等。
I2C
多主机模式?
I2C是一个支持多设备的总线,支持多个主机和多个从机。主机是拥有总线控制权力的设备,从机是被允许后才能控制总线的设备。I2C一共只能使用两根线,双向串行总线SDA和串行时钟线,两根线通过上拉电阻拉高至高电平,总线上的设备使用开漏输出的模式,设备空闲地时候会输出高阻态,因此总线是高电平,当总线上的一个设备输出低电平的时候会将总线拉低至低电平。这么做的目的是为了避免数据传输过程中两个设备输出没有协调导致的短路问题
当前地址写
S是由主机产生的开始信号,然后发送一条7位的从机地址和一个读写位,对应地址的从机接收到数据后向主机发生一个应答位,表示收到了数据,当主机向从机写数据时,主机发送一条数据,从机接收的数据后从机发送一个应答,收到应答后主机接着发送下一条数据,表示需要在从机写入的地址,收到应答后主机发送需要写入的数据,结束通讯时由主机发送一条停止位。
当前地址读
当主机向从机读数据时,由主机产生的开始信号,然后发送一条7位的从机地址和一个读写位,对应地址的从机接收到数据后向主机发生一个应答位,表示收到了数据,主机释放SDA控制权开始接受数据,然后从机发送当前地址指针指向的数据,主机接收到之后发送一位应答,从机接收应答信号后发下一条数据,当主机希望停止接收数据时,就向从机发送一个非应答信号,然后发送一个停止位。
每个设备都将寄存器地址映射到一个线性区域中,并由当前地址指针指向当前读取的数据,主机每读取一个寄存器的数据,当前地址指针就递增。
指定地址读
指定地址读可以读取指定设备的指定地址的数据,首先向指定设备的当前指针寄存器写入需要读取的地址,然后再读取指定设备的数据。
首先主机发送起始位,然后发送从机地址和写标志位,接收到应答后发送写入地址,使从机的当前地址指针指向指定的地址,主机接收应答后重新发送一个起始位,然后发送从机地址和读标志位,从机应答后主机放弃SDA控制器读取数据,最后由主机发送非应答,并发送停止信号结束传输。
时钟线高电平时表示数据线此时的数据有效,不允许数据线在此时发生电平变化,由接收方读取数据,时钟线在低电平的时候,数据线数据无效,允许数据线电平变化,当时钟线是高电平时数据线由高电平转换到低电平的时候,表示起始信号,数据线由低电平转换到高电平的时候,表示停止信号。无论主从机,当接收方接收到数据后,若接收方希望对方继续发送数据,就需要向对方发送一个高电平应答信号,发送方才会发送下一个数据,若接收方希望对方停止发送数据,则需要向对方发生一个低电平非应答信号,发送方接受到该信号后产生一个停止信号,结束信号传输。
每个设备都有自己的地址,其中高四位是由厂商确定的,低三位可由引脚电平进行配置,保证每个地址的唯一性。
可以通过直接控制STM32的GPIO引脚根据I2C协议进行传输数据,这种方式称为软件模拟协议方式。STM32中包含专门复杂I2C通讯的外设,只需要配置好该外设,即可根据协议要求产生通讯信号,完成数据收发
接收时序图?
SPI通讯
SPI是一种全双工的通讯总线,广泛应用于ADC、LCD等通讯速率要求较高的设备。
SPI设备使用三条总线和片选线进行通信,总线分别是SCK、MOSI、MISO。SPI通讯中设备没有地址,而是通过片选线进行寻址,将对应设备的片选线拉低,从而使该设备被选中。SCK时钟线的时钟信号由主机产生,决定了通讯的速率,MOSI主机向从机发送数据,信号由主机产生,MISO由从机向主机发送数据,信号由从机产生。
起始信号指的是片选线拉低,片选线拉高后表示结束信号。SCK的上升沿允许MOSI和MISO改变数据,SCK下降沿表示MOSI和MISO数据有效,此时数据被采样,
SPI一共有四种通讯模式,时钟极性CPOL是指SPI通讯设备空闲时SCK的电平信号,CPOL=0时SCK空闲为低电平,CPOL=1时SCK空闲为高电平。CPHA是指数据采样时刻,CPHA=0时SCK奇数边沿采样数据,CPHA=1时SCK偶数边沿采样数据。
把要发送的数据写入到数据寄存器DR中,由移位寄存器将数据一位一位地发送出去,发送完一帧后数据寄存区DR为空,TXE标志位会被置1,此时可以再向发生缓冲区里写数据,当接收完一帧数据后接收缓冲区满,RXNE标志位被置1,此时可以在接收缓冲区里读数据。如果是能了TXE或RXNE中断,TXE或RXNE置1时会产生SPI中断信号,进入同一个中断函数,可以通过检查寄存器位来判断是哪个事件,再分别进行处理。
I2S
声音是一种模拟信号,首先根据编码器将模拟量转换为数字量保存,在需要还原声音的地方将数字量转换成模拟量输出。
AD的过程可以分为三步,分别是采样、量化和编码,首先使用比声音频率高的采样信号对声音信号进行采样,在每个采样点量化声音信号的大小,最后通过编码的方式将数据保存。采样频率越高,量化位数越高,AD转换的精度就越高。
数字编译码器WM8978内部集成了DAC和ADC,可实现声音模拟信号和数字量音频数据转换的功能,可以通接收其他设备传输的音频数据,转换为模拟信号再传输至扬声器,也可以接收声音模拟信号,将其转换至数字信号传输至其他设备。数字编译码器是通过I2S与其他设备通信的。
I2S是专门传输音频信号的总线协议,可以实现数据的半双工传输,I2S主要有3个主要信号,分别是SD串行数据线,用于发送或接受两个时分复用的数据通道上的数据,WS字段选择线和CK串行时钟线,表示表示当前传输数据的通道,0代表左通道的数据,1代表右通道的数据,CK为时钟线,每一位脉冲用于对应数字音频信号的一位数据,它的频率等于采样频率X量化位数X通道数,CK下降沿改变SD电平,CK上升沿读取SD电平。
I2S分为左对齐、右对齐和Philips标准。Philips标准中,数据在WS改变电平后的第一个位之后有效,数据之后的位强行清零,左对齐标准中,WS翻转后同时开始传输数据,右对齐同理。
ADC
ADC模拟数字转换器,可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。有18个输入通道,分为16个外部通道,直接通过GPIO输入模拟电压,还有2个内部通道,输入内部温度传感器和内部参考电压。
INT0至INT7是输入通道,由通道选择开关选择其中一路,通过设置ADDA、ADDB、ADDC的高低电平确定输入通道号,然后通过ALE时地址锁存译码控制通道选择开关。逐次逼近寄存器SAR通过DAC和比较强与输入模拟电压进行比较,通过二分法逼近输入的模拟电压,从而完成AD转换,将获得的8位数字信号输出至D0值D7引脚,定时和控制获取时钟信号和开始信号,并输出结束信号,VREF+和VREF-输入参考电压。
ADC有规则组和注入组两种方式,规则组最多可以选择16位通道,但是对应的数据寄存器只有一个,需要配合DMA使用,注入组最多选择4位通道,可以完全存储在AD数据寄存器。模拟看门狗用于检测AD转换的范围,如果超出范围会发生中断信号。
转换模式可以根据是否连续转换和扫描模式分为四种方式。连续转换会同时对多个通道进行转换,开启扫描模式会循环转换指定的通道。
左对齐低位空出的补零,右对齐高位空出的补零
音频
参考文章:
TDM总线协议
DMA
DMA直接存储器存取,无需CPU干预,可完成外设、存储器之间的高速数据传输,
每个通道支持软件触发和特定硬件触发,软件触发多应用于存储器到存储器之间的数据转运,硬件触发多应用于存储器到外设之间的触发方式。
寄存器是连接软件和硬件的桥梁,寄存器的每一位都连接一根导线,控制相应电路的高低电平、开关通断、选择器选择等,或者可以作为计数器使用。
把小的数据传输到大的数据,高位补零,把大的数据传输到小的数据,高位就会舍弃。
每完成一个通道的AD转换,数据就会保存在ADC_DR中,然后由DMA及时将ADC_DR中的数据转移至相应的存储器
汽车域控制器
ECU负责控制汽车中的各种电子元器件,例如车灯、仪表、中控、发动机等等,随着车辆中的电子器件的增多,ECU的数量也随之增长,导致线束成本增加,系统复杂,为了解决ECU数量增多带来的问题,多个ECU被集成在了一个域控制器中,可以按照功能分为动力域、车身域、底盘域、座舱域、智能驾驶域等等,对于ABS等安全系数要求高的设备来说,处于安全的考虑,目前还是以单ECU控制为主。
为满足安全和性能的双重需求,目前主流的ADAS控制器解决方案大多采用微控制器MCU和异构微处理器SOC组合。
嵌入式设备启动过程
芯片的ROM中保存了最基础的代码,系统上电后,reset引脚接收到电平跳变,对于C51单片机来说,由硬件电路将代码段寄存器CS和指令指针寄存器IP进行复位,组成一个20位的地址,指向ROM中存放第一条代码的位置,对于ARM架构的MCU来说,上电或复位后,PC指针寄存器复位为零地址,然后由中断向量表获取下一步的跳转地址,从而可以执行更复杂的代码,执行硬件自检、基本初始化、输入输出支持等操作,以及将操作系统从外部FLASH转移至内部RAM中。
Boot ROM就是负责系统上电后启动软件的软件,通常是存放在EEPROM或者NOR FLASH中,没有权限修改Boot ROM程序,但是可以通过配置芯片的外部启动引脚配置Boot ROM程序,选择芯片的启动方式,例如通过拨码开关配置启动配置引脚的高低电平,每次复位后BootROM会存储启动配置引脚的电平组合。
BootROM用于启动固定的程序,功能无法定制,因此可以使用BootLoader程序对系统进行二次引导,用于加载OS、程序刷新等功能,例如智驾控制器在启动时需要提供统一诊断服务UDS的CAN诊断和CAN刷新服务,因此需要在BootLoader中完成这些操作。
MCU使用单核或多核重构的处理器,多基于Context-M、Cortex-R、TRICORE。C28内核主频小于1GHZ,没有MMU内存管理单元,最多只能运行实时操作系统,程序运行的介质大多是NOR FLASH,因为NOR FLASH与RAM一样用有分离的地址线和数据线,可以以字节长度精确寻址,所以程序可以直接在NOR FLASH中运行,不需要转移至RAM中运行。
运行Linux操作系统的SOC一般将操作系统、文件系统、应用程序存放在NAND FLASH中,代码在运行前需要将代码从NAND FLASH搬运至SRAM中,所以BootROM的任务就是将代码从NAND FLASH搬运至RAM中,SOC的BootLoader可以分为SPL(secondary Program Loader)和uboot,首先将SPL搬运至内部SRAM,初始化空间更大的外部DRAM,然后将uboot搬运至外部DRAM,uboot根据系统变量将OS内核搬运至外部RAM中,OS内核再完成根文件系统的加载等功能。
芯片启动大致可以分为三个步骤,首先是芯片出厂自带的BootROM,用于硬件的自检和部分初始化,并加载BootLoader,然后是用户写的BootLoader,通过访问外部RAM、NAND FLASH,完成用户自定义的初始化工作,最后就是应用程序,例如Linux操作系统等。