-
A、开始;B、PIEIFRx.y = 1 ?是,转到C,否则等待;C、PIEIERx.y = 1 ?是,转到D,否则等待;D、PIEACKx = 0 ?是,转到E,否则等待;E、中断请求发送到CPU;F、IFRx位置1;G、IERx = 1 ?是,转到H,否则等待;H、INTM = 0 ?是,转到I,否则等待;I、CPU响应,进入中断服务子程序前,DSP硬件自动将IFRx清0,然后将CPU内一些关键寄存器如:ST0、ST1及IER等的内容压到堆栈保存起来,随后硬件自动将IERx清0,INTM置1,以避免中断嵌套,在中断服务子程序执行完返回后,这些保存的内容会自动从堆栈中弹出,将原寄存器的内容恢复。因此ISR中不需要再进行INTM清0和IER置1操作,但必须注意的是:在ISR中执行完中断响应任务之后,返回前,必须将外设寄存器中的中断标志软件清0,这样外设中断才能再次产生;J、从PIE处取中断矢量,PIEIFRx.y被清除,CPU转到ISR执行。这里从PIE中断向量表中可以取到中断服务子程序的地址,它是一个32位的矢量,中断矢量被取出后,PIE模块中的中断标志PIEIFRx.y被自动清0,但该中断x对应的PIE应答位PIEACKx在中断服务子程序ISR中必须软件清0(写1清0),这样才能接受下一个外围中断。K、中断返回。 func :中断服务函数入口;XINT3 CPU响应中断,就是CPU要去执行相应的中断服务程序,其响应过程是CPU将现在执行程序的指令地址压入堆栈,跳转到中断服务程序入口地址,中断服务程序的入口地址就是中断向量,这个中断向量用2个16位寄存器存放。入口地址是22位的,地址的低16位保存在该向量的低16位,地址的高16位则保存在它的高6位,更高的10位保留。 上图为外设复用中断向CPU申请中断的流程。步骤一:任何一个PIE中断组的外设或外部中断产生中断。如果外设模块内的中断被使能,中断请求将被送到PIE模块。步骤二:PIE模块将识别出别的PIE中断组x内的y中断(INTx.y)申请,然后相应的PIE中断标志位被锁存:PIEIFRx.y=1。步骤三:PIE的中断如要送到CPU需满足下面两个条件:1.相应的使能位必须被设置(PIEIERx.y=1)。2.相应的PIEACKx位必须被清除。步骤四:如果满足步骤三中的两个条件,中断请求将被送到CPU并且相应的响应寄存器位被置1(PIEACKx=1)。PIEACKx位将保持不变,除非为了使本组中的其他中断向CPU发出申请而清除该位。步骤五:CPU中断标志位被置位(CPUIFRx=1),表明产生一个CPU级的挂起中断。步骤六:如果CPU中断被使能(CPUIERx=1,或DBGIERx=1),并且全局中断使能(INTM=0),CPU将处理中断INTx。步骤七:CPU识别到中断并且自动保存相关的中断信息,清除使能寄存器(IER)位,设置INTM,清除EALLOW。CPU完成这些任务准备执行中断服务程序。步骤八:CPU从PIE中获取响应的中断向量。步骤九:对于复用中断,PIE模块用PIEIERx和PIEIFRx寄存器中的值确定响应中断的向量地址。有以下两种情况:1.在步骤四中若有更高优先级的中断产生,并使能了PIEIERx寄存器,且PIEIFRx的相应位处于挂起状态,则首先响应优先级更高的中断。2.如果在本组内没有挂起的中断被使能,PIE将响应组内优先级最高的中断,调转地址使用INTx.1。这种操作相当于处理器的TRAP或INT指令。CPU进入中断服务程序后,将清除PIEIFRx.y位。需要说明的是,PIEIERx寄存器用来确定中断向量,在清除PIEIERx寄存器时必须注意。
-
所谓TVS瞬态抑制二极管是干什么的呢?TVS二极管,是一种在稳压管工艺基础上发展起来的新型高效电路保护元器件,凭借自身独特的亮点(PS级响应速度、高瞬态功率、箝位电压易控制、击穿电压偏差小、低漏电流、高可靠性、小体积、低电容等特点)在电路保护元器件领域独树一帜,脱颖而出。不可否认,TVS二极管的叫法五花八门,不同的人叫法都不一样。为此,关键问题了,采购商们是根据什么规律来叫的呢?关于TVS二极管的分类,您知道多少? 贴片TVS管和直插TVS管TVS管按照封装和内部结构,可分为:贴片TVS管、轴向引线TVS管、双列直插TVS管阵列。贴片瞬态抑制二极管系列有:SMF系列、TPSMF系列、SMF4L系列、SMAJ系列、P4SMA系列、TPSMAJ系列、SMBJ系列、P6SMB系列、SMA6J系列、TPSMBJ系列、SMB10J系列、1.5SMC系列、SMCJ系列、TPSMCJ系列、SMDJ系列、TPSMDJ系列、SM5S系列、SM6S系列、SM8S系列、SM8T系列、5.0SMDJ系列、TP5.0SMDJ系列、SACB系列(低电容TVS管)等等;直插TVS管系列有:P4KE系列、SA系列、P6KE系列、1.5KE系列、3KP系列、5KP系列、LDP系列、15KP系列、30KP系列、SAC等等。不难看出,TVS管种类繁多,不同的电路防护解决设计方案,对应不同系列的TVS管产品。双向TVS管和单向TVS管TVS管按照极性,可分为:双向TVS管和单向TVS管。单向TVS管的功能特性与稳压二极管类似;而双向TVS管的功能特性相当于2个稳压二极管反向串联的功能。一旦电路防护确定是防止过高电压和瞬态浪涌,相信很多采购商都会要求FAE现场工程师优先测试TVS管是否能够满足电路保护的防护需求。一般而言,直流电路中选用单向TVS管,交流电路选用双向TVS管,多路保护电路选用TVS管阵列。那么,如何快速地区分瞬态抑制二极管的单双向呢?1)看型号:尽管不同品牌,其型号命名方式不一样,但还是有规律的。以品牌东沃(DOWO)供应的TVS二极管SM8S33A和SM8S33CA为例,可见,型号尾部字母A代表单向,CA代表双向。2)看规格书:一般在第一页就有描述,双向为双向导通,单向为单向导通;3)万用表测试:单向一边通,双向两边都有电压; 大功率TVS管和小功率TVS管TVS管按照功率大小,可分为:大功率TVS管和小功率TVS管,这两者都用途上有很大的差别。大功率瞬态抑制二极管结电容可以达到上百pF,响应速度在1ns以下,具有很大的散热片,主要用在电源馈线上;而小功率TVS二极管,结电容在0.3pF以下,ps级响应速度,主要集中应用在高密度场合。目前,业内普遍把3000W以上的TVS定义为大功率TVS管。汽车级TVS二极管SM8S系列,峰值脉冲功率6600W,属于大功率TVS二极管。专用型TVS管和通用型TVS管TVS管按照用途,可分为:通用型TVS管和专用型TVS管。SM8S系列瞬态抑制二极管,属于汽车级TVS管,主要运用在汽车电子产品方面,为汽车电子的安全保驾护航。……当然还有更多其他的分类方式,高压TVS管、低压TVS管(工作电压在200V以上的是高压TVS,200V以下的是低压TVS)、根据封装形式划分等等,这么理一理,迷茫之中的您,是不是瞬间明白了?如果还不明白,可随时关注或咨询我们!
-
我们今天一起从声波的原理去学习一下这类滤波器。电磁波对于射频人来说,这个再熟悉不过了。我们也不再去赘述。我们先来学习一下声波。在百度百科上对声波的定义是:发声体振动在空气或者其他介质中传播产生的波叫做声波。声波与电磁波在产生机理上就完全不同,声波是一个物体振动产生的,这个物体可以是一个分子、原子,也可以是一个舌头,同样也可以是一个核爆。但是电磁波是由同相且互相垂直的电场与磁场在空间中衍生发射的震荡粒子波,是以波动的形式传播的电磁场,具有波粒二象性。电磁波是电场和磁场交换能量产生的,是以波的形式传播的电磁场。声波的传播需要依赖空气或者其他介质,在真空中是不能传播的,而电磁波可以在真空中传播。声波需要借助各种介质进行向四面八方传播,声波所到之处的质点沿着传播方向在平衡位置附近振动,声波的传播实质上是能量在介质中的传递。这种由物体振动产生的波叫做机械波。像水波,地震波等都属于机械波。那么声波一定是人能听到的波吗?No,人能听到的声波的频率处于20Hz至20kHz之间。记得曾经有个视频可以测试人能听到的声波频率。我们大家都知道**能听到声音是因为声音的传播引起了鼓膜的振动,鼓膜带动听小骨们传动,听小骨传动卵圆窗膜,振动内耳淋巴液,引起内耳基底膜细胞产生电位变化,电位变化传递到听神经,听神经输送信号到大脑中的听觉中枢,大脑"听"到声音。(这个过程和SAW滤波器还蛮像的,我们后面在讲)有很多频率不在这个范围内的声波,人类是无法听到的,但是有些动物是可以的。下表给出了一个对比图,在声音方面,相对于猫猫狗狗们,我们还是挺落后的(这样也好,让我们能睡个好觉)。 于是,在定义声波的时候,我们把低于我们人类能听到的声波叫做次声波,而把频率高于人类能听到的声波叫做超声波。谁让我们是世界的主人翁呢,这个猫猫狗狗都得听我们的。 这个时候就引出了超声波,通常频率在20kHz到1GHz我们都知道,蝙蝠就是靠这个超声波去看东西的。还好我们听不见,要不晚上也不得安宁。而且蝙蝠的超声波也是嘴来发出的,可见这个发声体的振动还是蛮厉害的。 比超声波频率更高的是特超声/微波超声, 频率大于1GHz。我们声表滤波器这个声肯定是特超声了,要不然工作起来,人受得了,蝙蝠也受不了啊。既然是波,那么声波也具有波的物理参数:频率,振幅,相位和波长。我们在描述的时候也可以用正弦波来表示。这里不再详述。 声波的常用属性包括:音调,速度和音量。音调就是声音的频率,频率不同,音调也不同。就像五线谱中的那一个个小蝌蚪就表示了不同的音调。 声波的传播速度和介质有关,我们都熟悉的340m/s 就是声音在空气中传播的速度。用这个速度值,我们可以毛估估闪电距离我们的距离:L=340*(雷声时间-闪电时间)。小猪佩奇的爸爸经常这么做。但是也只是毛估估,当空气中水含量不同时,这个数值会有所变化。现在已经测得空气中常温常压下声波速度是344m/s,淡水中为1430m/s,海水中1500m/s,钢铁中5800m/s,铝中6400m/s,石英玻璃中5370m/s,而在橡胶中仅为30-50m/s。当温度和压力变化,声速也随着改变。通常所指的常温是指20℃时的气温,当气温降到零度,声波在空气中传播的速度则将为331.5m/s,而气温每升高1℃,声速就增加0.607m/s。我猜这也可能和空气的密度相关吧。爱咋咋地,反正我们也不去做空气声波滤波器。请记住上面石英玻璃中的那个传播数值:5370m/s。 在SAW滤波器中常用的材料特性如下: 音量就是声音的大小,这个和声源振动的强弱有关。大嗓门的人声带振动幅度就大。音量的大小通常以分贝为单位来衡量。人耳刚能听见的声强是0分贝,普通谈话的声强是60-70分贝,凿岩机、球磨机的声强为120分贝,而使人耳产生疼痛感觉的声强是120分贝。所以要保持安静,以免被认为是噪音。我们简单了解过声波之后,我们今天简单熟悉一下SAW是如何工作的?下图是一个最简单的SAW滤波器示意图。SAW滤波器的基板是压电陶瓷,压电陶瓷是一种能将机械能和电能互相转化的功能陶瓷材料,这种转化就叫做压电效应。当电信号传输到IDT换能器上时,通过压电效应,电信号转化为声波信号,在SAW滤波器内部,SAW滤波器通过声波的选择性进行信号处理,然后通过IDT2,将声波信号转换为电信号。 换能器产生双向横向滤波器。这是因为频率波在-X和+ X方向上均等地产生。输出换能器产生的波仅是全波的1/2。因此,如果从输出波中观察到3dB的损耗,则意味着来自输入和输出换能器的总信号的插入损耗为6dB。每个换能器均由连接到两个母线的周期性叉指式电极组成,两个母线连接到电源(或负载)。振幅将由电极长度决定,相位由电极位置决定。电极的波长决定了SAW滤波器的工作频率。
-
点阵 LED 显示屏作为一种现代电子媒体,具有灵活的显示面积(可任意分割和拼装)、高亮度、长寿命、数字化、实时性等特点,应用非常广泛。一个数码管是 8 个 LED 组成,同理,一个 8*8 的点阵就是由 64 个 LED 小灯组成。上图就是一个点阵 LED 最 小单元,即一个 8*8 的点阵 LED,下图是它的内部结构原理图。从图中可以看出,其实点阵 LED 点亮原理还是很简单的。在图中大方框外侧的就是 点阵 LED 的引脚号,左侧的 8 个引脚是接的内部 LED 的阳极,上侧的 8 个引脚接的是内部 LED 的阴极。那么如果我们把 9 脚置成高电平、13 脚置成低电平的话,左上角的那个 LED 小灯就会亮了。下面我们就用程序来实现一下,特别注意,控制点阵左侧引脚的 74HC138 是原理图上的 U4,8 个引脚自上而下依次由 U4 的 Y0~Y7 输出来控制。#include <reg52.h> sbit LED = P0^0 ; sbit ADDRO = P1^0; sbit ADDR1 = P1^1; sbit ADDR2= P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main () { ENLED = 0; //U3、U4两片74HC138总使能ADDR3 = 0;//使能U4使之正常输出 ADDR2 = 0; //经U4的Y0输出开启三极管o10ADDR1 = 0; ADDR0 = 0;LED = 0; //向P0.0写入0来点亮左上角的一个点 while(1); //程序停止在这里 )那么同样的方法,通过对 P0 的整体赋值我们可以一次点亮点阵的一行,那么这次我们用程序来点亮点阵的第二行,对应的就需要编号 U4 的 74HC138 在其 Y1 引脚输出低电平了。#include <reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2= P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main ( ) { ENLED =0; //u3、U4两片74HC138总使能ADDR3 = 0;//使能U4使之正常输出 ADDR2 = 0; //经U4的Y1输出开启三极管o11 ADDR1 = 0; ADDR0 = 1;P0 = 0x00; //向P0写入0来点亮一行 while (l) ; //程序停止在这里 }从这里我们可以逐步发现点阵的控制原理了。前面讲了一个数码管就是 8 个 LED 小灯,一个点阵是 64 个 LED 小灯。同样的道理,我们还可以把一个点阵理解成是 8 个数码管。 经过前面的学习已经掌握了 6 个数码管同时显示的方法,那 8 个数码管也应该轻轻松松了。 下面我们就利用定时器中断和数码管动态显示的原理来把这个点阵全部点亮。#include <reg52.h> sbit ADDRO = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 =P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main () { EA= 1; //使能总中断 ENLED =o; //使能U4,选择LED点阵 ADDR3 = 0; //因为需要动态改变ADDRO-2的值,所以不需要再初始化了TMOD = Ox0l;//设置T0为模式1 THO=0xFC; //为TO赋初值OxFC67,定时1msTLO= 0x67; ETO = l; //使能TO中断 TRO= l; //启动T0 while (1); //程序停在这里,等待定时器中断 } /*定时器О中断服务函数*/ void InterruptTimer0 () interrupt 1 { static unsigned char i = 0; //动态扫描的索引 THO = 0xFC; //重新加载初值 TL0 = 0x67; //以下代码完成LED点阵动态扫描刷新 PO = 0xFF; //显示消隐 switch (i) { case 0: ADDR2=0;ADDR1=0; ADDRO=0; i++;PO=Ox00; break; case 1: ADDR2=O; ADDR1=0; ADDRO=1; i++;PO=Ox00; break; case 2: ADDR2=0;ADDR1=1; ADDRO=0; i++;PO=Ox00; break; case 3: ADDR2=O; ADDR1=1; ADDRO=1; i++;PO=Ox00; break; case 4: ADDR2=1; ADDR1=0; ADDRO=0; i++;PO=Ox00; break; case 5: ADDR2=1; ADDR1=0; ADDRO=1; i++;PO=Ox00; break; case 6: ADDR2=1; ADDR1=1;ADDRO=0; i++; PO=Ox00; break; case 7: ADDR2=1; ADDR1=1;ADDRO=1; i=0; PO=Ox00;break; default: break; } }
-
我们**能够感应到周围的环境状态,主要是因为我们有各种感觉器官单片机想要获取周围的环境状态,就要依靠各类传感器1.1 ADC/DAC有些同学看到ADC可能DNA动了一下,但是这个ADC可不是游戏中的ADC在单片机当中通常存在模拟外设ADC(模数转换器,Analog to Digital Converter)和 DAC(数模转换器,Digital to Analog Converter)来进行模拟信号和数字信号之间的转换。一个ADC接口通常可以作为输入接口将外界的模拟信号转换为数字信号在单片机内进行使用,例如接口的额定电压为3.3v,则该接口可接受的电压范围为0~3.3V。若此ADC为2bit,则可以表示4个不同的电压等级。一个DAC接口与ADC接口的作用相反,可以将单片机内的数字信号输出为一个模拟信号来进行使用,若不使用DAC对电压进行分级,接口只能表示低电平或高电平。1.2传感技术传感技术同计算机技术与通信一起被称为信息技术的三大支柱。从物联网角度看,传感技术是衡量一个国家信息化程度的重要标志。传感技术就是传感器技术,可以感知周围环境或者特殊物质,比如气体感知、光线感知、温湿度感知、**感知等等,把模拟信号转化成数字信号,给中央处理器处理。最终结果形成气体浓度参数、光线强度参数、范围内是否有人、温度湿度数据等等。我们常用的声控灯,就是通过检测周围声音变化来控制亮灭(部分也会加入光敏传感器,实现黑夜才亮)
-
单片机主要分为四部分:CPU、存储器、输入输出接口、系统总线1.CPU处理器(Processor,CPU ),处理器在微控制器当中用来控制整个系统,它串行地读取并解码程序指令,执行需要处理器的任务并且为其余部分任务生成控制信号。它执行所有算术和逻辑运算,并且具有相同处理器的微控制器可以执行相同的程序。2.存储器存储器( Memory ),存储系统包含存储器和地址解码电路。通常存储器被分为两类:随机存储器(RAM)、只读存储器(ROM)RAM: Random Access Memory,用来存储运行在程序当中的数据(如:运算结果等),掉电后数据消失ROM: Read Only Memory,用来存储需要被微控制器执行的程序,掉电后数据不消失。3.输入输出接口(I/O)连接外接设备和微控制器的接口,通常可以是数字I/O,模拟I/O,串口等。类似计算机的USB接口。模拟数据(Analog Data)是由传感器采集得到的连续变化的值,例如温度、压力,以及目前在电话、无线电和电视广播中的声音和图像。数字数据(Digital Data)则是模拟数据经量化后得到的离散的值,例如在计算机中用二进制代码表示的字符、图形、音频与视频数据。4.总线(BUS)总线如同城市的主干道一样,可以连接单片机的各个部分,并进行数据的通信,通常情况下微控制器中的总线可以被分为三类:数据总线、地址总线和控制总线数据总线:用于在处理器、存储器和/o之间传递数据的双向总线。地址总线∶用于选择处理器需要读取/写入到特定存储器位置的总线。地址总线的数据流动方向是单向的,从处理器到内存和I/O。控制总线∶由许多单独的控制/信令线路组成。典型的信号包括读/写线路,用于随数据总线指示数据行进的方向。
-
## 一. 认识关机模式 进入关机模式之后,唤醒 MCU 程序不是从进入低功耗模式之后的下一行代码开始执行,而是重新启动了。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/27/203117c2a4xhdhdj6swowz.png) 通过上图可以得出结论: 所有电压调节器都被关闭了 - 关机模式下 CPU 是停止状态 - 关机模式下 FLASH 已经断电 - 关机模式下 SRAM 全部断电 - 时钟只可以使用 LSE - 外设只有 RTC 可以用了, IO可以配置成 浮空,上拉,下拉 - 唤醒的方式,只有复位和 RTC, 根据电压调节器的选择不同,以及是否开启RTC 功耗略有区别 唤醒时间 262 us ## 二. 停机模式的进入 在停机模式下,唤醒之后 MCU 会复位,代码从头开始执行。 SRAM1 SRAM2 的数据丢失,但是备份寄存器数据可以保留。 进入停机模式的 API :void HAL_PWREx_EnterSHUTDOWNMode(void) ## 三. 待机模式的进入代码 进入待机模式的代码实现 ```c int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); HAL_Delay(500); // 上电之后延时一会再进入睡眠模式,这样可以保证复位之后可以立即下载程序 HAL_PWREx_EnterSHUTDOWNMode();//进入停机模式 while (1) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13); HAL_Delay(500); } } ``` ## 四. 总结 - 进入停机模式是 MCU 停止 - 停机模式唤醒后,唤醒之后 MCU 就复位了 - 待机模式的唤醒,只能依赖 RTC和 复位 - 可用外设非常有限,只有 RTC和 复位引脚 ———————————————— 本文为CSDN博主「whj123999」的原创文章 原文链接:https://blog.csdn.net/whj123999/article/details/115427657
-
在STM32WLE5JC单片机中SPI数据长度设置了8位,并且相应的接收FIFO也设成了8位,但最后收发数据是却是16位1.传输过程中的SPI-CR2寄存器如下:从图中可以看出CR2为0x1708,FIFO的阈值设置的是8位,但是DR的数据长度却是16位:0x01302.STM32WL中的CR2寄存器描述如下:
-
数据处理技术SISD——指令部件只对一条指令处理,只控制一个操作部件操作.SIMD——由单一指令部件同时控制多个重复设置的处理单元,执行同一指令下不同·数据的操作。SIMD(Single Instruction Multi Data)是一种单指令处理多数据流的并行处理技术,能够在批量数据操作时进行向量化运算加速,具有较高的执行效率,在多媒体处理、矩阵运算等场景都有广泛的应用。SIMD在ARM8中叫做NEON,在x86架构中叫MMX\SSEx和AVXxSIMD的高效率在于一条指令可以完成多个数据的运算。SISD和SIMD执行过程对比:如图所示,如果要执行1+2、3+4、5+6、7+8,每次将数据调入寄存器中单独各需要一条指令,例如执行1+2时,首先将1放入寄存器、再将2放入寄存器、然后执行ADD、最后将结果3str到内存中,每一个运算都需要将以上过程执行一遍。如果使用SIMD,第一条指令就会将1、3、5和7放入向量寄存器,第二条指令将2、4、6和8放入第二个寄存器,第三条质量统一执行ADD,最后将结果统一导出。对比可以看出,SIMD的效率比SISD高出很多。一、NEON简介ARM高级SIMD指令称为NEON。NEON指令支持AArch32和AArch64。AArch32运行模式下的NEON相当于ARMv7中的NEON。Vector:向量。由多个计算源组成,计算源的数量和大小取决于向量寄存器Lane:用来存放计算源的地方Element:被执行计算的数据。neon寄存器组包含32个64位的寄存器和32个128位的寄存器。一个寄存器相当于一个向量,被指令操作的数据为NEON的元素,存放元素的地方被称为Laneo向量中Lane的数量取决于寄存器大小和Lane中element的大小。例如使用一个128位的寄存器存放32位的数据时,Lane的数量为4。因此,128位的向量寄存器可以被划分为2个64为的lane、4个32位的lane、8个16位的lane及16个8位的lane。同理,64位的向量寄存器可以被划分为1个64为的lane、2个32位的lane、4个16位的lane及8个8位的lane。向量计算中的元素可以是浮点类型的标量,也可以是整数类型的标量,标量是一个值,向量是一组值二、NEON语法指令格式发生了较大变化,{}表示可选prefix有S/U/F/P,分别代表signed/unsigned/fload/bool数据类型op是操作指令,例如ADD,AND有P(pairwise,例如ADDP), V(the new reduction operations,例如FMAXV),2(new widening/narrowing "second part"指令,例如ADDHN2,SADDL2)。其中ADDHN2表示将两个128bit向量相加,产生一个64位的向量结果(存放在NEON寄存器的高64位),SADDL2将两个NEON寄存器的高64位相加,产生一个128位的向量结果。vd, Vn, Vm表示128位的NEON寄存器,T是数据类型,8B/16B/4H/8H/2S/4S/2D.B代表byte (8-bit).H代表 half-word (16-bit).S代表word (32-bit). D代表double-word (64-bit)
-
A64基本指令的类型数据处理指令内存访问指令流程控制指令系统控制指令一、数据处理指令数据处理指令例子:ADD wo, w5,#27 // wo = w5+ 27MoV xo,X1 //将X1中的复制到XO中ADD wo, w1,W2,LSL #3 // wo = W1 + (W2 <<3)sUB x0,x4,X3,ASR #2 //xo = x4 - (X3 >> 2)注意:(1)寄存器可以是64位,也可以是32位。(2)注意LSL和ASR指令,分别代表将值左移n位和右移n位数据处理指令的使用场景二、内存访问指令通用语法: LDR Rt,<addr> STR Rn,<addr>数据处理指令例子:LDR Xo,[X1,#8] //将存储器地址为X1+8的数据读入到x0中LDR Xo,[X1,X2] //将存储器地址为X1+X2中的数据读入到XO中LDR Xo,Ox1D32A5B7 //将存储器地址为0x1D32A5B7中的数据读入到X0中STR x0,[X1,#8] //将X0中的数据写入到地址为X1+8的存储器中注意:ldr和str可以加其他字母来代表数据的长度及是否为sign或unsign,例如LDRB表示数据的长度为8位,LDRSB表示数据为sign类型的,长度为8位,类似的指令还有LDRH、LDRSH、LDRW等三、流程控制指令流程控制指令有时也被称为跳转指令。绝对跳转中的L代表的是link的意思,表示需要把当前的地址存到x30中,等执行完跳转后的指令后,再跳转回来继续执行。四、系统控制指令中断处理指令:中断处理主要是和中断模式对应,用来切换安全级别,主要的指令包括:sVC\HVC\SMC,其中sVC用于应用调用内核,HVC用于os调用hypervisor,SMC用于OS和Hypervisor调用Monitoro系统寄存访问指令:指特殊寄存器,该访问指令是用来将系统寄存器的数据写入到通用寄存器中,例如MRS X4,ELR_EL1,表示将ELR_EL1中的值拷贝到x4中。调试指令:BRK/HLT暗示指令NEON浮点计算加密指令
-
一、ARMv8的通用寄存器每个特权级别下都有31个通用寄存器在AArch64运行模式下,寄存器的命名以“x”开头在AArch32运行模式下,寄存器的命名以“w”开头(1)在每个安全级别下都有31个通用寄存器. X29/W29为栈指针(2)x30/W30为程序链接寄存器.W是x的低位(3)参数寄存器(XO-X7):用作临时寄存器或可以保存的调用者保存的寄存器变量函数内的中间值,调用其他函数之间的值(8个寄存器可用于传递参数)(4)来电保存的临时寄存器(X9-X15)∶如果调用者要求在任何这些寄存器中保留值调用另一个函数,调用者必须将受影响的寄存器保存在自己的堆栈中帧。它们可以通过被调用的子程序进行修改,而无需保存并在返回调用者之前恢复它们。(5)被调用者保存的寄存器(X19-x29):这些寄存器保存在被调用者帧中。它们可以被被调用者修改子程序,只要它们在返回之前保存并恢复。Wn寄存器对应Xn寄存器的低位对wn寄存器写操作时,Xn寄存器的高位将被置0二、ARMv8的特殊寄存器Zero Register:零寄存器,读时返回全为o,写入时会被忽略Stack Pointer:堆指针Program Counter:计时器Exception Link Register:保存异常返回地址Program Status Register:用于保存PSTATE(1)不同的安全模式共用零寄存器和计数器寄存器,堆指针只有ELo模式下,其他寄存器每种模式都各自的。(2)和通用寄存器一样,以X开头的特殊寄存器运行在AArch64模式下,以W开头的特殊寄存器运行在AARch32模式下。(3)PSTATE表示的是保存当前process状态信息的一组寄存器或者一些标志位信息的统称,当异常发生的时候这些信息就会保存到EL所对应的SPSR寄存器当中ARMv8指令集编码格式
-
在功率谱的中低端存在一些不太大的功率转换要求,这在物联网(IoT)设备之类的应用中很常见。这些应用需要使用能够处理适度电流水平的功率转换IC。电流通常在数百毫安范围,但如果板载功率放大器为了传输数据或视频而存在峰值功率需求,那么电流量可能更高。因此,随着支持众多物联网器件的无线传感器的激增,业界对专门用于空间和散热受限器件的小型、紧凑、高效功率转换器的需求在不断增加。然而,与其他很多应用不同,许多工业和医疗产品对可靠性、尺寸和稳健性通常有着更高的标准。正如大家所料,相当部分的设计负担落在了功率系统及其相关支持器件上。工业甚至医疗物联网产品必须正常运行并在多个电源(如交流电源插座和备用电池)之间无缝切换。此外,必须竭尽全力防止故障,同时在由电池供电时须最大程度延长工作时间,以确保无论存在什么电源,系统都能可靠地正常工作。因此,这些系统内部使用的功率转换架构必须鲁棒、紧凑且散热需求极低。电源设计的考虑工业物联网系统设计人员在集成无线传输功能的系统中使用线性稳压器并不罕见。主要原因是其EMI和噪声极低。尽管如此,虽然开关稳压器产生的噪声高于线性稳压器,但前者的效率要优越得多。已经证明,如果开关稳压器的行为可预测,那么许多敏感应用中的噪声和EMI水平是可管理的。如果开关稳压器在正常模式下以恒定频率开关,并且开关边沿干净、可预测且没有过冲或高频振铃,那么EMI将极小。此外,小封装尺寸和高工作频率可以提供小而紧凑的布局,从而最大限度地降低EMI辐射。而且,如果稳压器可以与低ESR陶瓷型电容一起使用,则输入和输出电压纹波(这是系统中的额外噪声源)可以最小化。当今工业和医疗物联网设备的主输入电源通常是来自外部AC-DC适配器和/或电池组的24V或12V直流电源。然后,此电压通过同步降压转换器进一步降低到5V和/或3.xV电压轨。尽管如此,经过这些医疗物联网设备内部调节后的供电轨数量却在增加,而工作电压持续降低。因此,其中许多系统仍然需要3.xV、2.xV或1.xV电压轨,用于为低功耗传感器、存储器、微控制器内核、输入/输出和逻辑电路供电。然而,用于数据传输的内部功率放大器可能需要最高0.8A电流能力的12V电压轨,以将任何记录的数据传输到远程集中式集线器。传统上,该12V电压轨由升压开关稳压器提供,需要专门的开关模式电源设计知识和技能,并且占用印刷电路板(PCB)上相当大的面积。新型紧凑式升压转换器ADI公司的µModule®(微型模块)产品是完整的系统化封装(SiP)解决方案,可最大限度地缩短设计时间,解决工业和医疗系统中常见的电路板空间和密度问题。这些µModule产品是完整的电源管理解决方案,在紧凑型表贴BGA或LGA封装内集成DC-DC控制器、功率晶体管、输入和输出电容、补偿组件和电感。利用ADI公司µModule产品进行设计可以将完成设计过程所需的时间减少多达50%,具体取决于设计的复杂程度。µModule系列将元件选型、优化和布局等设计负担从设计人员转移到器件上,可缩短整体设计时间,减少系统故障,最终加快产品上市时间。此外,ADI公司的µModule解决方案将分立式电源、信号链和隔离设计中常用的关键元件集成在紧凑的IC式外形尺寸中。在ADI公司严格的测试和高可靠性流程的支持下,µModule产品系列简化了功率转换的设计和布局。µModule系列产品涵盖了广泛的应用,包括终端负载稳压器、电池充电器、LED驱动器、电源系统管理(PMBus数字管理电源)和隔离式转换器。作为高集成度解决方案且每个器件都提供PCBGerber文件,µModule电源产品可在满足时间和空间限制的同时提供高效率、高可靠性,某些产品还提供符合EN55022B类标准的低EMI解决方案。随着设计资源因为系统复杂性的提高和设计周期的缩短而变得紧张,关注重点落在了系统关键知识产权的开发上。这常常意味着电源受到忽视,直到开发周期的后期才予以解决。由于时间很短,而且专业电源设计资源可能有限,因此需要开发出尺寸尽可能小的高效率解决方案,同时可能要对PCB的反面加以运用,使空间利用率最大化。µModule稳压器为此提供了理想的答案。此概念内部复杂,但外部简单——既有开关稳压器的效率,又有线性稳压器的易设计性。认真负责的设计、PCB布局和元件选择对于开关稳压器设计非常重要,很多经验丰富的设计人员在职业生涯的早期闻到了电路板燃烧的独特香味。当时间短或电源设计经验不足时,现成的µModule稳压器可节省时间并降低风险。ADI公司µModule系列最近的一个实例是LTM4661同步升压µModule稳压器,其采用6.25mm×6.25mm×2.42mmBGA封装。封装中包含开关控制器、功率FET、电感和所有支持元件。在1.8V至5.5V的输入范围内工作时,它可以提供2.5V至15V的稳压输出,输出电压通过单个外部电阻设置。只需要一个输入和输出体电容。图1.3.3V至5V输入,提供最高800mA的12V电压,采用外部时钟。LTM4661效率很高,从3.3V输入升压至12V输出时,效率高于87%。效率曲线参见图2。图2.LTM4661的效率与输出电流的关系,从3.3V输入升压为5V至15V输出。图3显示了LTM4661的实测热图像:3.3V输入,12V、800mA直流输出,200LFM气流,无散热器。图3.LTM4661的热图像:3.3V输入,12V、0.8A输出,200LFM气流,无散热器。结论近年来,物联网设备的部署爆炸式增长,其中包括各种用于军事和工业应用领域的产品。新一波产品,包括装有传感器的医疗和科学仪器,一直是近年来市场的重要推动因素,现已开始出现显著增长的迹象。与此同时,这些系统的空间和热设计限制催生了一类新型功率转换器,要求其实现小尺寸、紧凑且热效率高的必要性能指标,以为诸如功率放大器等内部电路供电。幸运的是,最近发布的LTM4661升压型µModule稳压器之类的器件简化了电源设计人员的工作。最后,在此类应用中使用µModule稳压器是很有意义的,因为它能显著缩短调试时间并提高电路板面积利用率。由此将能降低基础设施成本,以及产品生命周期的总拥有成本。作者简介TonyArmstrong是ADI公司PowerbyLinear部门的营销总监,于2000年5月加入公司。他负责电源转换和管理产品方面从概念到停产的所有事情。加入凌力**(现为ADI公司一部分)之前,Tony在SiliconixInc.、SemtechCorp.、FairchildSemiconductors和IntelCorp.(欧洲)担任过营销、销售和运营方面的不同职位。他于1981年在英国曼彻斯特大学获得应用数学学士学位。
-
>前文:通过[自制小熊派扩展板——六轴传感器扩展板](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=121171),我们在小熊派上搭建了六轴传感器模块。 本文从C语言程序出发,获取三轴加速度数据、三轴陀螺仪数据。并根据原始数据求得真实数据 # 一、实验准备 ## 1.实验环境 - 小熊派开发板,以及MicroUSB数据线 - 已经安装STM32CubeMX - 已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431RCT6) - 如果不使用DMP,可以用杜邦线连接MPU6050 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/152352svynhwyvszors1ca.png) ---- ## 2.目标效果 - 通过CubeMX创建工程并配置参数 - IIC方式通信,配置MPU6050寄存器。 - 小熊派通过IIC,获取陀螺仪、加速度计数据。 - 对获取的原始数据进行分析,获取加速度、陀螺仪值。 - 串口1重定向输出加速度、陀螺仪值。 # 二、通过CubeMX生产MDK工程 ## A.芯片选择 - **打开CubeMX,进入芯片选择:** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/30/212026gwrodk54oyp4fcl0.png) - **选择自己的stm32芯片(即STM32L431RCT6):** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/30/212556cpcaurxs79c0xlnq.png) --- ## B.时钟源RCC设置 - **更改系统时钟源** >系统时钟默认使用内部的高速时钟(HSI),选择使用HSE,时钟更精确 - 设置外部时钟对应的端口 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/30/213059x5earvssmihl5hsf.png) - 配置时钟树 >STM32L431RCT6系统时钟最大可以为80MHz,我们配置到最大即可 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/30/213359df4zzbsoimhq2cgg.png) --- ## C.参数配置(对应端口设置) ### **1)配置USART1** 使用USART,模式为异步,波特率为115200,无硬件流控制 ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/113002az5kmov8zzgjmkkd.png) ---- ### **2)硬件IIC配置** ``` IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构 ``` 我们使用小熊派的I2C1,小熊派引出的引脚为**PB7->I2C1_SDA,PB6->I2C1_SCL** 其他选项我们保持默认即可 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/211758a2wp3eljqb59qb6v.png) ### 3)MPU6050模块 当然,我们还需要了解MPU6050模块的电路,更好的进行配置。当然我们也可以自主制作模块 **如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位);如果AD0脚接V3.3,则IIC地址为0X69(不包含最低位).** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/212349tmiaru2tuniste0z.png) **可以看到,AD0引脚已经被拉低,所有默认IIC地址为0x68. ** **最后,生成代码就OK了** ## D.工程设置 一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成 ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/212548euc6o7cvi4cot4wz.png) ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/114727qvkul4oarss1pxdq.png) ---- ## E.生成代码 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/115001f5olm8dvgsctxvko.png) ---- # 三、编写相应代码 ## 1. 串口1输出重定向 >我们知道printf是打印函数,原理是根据传入的字符串参数格式化打印输出到stdout中。我们需要让printf打印到串口之中,只需要在usart.c文件中模仿printf写一个输出函数即可 - 在添加头文件 ```c /* USER CODE BEGIN 0 */ #include <stdarg.h> #include <string.h> #include <stdio.h> /* USER CODE END 0 */ ``` - 写输出函数 ```c /* USER CODE BEGIN 1 */ void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...) { unsigned char UsartPrintfBuf[296]; va_list ap; unsigned char *pStr = UsartPrintfBuf; va_start(ap, fmt); vsprintf((char *)UsartPrintfBuf, fmt, ap); //格式化 va_end(ap); while(*pStr != 0) { USART1->TDR = *pStr++; while((USART1->ISR & 0x40) == 0); } } //注意:在usart.h中添加void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...); //使用方法:UsartPrintf(&huart1;,"hello world\r\n"); /* USER CODE END 1 */ ``` >注意:自己添加的代码,需要在begin和end之间 ## 2.写MPU6050驱动 >我们创建两个文件,分别是mpu6050.h和mpu6050.c ### a).首先我们在mpu6050.h中宏定义相应的寄存器,方便后续使用。 >因为寄存器实在太多,就没有一一列出,可以在附件中查看哦~ ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202011/23/212837k0bqvm1dck0bwsmk.png) ### b).配置各个寄存器 >主要的函数为:IIC读写、初始化MPU6050、设置陀螺仪和加速度计满量程、设置采样率、读取数据 代码附件中有,不一一讲解。 **初始化函数** >初始化函数中,我们必须要保证IIC读写的正确,因此可以通过读某一个有确定值的寄出去,大致判断IIC通信的准确。此方法同样在SPI等通信协议时会使用到 ```c uint8_t MPUInit(void) { uint8_t res; extern I2C_HandleTypeDef hi2c1; HAL_I2C_Init(&hi2c1;); //初始化IIC /*上电后最好有一定延时,保证数据准确*/ HAL_Delay(500); MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x80); //复位MPU6050,写入1000 0000 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x00);//sleep写入0,保持唤醒状态 MPU_Set_Gyro_Fsr(3); //陀螺仪满量程±2000 MPU_Set_Accel_Fsr(1); //加速度计满量程±4g MPU_Set_Rate(50); //设置采样率=50Hz MPU_Write_Byte(MPU_INT_EN_REG,0x00);//关闭所有中断 MPU_Write_Byte(MPU_USER_CTRL_REG,0x00); //关闭从iic MPU_Write_Byte(MPU_FIFO_EN_REG,0x00); //关闭FIFO MPU_Write_Byte(MPU_INTBP_CFG_REG,0x80); //INT引脚低电平有效 res = MPU_Read_Byte(MPU_DEVICE_ID_REG); //读取地址 UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",res); UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",MPU_ADDR); if(res == MPU_ADDR) //判断地址是否正确 { MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x01); //001,pll,x轴为参考系统时钟源 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0x00); //都不使用待机模式 MPU_Set_Rate(50); }else return 1; return 0; } ``` 需要注意到,mpu6050上电后需要有一定延时,保证数据的稳定。重启mpu6050会有睡眠模式,写入关闭睡眠。最后检测并判断IIC地址是否正确 。 我们需要注意,我们设置的**加速度满量程和陀螺仪满量程**,后期数据分析会用到 ## 3.数据处理 ### 3.1 数据处理 - 加速度计的三轴分量ACC_X、ACC_Y和ACC_Z均为16位有符号整数,分别表示器件在三个轴向上的加速度,取负值时加速度沿座标轴负向,取正值时沿正向。 三个加速度分量均以**重力加速度g的倍数为单位**,能够表示的加速度范围,即倍率可以统一设定,有4个可选倍率:2g、4g、8g、16g。 - 以ACC_X为例,若倍率设定为2g(默认),则意味着ACC_X取最小值-32768时,当前加速度为沿X轴正方向2倍的重力加速度;若设定为4g,取-32768时表示沿X轴正方向4倍的重力加速度,以此类推。显然,倍率越低精度越好,倍率越高表示的范围越大,这要根据具体的应用来设定。 从前面初始化中,我们设置的倍率为2g,真实的加速度值ACC_Ture = ACC_X / 32767 / 2(精度),ACC_X为读取的数据。 同时,陀螺仪数据的处理也相同。 ### 3.2 main函数 >注意添加.h文件哦 ```c /* USER CODE BEGIN PV */ short aacx,aacy,aacz; //加速度传感器原始数据 short gyrox,gyroy,gyroz; //陀螺仪原始数据 char Mpu6050Data[40]; /* USER CODE END PV */ ``` ```c /* USER CODE BEGIN 2 */ MPUInit(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据 memset(Mpu6050Data,0,sizeof(Mpu6050Data)); sprintf(Mpu6050Data,"%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n",aacx/8200.0,aacy/8200.0,aacz/8200.0,gyrox/16.38,gyroy/16.38,gyroz/16.38); /* USER CODE BEGIN 3 */ } ``` Notes: - Mpu6050Data数据用于保存采集的数据。 - 加速度的满量程初始化设置的为±4g。 因此 实际数据 = 获取的数据 / (32767 / 4) ≈ 获取的数据/ 8200.0 - 陀螺仪的满量程初始化设置的为±2000g. 因此 实际数据 = 获取的数据 / (32767 / 2000) ≈ 获取的数据/ 16.38 # 四、编译+下载 **点击编译后,0 error,0 warning** ---- ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/121955njyncblcptrssxe7.png) **小熊派连接在电脑上,代码下载到开发板** ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/122123balqwmlnq0o1x39m.png) ---- # 五、连接硬件 ## 1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/31/163115mub9q4eizoub4uox.png) ## 2.连接MPU6050 将我们的“扩展板”插在小熊派上。 或者使用杜邦线连接mpu6050的SDA\SCL\GND\VCC。 即: - SDA-->PB7 - SCL-->PB6 - GND-->GND - VCC-->5V ---- ## 3.效果 打开串口调试助手,我们手动转动开发板(包括模块),看见陀螺仪和加速度数据不断变化,当静止时数据保持稳定 。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202104/15/201916qcymitzxnnub1zrn.png) 可以看到,开发板静止时,xy轴的加速度几乎为零。而Z轴受重力加速度影响,加速度为1g. **至此,我们已经可以通过小熊派以IIC获取六轴传感器原始数据信息**
-
ARM指令集和微架构体系不同指令集之间的指令不同微架构是指指令集实现的方式,比如结合了性能、物理尺寸已经成本等多方面. ARMv7以后统一使用Cortex命名微架构。指令集命名规则:ARMv | n | variants | x ( variants )l -ARMv --固定字符,即ARM Version -n--指令集版本号。迄今为之,ARM架构版本发布了8个系列,所以n=[1:8]。 -variants --变种。 -x ( variants)--排除x后指定的变种微架构命名规则:ARM{xHyHzHTHDHMHIHEHJHFH-S} x--处理器系列 y -- 存储管理/保护单元 z-- cache T --支持Thumb指令集 D--支持片上调试 M--支持快速乘法器 I--支持Embedded lCE,支持嵌入式跟踪调试 E--支持增强型DSP指令 J--支持Jazelle F--具备向量浮点单元VFP -S --可综合版本ARMv8不同系列及应用场景ARMv8的运行模式-AArch64在本模式下,所有地址保存在64位寄存器中,基本指令集可以使用64位寄存器来处理。AArch64状态下的指令集称为A64。-AArch32在本模式下,所有地址保存在32位寄存器中,基本指令集可以使用32位寄存器来处理。AArch32状态下的指令集可分为A32和T32。ARMv8支持的数据类型1、整型数据类型:字节——8位半字——16位字——32位双字——64位四字——128位2、浮点型数据类型:半精度、全精度、双精度ARMv8特权级别划分ARMv8将特权级别分为4个level,分别是ELO,EL1,EL2,EL3。而每个level的特权不一样的,特权大小ELO<EL1<EL2<EL3。不同的level之间使用异常( exception)进行切换1、一次执行必须包括EL0&1,EL2&3非必须但可以进行两者的任意组合,且不要求等级连续。2、Normal World代表的是普通世界,比如android手机中linux操作系统就在normalworld3、Secure World就是安全世界,比如android手机中的高通的QSEE就是运行在SecureWorld4、EL0:普通用户应用程序5、EL1:操作系统内核通常被描述为特权,在Secure World则就是Trusted os,比如高通的QSEE,开源的OP-TEE,豌豆荚的TEE等6、EL2:管理程序,如hypervisor,ARM为了支持虚拟化,设计的Hypervisor层,只有在Noraml world使用。7、EL3:低级固件,包括安全监视器,在应用处理器上,安全固件必须是系统启动的第一个程序。当noraml world想要访问secure world需要发送SMC指令进入SecureMoniter层,然后进入到Secure world8、. Secure Moniter是安全世界和普通世界的桥梁,二者切换的时候需要通过其来切换。9、普通世界由以下部分组成: (1)应用:运行在普通世界的应用程序。 (2)GuestOS:这些包括在非安全EL1中运行的Linux或Windows。在虚拟机管理程序下运行时,操作系统内核可以作为客户机或主机运行, 具体取决于虚拟机管理程序模式。 (3)Hypervisor:这在EL2上运行。当管理程序出现并启用时,可以在多个客户操作系统之间进行切换操作。10、安全世界有以下组件:(1)安全APP:它提供了多种服务,包括平台初始化,可信操作系统的安装以及路由安全监视器的调用。安全固件在EL3上执行。(2)可信的操作系统:可信的操作系统为普通世界提供安全服务,并为执行安全或受信任的应用程序提供运行时环境。它在EL3使用AArch64时在安全EL1上执行,在EL3使用AArch32时在安全EL3上执行。
-
pic单片机使用较多,因此学习pic单片机的人数也相对较多。对于pic单片机,它的优点众所皆知。此文对pic单片机的讲解在于介绍pic单片机的IO口操作。但本文不仅仅局限于pic单片机,同样将对51单片、AVR单片机IO操作加以介绍,一起来了解下吧。51单片机、AVR单片机和PIC单片机IO口结构的均不同,导致了IO口操作也不同。操作单片机IO口的目的是让单片机的管脚输出逻辑电平和读取单片机管脚的逻辑电平。
上滑加载中
推荐直播
-
算子工具性能优化新特性演示——MatMulLeakyRelu性能调优实操
2025/01/10 周五 15:30-17:30
MindStudio布道师
算子工具性能优化新特性演示——MatMulLeakyRelu性能调优实操
回顾中 -
用代码全方位驱动 OBS 存储
2025/01/14 周二 16:30-18:00
阿肯 华为云生态技术讲师
如何用代码驱动OBS?常用的数据管理,对象清理,多版本对象访问等应该如何编码?本期课程一一演示解答。
即将直播 -
GaussDB数据库开发
2025/01/15 周三 16:00-17:30
Steven 华为云学堂技术讲师
本期直播将带你了解GaussDB数据库开发相关知识,并通过实验指导大家利用java基于JDBC的方式来完成GaussD数据库基础操作。
去报名
热门标签