本帖最后由 呐咯密密 于 2023-4-12 14:55 编辑
前言 忙里偷闲测评一下华芯微特的SWM34SVE_LCM_DEMO开发板,当时申请时没看主控的详细信息,想着到手测评一下开发板的屏幕驱动能力,因为这块主控在官网也是放在了屏驱MCU的分类下,主要的卖点可能也是屏驱能力,但是在到手看了手册之后,才意识到这是一块Cortex®-M33内核的MCU,那要这样的话,屏驱我可就不感冒了,因为该MCU带了CORDIC模块,可以计算三角函数,那我就需要换个角度看此芯片了。 一、何为Cortex®-M33
Cortex-M23与M33是ARM Cortex-M家族的继承者,Cortex-M23是Cortex-M0+的继任者,主打超低功耗,而Cortex-M33是Cortex-M3和Cortex-M4的继任者,性能更强,具有DSP浮点运算功能。 据悉,ARM Cortex-M23与Cortex-M33是首款基于ARM公司最新的ARMv8-M架构的嵌入式处理器,而Cortex-M0/0+、Cortex-M3、Cortex-M4和Cortex-M7则是基于上一代的ARMv7-M架构。 Cortex-M33是首款采用TrustZone安全技术和数字信号处理技术的ARMv8-M全功能实现处理器。该处理器可以支持大量灵活的配置选项,并在广泛应用中进行部署,此外还提供专用的协同处理器界面以支持经常需要加速和大量运算的运作。Cortex-M33是一款在性能、功耗、安全与生产力之间达到最佳平衡的处理器。 为了显著降低系统功耗,Cortex-M33处理器采用有序三阶管线技术。大部分指令在头两个阶段就能完成,而复杂的指令则需要3个阶段。此外,某些16位指令将采用双发射机制,以增强性能。处理器内核有两个AMBA 5 AHB5界面:C-AHB和S-AHB,完全对称,指令和数据提取性能不分伯仲。 二、M33的特点 Arm® Cortex®-M33 内核处理器适用于需要高效的安全性或数字信号控制的IoT和嵌入式应用。该处理器有许多可选功能,其中包括数字信号处理扩展(DSP)、用于实现硬件强制隔离的TrustZone安全、存储器保护单元(MPU)和浮点单元(FPU)。 Cortex-M33比Cortex-M4的性能大约高20%,并达到了1.5 DMIPS/MHz和4.02 CoreMark/MHz。Cortex-M33处理器可实现实时确定性、能效、软件生产率和系统安全性的最佳综合。这为许多跨不同行业的新应用和机会开启了大门。 M系列处理器的性能天梯如下图:
上图为同等主频下,各个内核可以提供的运算性能的大概的对比关系,评判一个处理器处理性能一直是一个难题,有很多的评判标准,上图是ARM官网提供的,Cortex-M系列在ARM官网上一直是以Coremark分数为主要评测标准,大家可以参考,真实的性能对比还要看具体应用。 Arm® Cortex®-M33内核的关键特性· Armv8-M架构 · AHB-lite总线接口,哈佛总线架构 · Thumb/Thumb-2子集指令支持 · 3段流水线 · 适用于Armv8-M的可选TrustZone,带多达8个区域的可选安全属性单元 · DSP扩展:可选DSP/SIMD指令、单周期16/32位MAC、单周期双16位MAC、8/16位SIMD运算 · 浮点单元:可选单精度浮点单元、符合IEEE 754标准 · 可选存储器保护单元(MPU),每种安全状态下具有多达16个区域 · 不可屏蔽中断(NMI)和多达480个物理中断,具有8到256个优先级 · 唤醒中断控制器 · 多种休眠模式,带集成式等待中断(WFI)、等待事件(WFE)以及退出时睡眠功能、睡眠和深度睡眠信号 · JTAG和串行线调试端口,具有多达8个断点和4个观察点 · 可选指令跟踪(ETM)、微跟踪缓冲区(MTB)、数据跟踪(DWT)和指令跟踪(ITM) 三、SWM34SVE_LCM_DEMO开发板 SWM34SVE_LCM_DEMO开发板因主打屏驱,所以开发板的硬件堆料大多和屏幕驱动相关,预留了多种屏幕接口,总体堆料扎实,在以往的测评中,这种硬件堆料可以在我这里排前三。值得一提的是测评提供了一块4.3寸、800*480分辨率的液晶显示屏,可谓诚意满满,同时排针随板发出,开发板不焊接排针,方便用户自行安排焊接,自由度较高。 以M33为内核的主控SWM34SVE,主频为150MHz,只能说中规中矩,比其他家的M33内核的某些产品会低一些,但是价格相对于竞品低的可怕,相比较下来,性价比相当之高。其中DMA2D,TFT-LCD,JPEG等强大的模块加持,在屏驱表现上更具竞争力。 四、开发环境搭建 下载官方例程并加载DFP文件后,可以编译,但是无法下载。在使用创芯工坊的PW200烧录器,也就是DAP-LINK时,在KEIL中找不到芯片,其实就是keil版本过低,需要5.32以上版本,如果使用J-LINK则同时需要V9以上版本。 以上步奏完成后还可能会出现以下问题:
该问题出现的原因是RAM分配空间过小,调整可消除错误。 同时下载程序时不要将串口USB和MCU_USB接到电脑,也会出现下载出错。 五、CORDIC速度测试 CORDIC的基本思想在于借助坐标旋转来计算反正切值并得到正余弦信号所对应的角度,通过对矢量进行一系列固定角度的顺时针或者逆时针旋转来使矢量尽可能的与横轴正半轴重合,记录旋转过程中的角度值并进一步按照旋转方向进行运算就可以得到对应角度。为尽可能地减少计算所带来的负担,可以通过每次旋转特定角度以及适当的放缩来用加减以及移位操作来代替耗时较长的乘除运算。这样一来对于反正切值的计算不需要进行三角函数、反三角函数,乘除等复杂的运算,只需要进行足够次数的迭代旋转就可以得到对应角度。 SWM341的CORDIC模块需要14轮的迭代得到计算结果,单次迭代需要一个机器周期,因为ARM的芯片机器周期不好直接计算,所以我们以测试结果为参考,计算结果的输出有两种方式获取,一种是查询方式,通过不断的查询输出寄存器的DONE位为1时,可以读取有效返回值,如果采用中断方式,当中断来临,查询到 IF 寄存器 DONE 位状态为 1 时,根据需要,读 COS、SIN 或者 ARCTAN 寄存器即可 。 官方的例程中自带了CORDIC的相关例程,采用的方法是查询方式,代码如下: int main(void)
{
uint32_t input;
SystemInit();
SerialInit();
CORDIC_Init(CORDIC);
input = CORDIC_PI/6*16384;
if((input > 163) && (input < 25559)) //只能计算0.01~1.56之间的弧度
{
CORDIC_Sin(input);
while(CORDIC_Sin_IsDone() == 0);
printf("sin(30) = %f\r\n", CORDIC_Sin_Result()/16384.0);
}
input = CORDIC_PI/3*16384;
if((input > 163) && (input < 25559)) //只能计算0.01~1.56之间的弧度
{
CORDIC_Cos(input);
while(CORDIC_Cos_IsDone() == 0);
printf("cos(60) = %f\r\n", CORDIC_Cos_Result()/16384.0);
}
input = 1*16384;
if((input > 819) && (input < 10000*16384)) //只能计算0.05~10000之间的值
{
CORDIC_Arctan(input);
while(CORDIC_Arctan_IsDone() == 0);
printf("arctan(1) = pi/%d\r\n", (int)(CORDIC_PI/(CORDIC_Arctan_Result()/16384.0)));
}
while(1==1)
{
}
}
上述代码在主函数中进行sin,cos和arctan三次运算,并通过串口打印出结果,在上电初始化相关外设后进行计算,while循环为空函数,为了测试方便,我们把三个计算放入while循环,同时使能一个GPIO为输出,进行IO的翻转,每次计算结束都对IO进行一次翻转,连接上示波器查看波形。修改后代码如下: int main(void)
{
uint32_t input;
SystemInit();
SerialInit();
CORDIC_Init(CORDIC);
GPIO_Init(GPIOA, PIN5, 1, 0, 0, 0); //输出,接示波器
input = 1*16384;
while(1==1)
{
// if((input > 163) && (input < 25559)) //只能计算0.01~1.56之间的弧度
// {
// CORDIC_Sin(input);
// while(CORDIC_Sin_IsDone() == 0);
// GPIO_InvBit(GPIOA, PIN5);
// }
// input = CORDIC_PI/3*16384;
// if((input > 163) && (input < 25559)) //只能计算0.01~1.56之间的弧度
// {
// CORDIC_Cos(input);
// while(CORDIC_Cos_IsDone() == 0);
// GPIO_InvBit(GPIOA, PIN5);
// }
//
// input = 1*16384;
if((input > 819) && (input < 10000*16384)) //只能计算0.05~10000之间的值
{
CORDIC_Arctan(input);
while(CORDIC_Arctan_IsDone() == 0);
GPIO_InvBit(GPIOA, PIN5);
}
}
}
通过注解和取消注解,测试三个函数的单次执行时间,同时每一次计算完成都会翻转一次PA5,在示波器上显示如下图:
sin,cos和arctan均是14次迭代,也就是14个机器周期,所以时间是一样的,实际测试也如上图所示,都是276ns,此处的计算速度非常快,非常适合高速的系统。通过debug查看计算结果:
计算SIN(30°)与实际结果0.5非常接近,计算准确度较高。 缺陷:
因为是使用CORDIC,归根结底还是算法,受制于算法的限制,输入的弧度制会有限制,若输入值超限,需要自行进行转换,同时14次的迭代提高速度也限制了精度,从下图输出结果寄存器便可看出,实际有效值只有16位,具有一定的局限性。
六、总结 此次测评,可能不会有太多内容,因为公司项目时间的冲突,导致此次仅对未来项目的需求做了针对性的测评,后期计划测评其他性能,如果可以挤出时间。总的来说,这次的测评还是比较满意的,从活动的开展到开发板的外观以至硬件堆料,都做的很不错,但是官网的资料确实较为严重,必须加群获取,较为麻烦,官网很多的信息未填充,寻找资料较为繁琐。软件方面,官方的例程开放程度较好 ,例程相对丰富,开发起来很容易。
|