• 【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)
    {
    }
    
    • 1
    • 2
    • 3
    • 4

    }

    void delay_decrement(void)
    {

    if(0U != delay)
    {
        delay--;
    }
    
    • 1
    • 2
    • 3
    • 4

    }

    void SysTick_Init(void)
    {

    if(SysTick_Config(CLOCK_SYS_FREQ/1000U))
    {
        while (1)
        {
    
        }        
    }
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    }

    void SysTick_Handler(void)
    {

    delay_decrement();
    
    • 1

    }
    对正弦余弦的运算进行了编码测试,取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 < n; i++)
        {
            res = arm_cos_f32(PI * i / n);
        }
        PrintCostTicks(start);
        
        printf("test arm_sin_f32 tick:\r\n");
        start = SysTick->VAL;
        for (i = 0; i < n; i++)
        {
            res = arm_sin_f32(PI * i / n);
        }
        PrintCostTicks(start);
        
        printf("test cos tick:\r\n");
        start = SysTick->VAL;
        for (i = 0; i < n; i++)
        {
            res = cos(PI * i / n);
        }
        PrintCostTicks(start);
    
        printf("test sin tick:\r\n");
        start = SysTick->VAL;
        for (i = 0; i < n; i++)
        {
            res = sin(PI * i / n);
        }
        PrintCostTicks(start);    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    另外对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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    //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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    //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;
        }    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    其中,取一周波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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    //采用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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、测试结论

    该款MM32F5270与市场上使用较广的TI 28335频率相同,但运算性能、片内资源和可扩展性上均有较大的竞争优势,是国产化替代的又一强有力产品,应用前景十分值得期待。

  • 相关阅读:
    【附源码】Python计算机毕业设计球迷信息交流论坛
    熔断、限流、降级 —— SpringCloud Alibaba Sentinel
    教程 - 深度探讨在 Vue3 中引入 CesiumJS 的最佳方式
    生物素-磺酸-NHS 酯,119616-38-5,Biotin-Sulfo-NHS ester
    进程调度的基本过程
    大数据课程L8——网站流量项目的SparkStreaming整合代码
    001:你好Direct 2D! 在对话框中初次使用D2D
    50、IO流
    Mysql - 索引
    Ubuntu20.04安装 nginx1.23.1
  • 原文地址:https://blog.csdn.net/weixin_47569031/article/details/127404099