上一篇文章 《实抓Flash旗子暗记波形来看i.MXRT的FlexSPI外设下AHB读访问环境(有预取)》 里痞子衡抓取了Cache关闭但Prefetch开启下的AHB读访问对应的Flash端时序波形图,我们知道了FlexSPI的Prefetch功能确实在一定程度上改进了Flash访问效率,但是AHB RX Buffer最大仅1KB(对i.MXRT1050而言),不可拆分成更小粒度Buffer去缓存不同Flash地址处的数据(对付同一AHB master而言),这样对付代码中多个不同小数据块重复的Flash空间访问,Prefetch机制并没有明显提升访问效率。
针对这种不连续Flash地址空间频繁访问低效情形,ARM Cortex-M7内核给出理解决方案,那便是L1 Cache技能,本日痞子衡就来连续测一测开启L1 Cache下的Flash AHB读访问环境(本文紧张针对D-Cache):

一、Cortex-M7的Cache功能
对付Cortex-M系列家族(M0+/M3/M4/M7/M23/M33/M35P/M55)来说,L1 Cache仅在Cortex-M7和Cortex-M55内核上存在,说白了,L1 Cache是专为高性能内核配置的,而目前的i.MXRT1xxx系列微掌握器都是基于Cortex-M7内核。
下面是i.MXRT1050的内核系统框图,可以看到它集成了32KB D-Cache,Cache经由AXI64总线连到SIM_M7和SIM_EMS模块,终极转成AHB总线连接到FlexSPI模块,因此对付Flash的AHB读访问是可以受到D-Cache加速的。
关于D-Cache事情机制,可以在 ARM Cortex-M7 Processor Technical Reference Manual 手册中找到详细阐明。大略地概括便是32KB D-Cache会被划分成1024个Cache Line,每个Cache Line大小为32个字节,四个Cache Line是一组(即所谓的4-way set associative),每一组Cache Line会有一个地址标签,地址标签用来记录Cache所缓存的数据所在目标地址信息。
L1 D-Cache使能时,对目标存储器的AHB读访问统共有两大类:Hit(要访问的数据在Cache里面)、Miss(要访问的数据不在Cache里面),Hit没什么好说的,直接从Cache里取数据就行了;Miss后则会先把数据从目标存储器中读到Cache里,然后再从Cache读出数据(这便是所谓的Read-Allocate,实际上有另一个名词Read-Through与之对应,Read-Through即直接从目标存储器中读出数据,一样平常是Cache不使能时的行为)。
对目标地址空间的Cache策略掌握紧张是属性配置(在内核MPU模块里)和开关掌握(在内核SCB模块里),下面 BOARD_ConfigMPU() 函数即是范例的对FlexSPI地址映射空间所分配的Flash区域的Cache属性配置,这个代码里将0x60000000开始的64MB空间属性配成了Normal Memory,不共享,Cache使能并且写访问行为是Write-Back(写访问还有另一种策略Write-Through),读访问行为不用配置(固定Read-Allocate)。
/ MPU configuration. /void BOARD_ConfigMPU(void){ / Disable I cache and D cache / SCB_DisableICache(); SCB_DisableDCache(); / Disable MPU / ARM_MPU_Disable(); / Region 0 setting: Instruction access disabled, No data access permission. / MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); / Region 2 setting: Memory with Device type, not shareable, non-cacheable. / MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);#if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) / Region 3 setting: Memory with Normal type, not shareable, cacheable, outer/inner write back. / MPU->RBAR = ARM_MPU_RBAR(3, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB);#endif / Enable MPU / ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk); / Enable I cache and D cache / SCB_EnableDCache(); SCB_EnableICache();}
末了再提一下跟本文主题不相关的Cache使能下写访问行为策略:
(Hit环境下)Write-Through模式: 直接写到目标存储器中并且也在Cache里更新(无多Master访问造成的数据同等性问题,但没有提升写访问性能)
(Hit环境下)Write-Back模式: Cache line会被标为dirty,等到此行被invalidate时,才会实行实际的写操作,将Cache Line里面的数据写到目标存储器。(提升了写访问性能,但有隐患,如果 Cache 命中,此时仅 Cache 更新了,目标存储器没有更新,其他Master从目标存储器里面读出来的数据是缺点的)
(Miss环境下)Write-Allocate: 先把要写的数据载入到Cache,然后再flush进目标存储器。
(Miss环境下)no-Write-Allocate: 直接写入目标存储器。
二、D-Cache实验准备
参考文章 《实抓Flash旗子暗记波形来看i.MXRT的FlexSPI外设下AHB读访问环境(无缓存)》 里的第一小节 实验准备,本次实验须要做一样的准备事情。
三、D-Cache实验代码
参考文章 《实抓Flash旗子暗记波形来看i.MXRT的FlexSPI外设下AHB读访问环境(无缓存)》 里的第二小节 实验代码,本次实验代码关于工程和链接文件方面是一样的设置,但是详细测试函数改成如下ramfunc型函数 test_cacheable_read()。关于D-Cache这次会有很多种不同测试,while(1)语句前的系统配置保持不变,while(1)里面的语句可根据实际测试情形去调度:
#if (defined(__ICCARM__))#pragma optimize = none__ramfunc #endifvoid test_cacheable_read(void){ // 系统配置 / Disable L1 I-Cache/ SCB_DisableICache(); / Enable L1 D-Cache/ SCB_EnableDCache(); SCB_CleanInvalidateDCache(); // 根据测试需求,开/关FlexSPI的Prefetch特性 while (1) { // 测试用例代码,可按情形调度 } }
为了便于分辨IO[1:0]上的数据去帮助剖析本系列测试用例结果,我们须要拓展下分外const数据区.ahbRdBuffer设置如下:
四、D-Cache实验结果
4.1 重做无缓存一文中的实验
现在让我们在开启D-Cache的情形下重新做文章 《实抓Flash旗子暗记波形来看i.MXRT的FlexSPI外设下AHB读访问环境(无缓存)》 中全部实验:
#define AHB_ADDR_START (0x60002400)void test_cacheable_read(void){ // 略去系统配置(I-Cache、Prefetch关闭,D-Cache开启) while (1) { SDK_DelayAtLeastUs(10, SystemCoreClock); for (uint32_t i = 1; i <= 8; i++) { SDK_DelayAtLeastUs(2, SystemCoreClock); memcpy((void )0x20200000, (void )AHB_ADDR_START, i); } } }
4.1.1 AHB_ADDR_START 取值 [0x60002400 - 0x60002418]
当 AHB_ADDR_START 取值范围在 [0x60002400 - 0x60002418] 中时,Flash真个时序波形图都是如下同一个。由于有了D-Cache,现在我们看不到周期性的CS旗子暗记了,解释除了Flash新地址访问是必须要通过FlexSPI外设去读取Flash之外,其后的同一Flash地址的重复访问都直接发生在D-Cache里了。
其余D-Cache起始缓存地址永久是32字节对齐的地址处,并且一次缓存32byte的数据(由于D-Cache Line大小便是32byte),以是波形结果里看,起始地址都是0x60002400,一次读取32byte数据(存在一个D-Cache Line里),因此之前不开D-Cache和Prefetch下的AHB Burst Read策略导致的访问不同对齐地址的波形差异测试结果在这里就不存在了。
4.1.2 AHB_ADDR_START = 0x60002419
当实际代码中要读取的Flash数据会横跨两个相邻32字节对齐的数据块(0x60002400 - 0x6000241f, 0x60002420 - 0x6000243f),此时Flash端会涌现两次CS有效旗子暗记,每次均传输32byte数据,D-Cache一贯在持续浸染,这次动用了两个D-Cache Line(D-Cache总大小有32KB,共有1024个Cache Line),因此在Flash端我们还是看不到周期性CS旗子暗记。
4.1.3 追加实验,从0x60002400处读取1KB
当代码循环读取1KB数据时,波形图上可以看到32个CS有效旗子暗记,每个CS有效期间传输32byte数据,总计1KB数据的传输,D-Cache这次派出了32个 Cache Line,在Flash端我们依然看不到周期性CS旗子暗记。
4.2 重做有预取一文中的实验
现在让我们在开启D-Cache的情形下重新做文章 《实抓Flash旗子暗记波形来看i.MXRT的FlexSPI外设下AHB读访问环境(有预取)》 中全部实验:
4.2.1 循环读取首地址32字节对齐的1KB空间内的任意长度数据块,起始拷贝地址位于前31个字节内
这种情形下,Flash端实际波形与 《实抓Flash旗子暗记波形来看i.MXRT的FlexSPI外设下AHB读访问环境(有预取)》 中 4.1 里的测试结果差不多,这里就不再贴图了。Prefetch机制做第一层缓存,D-Cache获取Prefetch Buffer里的结果做二次缓存,唯一的差异是由于D-Cache的存在,缓存起始地址可能会发生变革(从八字节对齐变成了32字节对齐):
#define PREFETCH_TEST_ALIGNMENT (7) // 可取值 0 - 31#define PREFETCH_TEST_START (0x60002400 + PREFETCH_TEST_ALIGNMENT)uint32_t testLen = 0x1; // 可取值 1 - (1KB-PREFETCH_TEST_ALIGNMENT)void test_cacheable_read(void){ // 略去系统配置(I-Cache关闭,Prefetch开启,D-Cache开启) while (1) { memcpy((void )0x20200000, (void )PREFETCH_TEST_START, testLen); } }
4.2.2 循环读取大于1KB的数据块或首地址非32字节对齐的1KB数据块
这种情形下,Flash端会有两次完全的1KB Prefetch操作,第一次Prefetch操作读取了0x60002400处的1KB,第二次Prefetch操作读取了0x60002800处的1KB。由于有D-Cache的存在,第二次Prefetch操作有了足够韶光去完成,不用额外插入软延时去避免其被while(1)循环回来的下一次访问需求打断了:
void test_cacheable_read(void){ // 略去系统配置(I-Cache关闭,Prefetch开启,D-Cache开启) while (1) { memcpy((void )0x20200001, (void )0x60002401, 0x400); } }
4.2.3 循环读取两个不同数据块(在首地址32字节对齐的两个不同1KB空间内)
这种情形下,纵然有D-Cache存在,第一次CS期间的Prefetch操作(即memcpy((void )0x20200000, (void )0x60002400, 0x100);引发的)还是被第二次CS的Prefetch操作打断了(即memcpy((void )0x20200400, (void )0x60002800, 0x100);),但是第二次CS期间的Prefetch操作不会再被打断,由于接下来while(1)循环回来的Flash数据访问需求已经缓存在D-Cache里:
void test_cacheable_read(void){ // 略去系统配置(I-Cache关闭,Prefetch开启,D-Cache开启) while (1) { memcpy((void )0x20200000, (void )0x60002400, 0x100); memcpy((void )0x20200400, (void )0x60002800, 0x100); } }
4.3 如何在D-Cache使能的情形下看到周期性CS旗子暗记
前面测试了那么多种情形,我们有没有可能在Flash端看到周期性CS旗子暗记呢,即Flash持续地被读取呢?当然可以,我们知道D-Cache总大小是32KB,我们只要循环拷贝32KB以上数据,D-Cache就开始hold不住了,这不,下面代码就能让我们看到久违的周期时序波形图了(小心,Flash持续事情会多耗电的,哈哈)。
void test_cacheable_read(void){ // 略去系统配置(I-Cache关闭,Prefetch开启,D-Cache开启) while (1) { memcpy((void )0x20200000, (void )0x60002400, 0x8000 + 1); } }
至此,实抓Flash旗子暗记波形来看i.MXRT的FlexSPI外设下AHB读访问环境痞子衡便先容完毕了,掌声在哪里~~~
查看原文:https://www.dianyuan.com/eestar/article-8190.html
SiC MOSFET用于电机驱动的上风在哪里
在我们的传统印象中,电机驱动系统每每采取IGBT作为开关器件,而SiC MOSFET作为高速器件每每与光伏和电动汽车充电等须要高频变换的运用干系联。但在特定的电机运用中,SiC仍旧具有不可比拟的上风,他们是:
1 低电感电机
低电感电机有许多不同运用,包括大气隙电机、无槽电机和低透露感应电机。它们也可被用在利用PCB定子而非绕组定子的新电机类型中。这些电机须要高开关频率(50-100kHz)来坚持所需的纹波电流。然而,对付50kHz以上的调制频率利用绝缘栅双极晶体管(IGBT)无法知足这些需求,如果是380V系统,硅MOSFET耐压又不足,这就为宽禁带器件首创了新的机会。
2 高速电机
由于拥有高基波频率,这些电机也须要高开关频率。它们适用于高功率密度电动汽车、高极数电机、拥有高扭矩密度的高速电机以及兆瓦级高速电机等运用。同样,IGBT能够达到的最高开关频率受到限定,而通过利用宽禁带开关器件可能能够打破这些限定。例如燃料电池中的空压机。空压机最高转速超过15万rpm,空压机电机掌握器的输出频率超过2500Hz,功率器件须要很高的开关频率(超过50kHz),因此SiC-MOSFET是这类运用的首选器件。
3 恶劣工况
在电机掌握逆变器中利用宽禁带器件有两个引人关注的益处。第一,它们产生的热量比硅器件少,降落了散热需求。第二,它们能承受更高事情温度——SiC:600°C,GaN:300°C,而硅芯片能承受的最高事情温度仅为200°C。虽然SiC产品目前存在一些与封装有关的问题,导致它们所适用的事情温度不能超过200°C,但专注于办理这些问题的研究正在进行中。因此,宽禁带器件更适宜可能面临恶劣工况的电机运用,比如稠浊动力电动汽车(HEV)中的集成电机驱动器、海底和井下运用、空间运用等
传统的电机驱动中,每每利用IGBT作为开关器件。那么,SiC MOSFET相对付Si IGBT有哪些上风,使得它更适宜电机驱动运用?
首先,从开关特性角度看,功率器件开关损耗分为开通损耗和关断损耗。
关断损耗
IGBT是双极性器件,导通时电子和空穴共同参与导电,但关断时由于空穴,只能通过复合逐渐消逝,从而产生拖尾电流,拖尾电流是造成IGBT关断损耗的大的紧张缘故原由。SiC MOSFET是单极性器件,只有电子参与导电,关断时没有拖尾电流使得SiC MOSFET关断损耗大大低于IGBT。
开通损耗
IGBT开通瞬间电流每每会有过冲,这是反并联二极管换流时产生的反向规复电流。反向规复电流叠加在IGBT开通电流上,增加了器件的开通损耗。IGBT的反并联二极管每每是Si PiN二极管,反向规复电流比较明显。而SiC MOSFET的构造里天然集成了一个体二极管,无需额外并联二极管。SiC体二极管参与换流,它的反向规复电流要远低于IGBT反并联的硅PiN二极管,因此,纵然在同样的dv/dt条件下,SiC MOSFET的开通损耗也低于IGBT。其余,SiC MOSFET可以使得伺服驱动器与电机集成在一起,从而摒除线缆上dv/dt的限定,高dV/dt条件下,SiC的开关损耗会进一步降落,远低于IGBT。纵然是开关过程较慢时,碳化硅的开关损耗也优于IGBT。
此外,SiC MOSFET的开关损耗基本不受温度影响,而IGBT的开关损耗随温度上升而明显增加。因此高温下SiC MOSFET的损耗更具上风。
再考虑dv/dt的限定,相同dv/dt条件下,高温下SiC MOSFET总开关损耗会有50%~60%的降落,如果不限定dv/dt,SiC开关总损耗最高低降90%。
从导通特性角度看:
SiC MOSFET导通时没有拐点,很小的VDS电压就能让SiC MOSFET导通,因此在小电流条件下,SiC MOSFET的导通电压远小于IGBT。大电流时IGBT导通损耗更低,这是由于随着器件压降上升,双极性器件IGBT开始导通,由于电导调制效应,电子注入引发更多的空穴,电流迅速上升,输出特性的斜率更陡。对应电机工况,在轻载条件下,SiC MOSFET具有更低的导通损耗。重载或加速条件下,SiC MOSFET导通损耗的上风会有所降落。
CoolSiC™ MOSFET在各种工况下导通损耗降落,
下面通过一个实例研究,实际验证SiC MOSFET在电机驱动中的上风。
假定以下工况,比拟三款器件:
IGBT IKW40N120H3,
SiC MOSFET IMW120R060M1H和IMW120R030M1H。
测试条件
Vdc=600V, VN,out=400V, IN,out=5A–25A,
fN,sin-out=50Hz, fsw=4-16kHz, Tamb=25°C,
cos(φ)N=0.9, Rth,HA=0.63K/W, dv/dt=5V/ns
M=1,Vdc=600V, fsin=50Hz, RG@dv/dt=5V/ns, fsw=8kHz,线缆长度5m, Tamb=25°C
可以看出,基于以上工况,同样的温度条件下,30mohm的器件输出电流比40A IGBT提高了10A,哪怕换成小一档的60mohm SiC MOSFET,输出电流也能提升约5A。而相同电流条件下,SiC MOSFT的温度明显降落。
综上所述,SiC开关器件能为电机驱动系统带来的益处总结如下:
更低损耗‒降落耗电量,让人们的生活更加环保、可持续。
性能卓越‒实现更高功率密度,通过以更小的器件达到相同性能,来实现更经济的电机设计。
构造紧凑‒实现更紧凑、更省空间的电机设计,减少材料花费,降落散热需求。
更高质量‒SiC逆变器拥有更长利用寿命,且不易出故障,使得制造商能够供应更长的保修期。
末了,英飞凌CoolSiC™能担保单管3us,Easy模块2us的短路能力,进一步担保系统的安全性与可靠性。
查看原文:https://www.dianyuan.com/eestar/article-8169.html
换个角度学习逆变器(2)--SPWM方波傅里叶剖析
接上文学习逆变器就要搞清楚的第三个问题: LC滤波器能滤除什么样的波?
问题3
根据SPWM正弦波的傅里叶变换公式可知,SPWM方波和Sin正弦波之间的的差别便是,SWPM方波内存在别的频率的谐波,因此为了输出标准的正弦波,LC滤波器就必须把谐波滤除。进步剖析SPWM的谐波是什么,就可以确定LC滤波器的性能,进而确定滤波器的参数。
SPWM方波谐波的定量剖析
现有对SPWM双极性的谐波剖析结论如下:
1 基波分量的幅值如下:mUd,个中m为调制比,Ud为直流侧电压。
2 高频谐波的幅值公式如下:
谐波对应的频率为
即紧张的谐波频率都在载波频率倍数及其附近的频率处。
3 幅值最大的谐波频率为分量为谐波频率,最大幅值为
本文紧张通过仿真进行FFT变换剖析PWM波的谐波含量,通过matlab程序将谐波与基波重组并比拟仿真中输出的双极性SPWM方波。首先利用simulink对SPWM进行仿真,仿真参数如下:输入电压 500V,载波频率5Khz,调制波频率50Hz,仿真步长1e-6,载波比0.8,双极性调制,得到SPWM方波的谐波含量剖析。仿真模型如下:
剖析结果如下:
设置FFT变换的展示类型为list(relative to specified base),已表格的形式输出结果,且结果为实际的电压值。设置的最大剖析频率为100Khz,得到的FFT结果如下:
点击export就可以将数据输出至事情表,进而对数据进行定量剖析。
剖析步骤如下:
1 FFT数据谐波中的幅值较大的谐波提取出来
2 将提取出来的谐波进行重组。
3 将重组的波形与FFT剖析前的波形进行比拟。
1 程序将幅值大于20V的谐波进行提取得到如下数组:
已知仿真中直流侧输入电压500V,调制比为0.8.因此基波的幅值含量为400V。通过程序采集到的基波分量为398V,别的分量均为谐波分量,谐波分分量紧张包含在5KHz旁边、10KHz旁边、15KHZ旁边。上述剖析均知足FFT剖析的打算公式。将采集到的波形进行合成,合成的波形如下:
该波形已经可以看出来是个方波,下面与PWM波进行比拟得到如下比拟图。
可以看到合成的方波与实际的方波比拟,还存在的一些高频的分量,涌现偏差的缘故原由便是,FFT剖析时最大的频率为100Khz,再高频率的谐波有考虑到,且仅提取了大于20V的谐波。通过上述的程序剖析,就可以定量的剖析出,SPWM方波内含与载波频率呈倍数的谐波含量,紧张通过合理的滤波将高频谐波滤除就可以得到空想的正弦波输出电压。
仿真模型及程序放在附件,须要的自取。
程序如下:
l=length(FFTDATA.mag);
Data=struct('mag',{},'phase',{},'freq',{});
pmax=length(tout); %%仿真输出波形的点数
Pout=zeros(pmax,1); %%正弦波输出波形存储数组
tstep=1e-6; %%仿真步长
%% 从FFT数据中提取谐波含量较大的谐波
Magmax=20; %%对大于Magmax的谐波进行提取
k=1; %% 提取谐波的个数+1
for i=1:1:l
if( FFTDATA.mag(i,1) > Magmax)
Data(k).mag=FFTDATA.mag(i,1);
Data(k).phase=FFTDATA.phase(i,1);
Data(k).freq=FFTDATA.freq(i,1);
for j=1:1:pmax
Data(k).sin(j)=Data(k).magsind(2180Data(k).freqtout(j,1)+Data(k).phase);
end
k=k+1;
end
end
%% 正弦波的合成
nmax=k-1; %%正弦波输出波形迭代的次数k-1,最大值为k-1
for i=1:nmax
Pout=Pout+(Data(i).sin)';
end
%% 输出波形
tmax=0.02; %%输出波形的韶光
figure(1)
plot(tout(1:tmax/tstep),Pout(1:tmax/tstep))
hold on
plot(PWM(1:tmax/tstep,1),PWM(1:tmax/tstep,2))
查看原文:https://www.dianyuan.com/eestar/article-8220.html
Cortex-M内核存储保护单元MPU
大家好,我是痞子衡,是正经搞技能的痞子。本日痞子衡给大家先容的是ARM Cortex-M存储保护模块(MPU)。
《ARM Cortex-M内核MCU开拓那些事》的内核篇连载最早是 2017 年底开始写的,但只写了 7 篇就停更了,鸽了这么久实在不好意思。最近在支持 i.MXRT 客户的过程中,创造客户对 Cortex-M 的 MPU 功能不太理解,导致项目中出了内存造孽访问的问题,借此机会,痞子衡将重启这个 Cortex-M 内核篇连载,为大家系统地讲解下MPU:
本篇是MPU上篇,紧张讲述PMSAv6/7架构下的Cortex-M处理器MPU设计,适用Cortex-M0+/M3/M4/M7。
一、MPU是什么?
MPU 全称"Memory Protection Unit",中文叫“存储保护单元”,它是 Cortex-M 处理器内部的一个模块(把稳:并不是所有 Cortex-M 版本都支持 MPU,并且在一些支持 MPU 的 Cortex-M 版本上,MPU 也是可选组件(要看详细MCU厂商是否实现))。
让我们结合如下 Cortex-M 处理器(以 CM0+ 为例,其他版原形似)模块框图中来阐明 MPU 浸染,从框图中大家可以看到,MPU 介于 Core 和 Bus matrix 中间。Bus matirx 是 ARM 系统总线大管家,用以实现系统内多主(Core,DMA等)、多从(内部RAM,APB外设,外部总线等)的交联和仲裁,Core 通过 Bus matirx 可以访问到系统空间内的所有存储/外设资源,现在 MPU 挡在了 Core 和 Bus matirx 中间,这意味着从此 Core 对系统存储资源的访问须要经由 MPU 的权限掌握与审核。
二、存储空间类型与属性
MPU 对存储空间的访问权限掌握紧张包含:Strongly-ordered(是否严格有序)、Shareable(是否共享)、Cacheable(是否缓存)、Execute Never(是否可实行)等方面,不同的访问权限配置造就了系统里不同的存储空间类型与属性,这统统都是为了能够让存储资源被 Core 高效且可靠地访问(RTOS环境下比裸机程序下更须要可靠担保)。
Shareable/Cacheable/Execute Never 属性大家该当都理解,有必要特殊提一下 Strongly-ordered 属性,由于不同属性的存储空间配置会给代码实行时内存访问指令的顺序方面造成了困扰,比如两个内存访问指令A1, A2,假定它们是同一主设备接口发出的,并且 A1 在程序代码里涌如今 A2 之前,根据 A1/A2 不同的属性组合其实际实行结果如下,有些时候系统无法担保 A1 操作一定比 A2 操作先完成,这时候须要软件设计里手工插入内存樊篱指令(ISB, DSB)来担保终极顺序。
如果 MPU 模块不存在或者没有被使能,处理器系统 4GB 存储空间默认的属性如下(表中 XN 即 Execute Never;WT 即 Write-Throug;WBWA 即 Write-Back, write allocate):
三、MPU功能配置
MPU 模块是处理器内核自带的模块,其寄存器定义见 \CMSIS\Include\core_cm0plus/3/4/7.h 文件,详细寄存器功能阐明这里就不展开了,可翻阅对应 ARMv6/7-M Architecture RM 或者 Cortex-M0+/3/4/7 Generic UG 手册找到详细阐明。
大略概括一下,MPU 最多支持 8/16 个主空间划分(MPU_RNR[REGION],REGION取值 0-7 或者 0-15),每个主空间可以自由设置其属性(MPU_RASR[XN/AP/TEX/S/C/B]),空间大小是可设的,最小粒度为 32bytes,空间之间也可以重叠(高序号空间属性会覆盖低序号空间属性)。当某个主空间分配的大小超过 256 bytes 时,这个主空间还可以被平分成 8 个子空间,每个子空间有独立的开关掌握(MPU_RASR[SRD])。
MPU 模块最核心的寄存器是 MPU_RASR,其供应了存储空间详细访问权限配置,XN/AP/TEX/S/C/B 位域共同决定了终极权限,用户可根据项目实际需求进行配置。
上表中关于 Cache 策略的设置 AA/BB 定义如下: 00 Non-cacheable 01 Write-back, write and read allocate 10 Write-through, no write allocate 11 Write-back, no write allocate
四、MPU配置代码示例
ARM 官方为 MPU 模块预实现了一些功能函数/宏定义,见 \CMSIS\Include\mpu_armv6/7.h 文件,个中最常用的是 ARM_MPU_RBAR 和 ARM_MPU_RASR 宏。
如下是恩智浦 i.MXRT1170 的 MPU 示例配置代码,这是颗 Cortex-M7 内核的 MCU,内部有 2MB RAM,官方 MIMXRT1170-EVK 板卡为其外挂了 16MB 的 NOR Flash 和 64MB 的 SDRAM。
代码中 Region2/3/4/5/6/8/9 是实际用户存储空间的配置,其他 Region0/1/7 是基本系统空间的配置,未定义空间的造孽访问会产生 MemManage 或者 BusFault。
void BOARD_ConfigMPU(void){ / Disable I cache and D cache / SCB_DisableICache(); SCB_DisableDCache(); / Disable MPU / ARM_MPU_Disable(); ////////////////////////////////////////////////////////////////////////////////////// // 系统全部 4GB 空间先配置成 XN 属性的 Device / Region 0 setting: Instruction access disabled, No data access permission. / MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); ////////////////////////////////////////////////////////////////////////////////////// // 0x00000000 之后的1GB 空间配置成非 XN 属性的 Device / Region 1 setting: Memory with Device type, not shareable, non-cacheable. / MPU->RBAR = ARM_MPU_RBAR(1, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB); ////////////////////////////////////////////////////////////////////////////////////// // 0x00000000 之后的内部 RAM 空间配置(实际 2MB) / Region 2 setting: Memory with Normal type, not shareable, outer/inner write back / MPU->RBAR = ARM_MPU_RBAR(2, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); / Region 3 setting: Memory with Normal type, not shareable, outer/inner write back / MPU->RBAR = ARM_MPU_RBAR(3, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); / Region 4 setting: Memory with Normal type, not shareable, outer/inner write back / MPU->RBAR = ARM_MPU_RBAR(4, 0x20200000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_1MB); / Region 5 setting: Memory with Normal type, not shareable, outer/inner write back / MPU->RBAR = ARM_MPU_RBAR(5, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_512KB); ////////////////////////////////////////////////////////////////////////////////////// // 0x30000000 之后的外部 NOR Flash 空间配置(实际 16MB)#if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) / Region 6 setting: Memory with Normal type, not shareable, outer/inner write back. / MPU->RBAR = ARM_MPU_RBAR(6, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_16MB);#endif ////////////////////////////////////////////////////////////////////////////////////// // 0x80000000 之后的外部 SDRAM 空间配置(最大 512MB,实际 64MB) / Region 7 setting: Memory with Device type, not shareable, non-cacheable. / MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);#ifdef USE_SDRAM / Region 8 setting: Memory with Normal type, not shareable, outer/inner write back / MPU->RBAR = ARM_MPU_RBAR(8, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB);#endif#if defined(__ICCARM__) || defined(__GNUC__) extern uint32_t __NCACHE_REGION_START[]; // 来自链接文件里的定义 extern uint32_t __NCACHE_REGION_SIZE[]; // 来自链接文件里的定义 uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START; uint32_t size = (uint32_t)__NCACHE_REGION_SIZE;#endif volatile uint32_t i = 0; while ((size >> i) > 0x1U) { i++; } if (i != 0) { / The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. / assert(!(nonCacheStart % size)); assert(size == (uint32_t)(1 << i)); assert(i >= 5); / Region 9 setting: Memory with Normal type, not shareable, non-cacheable / MPU->RBAR = ARM_MPU_RBAR(9, nonCacheStart); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, i - 1); } / Enable MPU / ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk); / Enable I cache and D cache / SCB_EnableDCache(); SCB_EnableICache();}
附录一、MPU特性差异
至此,ARM Cortex-M存储保护模块(MPU)痞子衡便先容完毕了,掌声在哪里~~~
查看原文:https://www.dianyuan.com/eestar/article-8171.html
感应加热事理与IGBT运用拓扑剖析(上)
常常碰着很多同事和朋友问:为什么电磁炉和电饭煲要用到IGBT,这种运用的IGBT须要有什么特点?本日我们就给大家详细阐明感应加热的事理和感应加热的拓扑剖析。
在理解电磁感应加热的事理之前,先问自己一个问题,如果这个天下上没有电磁炉,你要烧开一锅水,会怎么做?
最常见的办法,便是点燃炉灶,把锅架在火上。
图1.传统燃气加热
然而这种方法是间接的加热办法,先由热源加热锅具,再通过锅具将热量传导到锅内的食品,在这一系列的过程中,一定会产生能量的丢失。
以是,有没有一个办法,把锅具本身变成一个热源,让锅来直接煮水?
这,就要用到感应加热了。
感应加热的事理,如图2所示:
1.掌握板通过谐振转换电路产生高频互换电流流经铜线圈;
2.在事情线圈上产生感应的磁场,感应磁场在金属锅具底部产生涡流;
3.涡流利过金属的趋肤效应让其电阻产生焦耳热,同时与材料的渗透性有关的磁滞丢失也产生热量。
图2.涡流效应
等效电路如下图所示:
图3.等效电路
感应加热速率有以下特点:
1.烹饪容器底部的涡流与流经感应线圈的电流大小成正比,意味着增加感应线圈的电流会导致涡流的增加; 烹饪容器的加热韶光会更快。
2.更高的频率将使涡流密度集中在更靠近表面的地方,这反过来又会大大减少活性电流流的横截面积,从而间接增加电阻,增加加热效率,以是增加事情频率也会加快加热容器的速率。
以是感应加热须要谐振掌握器在线圈上产生交变电流,并且为了达到一定功率,谐振掌握器的电流及开关频率都哀求比较高,那么开关器件势必要选用即能导通大电流又能快速开关的IGBT。
图4.频率对材料的标准穿透深度的影响
感应加热目前主流的拓扑有单端谐振和半桥谐振两种不同的拓扑,下图对两种拓扑特点做了详细的比较:
图5.感应加热运用范围和谐振拓扑的特点
1.单端谐振相对来讲掌握大略,整体本钱有上风;
2.如下图所示单端谐振不敷之处便是功率范围明显受到制约,小功率(<600W)会有硬开通产生大电流增加温升,大功率(>2.3KW)单颗管子的温升很难掌握;
图6.两种拓扑功率输出和温升的对应关系
下篇我们会结合拓扑的回路路径对两种拓扑的等效电路电流进行详细剖析。
查看原文:https://www.dianyuan.com/eestar/article-8170.html
更多精彩内容,尽在电子星球 APP(https://www.eestar.com/)
六篇技能文章,让你秒懂电容的脾气秉性
七篇DIY技能文章献给你,让你脑洞全开
五篇文章帮你开启DSP的学习思路
汇总篇:关于PID知识,重点在此










