[其他] 【MM32F5270开发板试用】浮点数**算初体验

[复制链接]
 楼主| l63t89 发表于 2023-2-25 10:53 | 显示全部楼层 |阅读模式
非常有幸参加本次灵动MM32F5270开发板的试用活动,感谢技术社区与厂家给予的宝贵机会。
本次测试着眼于对芯片的浮点及DSP运算的性能及应用评估。

1、开发板上手
利用开发板附带的USB Type-C线、PWLINK即可实现电源供给和基本的调试需要。

5119963f978164163b.png

在安装MindMotion.MM32F5277E_DFP.0.0.6.pack遇到如下的报错,更新MDK版本后重新安装,问题得以解决。

7774363f9781ca7a2e.png

3158163f97822a3603.png
————————————————


评论

版权声明:本文为CSDN博主「极术社区」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_47569031/article/details/127404099  发表于 2023-2-25 10:53
 楼主| l63t89 发表于 2023-2-25 10:54 | 显示全部楼层
2、测试准备
与其它M系列芯片数**算应用类似,应当找到相应的数学库,添加头文件,方可进行下一步操作。
2966963f97853a7bfe.png
 楼主| l63t89 发表于 2023-2-25 10:56 | 显示全部楼层
如下图所示,新建了math文件夹,将数学库和头文件添加进去。
13963f978c2637c2.png
 楼主| l63t89 发表于 2023-2-25 10:56 | 显示全部楼层
一般情况下,在进行其它型号M系列芯片数**算开发时,还要添加必要的FPU和MATH宏,但这里却并不必要,实际测试下来,并没有什么影响。
3049863f978cf06c72.png
 楼主| l63t89 发表于 2023-2-25 10:57 | 显示全部楼层
测试说明
测试工程是基于MindSDK的plus-f5270_uart_basic_mdk进行的。
首先添加了SysTick相关配置,以保证能够统计相应计算的ticks消耗。
  1. void delay_1ms(uint32_t count)
  2. {

  3. delay =count;
  4. while (0U != delay)
  5. {
  6. }
  7. 1
  8. 2
  9. 3
  10. 4
  11. }

  12. void delay_decrement(void)
  13. {

  14. if(0U != delay)
  15. {
  16.     delay--;
  17. }
  18. 1
  19. 2
  20. 3
  21. 4
  22. }

  23. void SysTick_Init(void)
  24. {

  25. if(SysTick_Config(CLOCK_SYS_FREQ/1000U))
  26. {
  27.     while (1)
  28.     {

  29.     }        
  30. }
  31. NVIC_SetPriority(SysTick_IRQn, 0x00U);
  32. 1
  33. 2
  34. 3
  35. 4
  36. 5
  37. 6
  38. 7
  39. 8
  40. }

  41. void SysTick_Handler(void)
  42. {

  43. delay_decrement();
  44. 1
  45. }
 楼主| l63t89 发表于 2023-2-25 10:57 | 显示全部楼层
对正弦余弦的运算进行了编码测试,取10次循环运算的效果进行比对。
  1. void SinCosTest()
  2. {
  3.     int i;
  4.     int n = 10;
  5.     volatile uint32_t start;
  6.     float32_t res;
  7.     float32_t fix = PI / 3.0;

  8.     printf("test arm_cos_f32 tick:\r\n");
  9.     start = SysTick->VAL;
  10.     for (i = 0; i < n; i++)
  11.     {
  12.         res = arm_cos_f32(PI * i / n);
  13.     }
  14.     PrintCostTicks(start);
  15.    
  16.     printf("test arm_sin_f32 tick:\r\n");
  17.     start = SysTick->VAL;
  18.     for (i = 0; i < n; i++)
  19.     {
  20.         res = arm_sin_f32(PI * i / n);
  21.     }
  22.     PrintCostTicks(start);
  23.    
  24.     printf("test cos tick:\r\n");
  25.     start = SysTick->VAL;
  26.     for (i = 0; i < n; i++)
  27.     {
  28.         res = cos(PI * i / n);
  29.     }
  30.     PrintCostTicks(start);

  31.     printf("test sin tick:\r\n");
  32.     start = SysTick->VAL;
  33.     for (i = 0; i < n; i++)
  34.     {
  35.         res = sin(PI * i / n);
  36.     }
  37.     PrintCostTicks(start);   
  38. }
 楼主| l63t89 发表于 2023-2-25 10:57 | 显示全部楼层
 楼主| l63t89 发表于 2023-2-25 10:58 | 显示全部楼层
另外对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);
}
 楼主| l63t89 发表于 2023-2-25 10:58 | 显示全部楼层
//FFT
  1. void FFTCalcu(void)
  2. {
  3.     arm_cfft_instance_f32 s;
  4.     switch (TEST_BUF_SIZE)
  5.     {
  6.     case 64:
  7.         s = arm_cfft_sR_f32_len64;
  8.         break;
  9.     case 128:
  10.         s = arm_cfft_sR_f32_len128;
  11.         break;
  12.     case 256:
  13.         s = arm_cfft_sR_f32_len256;
  14.         break;
  15.     case 512:
  16.         s = arm_cfft_sR_f32_len512;
  17.         break;
  18.     case 1024:
  19.         s = arm_cfft_sR_f32_len1024;
  20.         break;
  21.     case 2048:
  22.         s = arm_cfft_sR_f32_len4096;
  23.         break;
  24.     default:
  25.         s = arm_cfft_sR_f32_len256;
  26.         break;
  27.     }
  28.     arm_cfft_f32(&s,(float32_t *)&sComplexFFT,0,1);
  29.     arm_cmplx_mag_f32((float32_t *)&sComplexFFT,harmanicFFT,TEST_BUF_SIZE / 2);
  30. }
 楼主| l63t89 发表于 2023-2-25 10:58 | 显示全部楼层
//LPF滤波
  1. void LPFFilter(float32_t *pSrc,float32_t *pDst,uint32_t blockSize)
  2. {
  3.     uint32_t i;
  4.     //初始化滤波器
  5.     arm_biquad_cascade_df1_init_f32(&sLPFFilter,LPF_STAGE,coeffLPF,stateLPF);

  6.     //使用滤波器
  7.     arm_biquad_cascade_df1_f32(&sLPFFilter,pSrc,pDst,blockSize);

  8.     for (i = 0; i < blockSize; i++)
  9.     {
  10.         *(pDst + i) *= scaleLPFCoeff;
  11.     }   
  12. }
 楼主| l63t89 发表于 2023-2-25 10:58 | 显示全部楼层
其中,取一周波256点的数据做FFT运算,cost ticks: 33457。需要说明的是,这些测试采用的都是0级优化条件下进行的。
另外,芯片提供了CORDIC算法用于三角函数的计算,对此也做了相应的编码测试。
 楼主| l63t89 发表于 2023-2-25 10:59 | 显示全部楼层
//采用CORDIC IP进行atan计算
  1. uint32_t AtanCordic(uint32_t x,uint32_t y)
  2. {
  3.     //写入CR寄存器
  4.     CORDIC->CR &= ~(CORDIC_CR_ENABLE_MASK | CORDIC_CR_START_MASK | CORDIC_CR_STARTMODE_MASK | CORDIC_CR_WORKMODE_MASK);
  5.     CORDIC->CR |= CORDIC_CR_ENABLE(1) | CORDIC_CR_START(0)
  6.                   | CORDIC_CR_WORKMODE(0) | CORDIC_CR_STARTMODE(0);
  7.     //CORDIC->CR = (uint32_t)0x00000008;
  8.     //CORDIC_CR_ENABLE(1);
  9.     //DY值写入
  10.     CORDIC->DYR = (uint32_t)y;
  11.     //DZ写入
  12.     CORDIC->DZR = (uint32_t)0;
  13.     //查询状态,等待空闲
  14.     while(CORDIC->SR == 1);
  15.     //DX写入
  16.     CORDIC->DXR = (uint32_t)x;
  17.     while (CORDIC->SR == 1);
  18.     return CORDIC->RZR;
  19. }
 楼主| l63t89 发表于 2023-2-25 10:59 | 显示全部楼层
//采用CORDIC计算sin,cos
  1. void SinCosCordic(uint32_t x,uint32_t y,uint32_t z,uint32_t *reslutSin,uint32_t *resultCos)
  2. {
  3.     CORDIC->CR = 0x0E;
  4.     CORDIC->DXR = x;
  5.     CORDIC->DYR = y;
  6.     CORDIC->DZR = z;
  7.     while(CORDIC->SR == 1);
  8.     CORDIC->CR = 0x0F;
  9.     while(CORDIC->SR == 1);   
  10.     *reslutSin = CORDIC->RYR;
  11.     *resultCos = CORDIC->RXR;
  12. }
 楼主| l63t89 发表于 2023-2-25 11:00 | 显示全部楼层
测试结论
该款MM32F5270与市场上使用较广的TI 28335频率相同,但运算性能、片内资源和可扩展性上均有较大的竞争优势,是国产化替代的又一强有力产品,应用前景十分值得期待。
tpgf 发表于 2023-3-7 15:15 | 显示全部楼层
有米有测试过在进行大规模计算的时候会不会卡顿
wakayi 发表于 2023-3-7 15:33 | 显示全部楼层
我们可以通过什么参数来确定单片机更加适合进行数据处理呢
wowu 发表于 2023-3-7 15:48 | 显示全部楼层
我做一个比较 就是我们看上位机 的使用情况 一般看cpu的占比 那么单片机我们看什么呢
xiaoqizi 发表于 2023-3-7 16:00 | 显示全部楼层
l63t89 发表于 2023-2-25 11:00
测试结论
该款MM32F5270与市场上使用较广的TI 28335频率相同,但运算性能、片内资源和可扩展性上均有较大的 ...

浮点数进行Q化处理能充分发挥32位单片机的运算性能,但是精度受到限制而不会太高。
木木guainv 发表于 2023-3-7 16:27 | 显示全部楼层
浮点数比定点数加减法要困难,但是克服了定点数表示范围小的问题
磨砂 发表于 2023-3-7 16:39 | 显示全部楼层
我们不光 要拼硬件 还得比拼一下算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

1009

帖子

1

粉丝
快速回复 返回顶部 返回列表