【MM32F5270开发板试用】浮点数学运算初体验
本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Jearion
非常有幸参加本次灵动MM32F5270开发板的试用活动,感谢技术社区与厂家给予的宝贵机会。
本次测试着眼于对芯片的浮点及DSP运算的性能及应用评估。
1、开发板上手
利用开发板附带的USB Type-C线、PWLINK即可实现电源供给和基本的调试需要。
在安装MindMotion.MM32F5277E_DFP.0.0.6.pack遇到如下的报错,更新MDK版本后重新安装,问题得以解决。
2、测试准备
与其它M系列芯片数学运算应用类似,应当找到相应的数学库,添加头文件,方可进行下一步操作。
如下图所示,新建了math文件夹,将数学库和头文件添加进去。
一般情况下,在进行其它型号M系列芯片数学运算开发时,还要添加必要的FPU和MATH宏,但这里却并不必要,实际测试下来,并没有什么影响。
3、测试说明
测试工程是基于MindSDK的plus-f5270_uart_basic_mdk进行的。
首先添加了SysTick相关配置,以保证能够统计相应计算的ticks消耗。
void delay_1ms(uint32_t count)
{
delay =count;while (0U != delay){}
}
void delay_decrement(void)
{
if(0U != delay){ delay--;}
}
void SysTick_Init(void)
{
if(SysTick_Config(CLOCK_SYS_FREQ/1000U)){ while (1) { } }NVIC_SetPriority(SysTick_IRQn, 0x00U);
}
void SysTick_Handler(void)
{
delay_decrement();
}
对正弦余弦的运算进行了编码测试,取10次循环运算的效果进行比对。
void SinCosTest(){ int i; int n = 10; volatile uint32_t start; float32_t res; float32_t fix = PI / 3.0; printf("test arm_cos_f32 tick:\r\n"); start = SysTick->VAL; for (i = 0; i VAL; for (i = 0; i VAL; for (i = 0; i VAL; for (i = 0; i < n; i++) { res = sin(PI * i / n); } PrintCostTicks(start); }
另外对FFT运算,DFT运算,Park矩阵变换,滤波运算都进行了编码测试。
void TestAlgorithm(){ InitPark32Matrix(); InitAlgorithmData(); FFTCalcu(); DFTCalcu(testBuf,TEST_BUF_SIZE,TEST_BUF_SIZE/2,sComplexDFT); arm_cmplx_mag_f32((float32_t *)&sComplexDFT,harmanicDFT,TEST_BUF_SIZE); InitPark22Matrix(testRad); Park32Conversion(testI,testIOut); Park23Conversion(testIPQIn,testIOut); LPFFilter(testBuf,testLPFOut,TEST_BUF_SIZE);}
//FFT
void FFTCalcu(void){ arm_cfft_instance_f32 s; switch (TEST_BUF_SIZE) { case 64: s = arm_cfft_sR_f32_len64; break; case 128: s = arm_cfft_sR_f32_len128; break; case 256: s = arm_cfft_sR_f32_len256; break; case 512: s = arm_cfft_sR_f32_len512; break; case 1024: s = arm_cfft_sR_f32_len1024; break; case 2048: s = arm_cfft_sR_f32_len4096; break; default: s = arm_cfft_sR_f32_len256; break; } arm_cfft_f32(&s,(float32_t *)&sComplexFFT,0,1); arm_cmplx_mag_f32((float32_t *)&sComplexFFT,harmanicFFT,TEST_BUF_SIZE / 2);}
//LPF滤波
void LPFFilter(float32_t *pSrc,float32_t *pDst,uint32_t blockSize){ uint32_t i; //初始化滤波器 arm_biquad_cascade_df1_init_f32(&sLPFFilter,LPF_STAGE,coeffLPF,stateLPF); //使用滤波器 arm_biquad_cascade_df1_f32(&sLPFFilter,pSrc,pDst,blockSize); for (i = 0; i < blockSize; i++) { *(pDst + i) *= scaleLPFCoeff; } }
其中,取一周波256点的数据做FFT运算,cost ticks: 33457。需要说明的是,这些测试采用的都是0级优化条件下进行的。
另外,芯片提供了CORDIC算法用于三角函数的计算,对此也做了相应的编码测试。
//采用CORDIC IP进行atan计算
uint32_t AtanCordic(uint32_t x,uint32_t y){ //写入CR寄存器 CORDIC->CR &= ~(CORDIC_CR_ENABLE_MASK | CORDIC_CR_START_MASK | CORDIC_CR_STARTMODE_MASK | CORDIC_CR_WORKMODE_MASK); CORDIC->CR |= CORDIC_CR_ENABLE(1) | CORDIC_CR_START(0) | CORDIC_CR_WORKMODE(0) | CORDIC_CR_STARTMODE(0); //CORDIC->CR = (uint32_t)0x00000008; //CORDIC_CR_ENABLE(1); //DY值写入 CORDIC->DYR = (uint32_t)y; //DZ写入 CORDIC->DZR = (uint32_t)0; //查询状态,等待空闲 while(CORDIC->SR == 1); //DX写入 CORDIC->DXR = (uint32_t)x; while (CORDIC->SR == 1); return CORDIC->RZR;}
//采用CORDIC计算sin,cos
void SinCosCordic(uint32_t x,uint32_t y,uint32_t z,uint32_t *reslutSin,uint32_t *resultCos){ CORDIC->CR = 0x0E; CORDIC->DXR = x; CORDIC->DYR = y; CORDIC->DZR = z; while(CORDIC->SR == 1); CORDIC->CR = 0x0F; while(CORDIC->SR == 1); *reslutSin = CORDIC->RYR; *resultCos = CORDIC->RXR;}
4、测试结论
该款MM32F5270与市场上使用较广的TI 28335频率相同,但运算性能、片内资源和可扩展性上均有较大的竞争优势,是国产化替代的又一强有力产品,应用前景十分值得期待。