0 【MM32F5270开发板试用】浮点数**算初体验 - - 21ic电子技术开发论坛
打印
[其他]

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

[复制链接]
815|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l63t89|  楼主 | 2023-2-25 10:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
非常有幸参加本次灵动MM32F5270开发板的试用活动,感谢技术社区与厂家给予的宝贵机会。
本次测试着眼于对芯片的浮点及DSP运算的性能及应用评估。

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



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




————————————————


使用特权

评论回复
评论
l63t89 2023-2-25 10:53 回复TA
版权声明:本文为CSDN博主「极术社区」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_47569031/article/details/127404099 
沙发
l63t89|  楼主 | 2023-2-25 10:54 | 只看该作者
2、测试准备
与其它M系列芯片数**算应用类似,应当找到相应的数学库,添加头文件,方可进行下一步操作。

使用特权

评论回复
板凳
l63t89|  楼主 | 2023-2-25 10:56 | 只看该作者
如下图所示,新建了math文件夹,将数学库和头文件添加进去。

使用特权

评论回复
地板
l63t89|  楼主 | 2023-2-25 10:56 | 只看该作者
一般情况下,在进行其它型号M系列芯片数**算开发时,还要添加必要的FPU和MATH宏,但这里却并不必要,实际测试下来,并没有什么影响。

使用特权

评论回复
5
l63t89|  楼主 | 2023-2-25 10:57 | 只看该作者
测试说明
测试工程是基于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
}

使用特权

评论回复
6
l63t89|  楼主 | 2023-2-25 10:57 | 只看该作者
对正弦余弦的运算进行了编码测试,取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);   
}

使用特权

评论回复
7
l63t89|  楼主 | 2023-2-25 10:57 | 只看该作者

使用特权

评论回复
8
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);
}

使用特权

评论回复
9
l63t89|  楼主 | 2023-2-25 10:58 | 只看该作者
//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);
}

使用特权

评论回复
10
l63t89|  楼主 | 2023-2-25 10:58 | 只看该作者
//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;
    }   
}

使用特权

评论回复
11
l63t89|  楼主 | 2023-2-25 10:58 | 只看该作者
其中,取一周波256点的数据做FFT运算,cost ticks: 33457。需要说明的是,这些测试采用的都是0级优化条件下进行的。
另外,芯片提供了CORDIC算法用于三角函数的计算,对此也做了相应的编码测试。

使用特权

评论回复
12
l63t89|  楼主 | 2023-2-25 10:59 | 只看该作者
//采用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;
}

使用特权

评论回复
13
l63t89|  楼主 | 2023-2-25 10:59 | 只看该作者
//采用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;
}

使用特权

评论回复
14
l63t89|  楼主 | 2023-2-25 11:00 | 只看该作者
测试结论
该款MM32F5270与市场上使用较广的TI 28335频率相同,但运算性能、片内资源和可扩展性上均有较大的竞争优势,是国产化替代的又一强有力产品,应用前景十分值得期待。

使用特权

评论回复
15
tpgf| | 2023-3-7 15:15 | 只看该作者
有米有测试过在进行大规模计算的时候会不会卡顿

使用特权

评论回复
16
wakayi| | 2023-3-7 15:33 | 只看该作者
我们可以通过什么参数来确定单片机更加适合进行数据处理呢

使用特权

评论回复
17
wowu| | 2023-3-7 15:48 | 只看该作者
我做一个比较 就是我们看上位机 的使用情况 一般看cpu的占比 那么单片机我们看什么呢

使用特权

评论回复
18
xiaoqizi| | 2023-3-7 16:00 | 只看该作者
l63t89 发表于 2023-2-25 11:00
测试结论
该款MM32F5270与市场上使用较广的TI 28335频率相同,但运算性能、片内资源和可扩展性上均有较大的 ...

浮点数进行Q化处理能充分发挥32位单片机的运算性能,但是精度受到限制而不会太高。

使用特权

评论回复
19
木木guainv| | 2023-3-7 16:27 | 只看该作者
浮点数比定点数加减法要困难,但是克服了定点数表示范围小的问题

使用特权

评论回复
20
磨砂| | 2023-3-7 16:39 | 只看该作者
我们不光 要拼硬件 还得比拼一下算法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

977

帖子

1

粉丝