#申请原创# #技术资源#
查看规格书发现,APM32E103系列除了可以兼容STM32F103系列外,还增加了一些外设功能。比如FPU、CAN2、外扩SDRAM等。
其中FPU(浮点运算单元)一般是在M4内核的芯片上才有的,可以大大提升浮点数的运算效率。
查看手册和SDK发现,APM32E103的FPU使用上是与M4内核自带的FPU有区别的,需要像使用外设一样开启时钟,调用封装好的库函数。
FPU库的sc_math.h中声明了能使用的浮点运算函数。
C语言中进行浮点运算,可以调用math.h来进行浮点计算。
接下来就简单对比测试下APM32E103的FPU与math.h中进行同样的sin()和cos运算,看计算时间分别是多少。
计算思路就是通过先清零TMR5计数值,读进行100次浮点运算前后的计数值来计算所用时间。
void TMR5_Init(void)
{
TMR_BaseConfig_T TMR_BaseConfigStruct;
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);
TMR_BaseConfigStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_BaseConfigStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_BaseConfigStruct.division = 7;
TMR_BaseConfigStruct.period = 0xFFFF;
TMR_BaseConfigStruct.repetitionCounter = 0;
TMR_ConfigTimeBase(TMR5, &TMR_BaseConfigStruct);
TMR_Enable(TMR5);
}
int main(void)
{
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_FPU);
RCM->CFG |= BIT27;
TMR5_Init();
Usart_Init();
a=10*PI/180;
printf("Angle=%5.11f\r\n",a);
TMR_ConfigCounter(TMR5,0);
m=TMR_ReadCounter(TMR5);
for (s = 0; s < 100; s++)
{
ans[0] = sc_math_sin(a);//FPU sin()
}
n=TMR_ReadCounter(TMR5);
printf("\r\nAPM32 FPU SIN(): %5.11f\r\n", ans[0]);
printf("Time:%d\r\n",(n-m));
TMR_ConfigCounter(TMR5,0);
m=TMR_ReadCounter(TMR5);
for (s = 0; s < 100; s++)
{
ans[1] = sin(a);//math.h SIN()
}
n=TMR_ReadCounter(TMR5);
printf("\r\nC math.h SIN(): %5.11f\r\n", ans[1]);
printf("Time:%d\r\n",(n-m));
TMR_ConfigCounter(TMR5,0);
m=TMR_ReadCounter(TMR5);
for (s = 0; s < 100; s++)
{
ans[0] = sc_math_cos(a);//FPU cos()
}
n=TMR_ReadCounter(TMR5);
printf("\r\nAPM32 FPU COS(): %5.11f\r\n", ans[0]);
printf("Time:%d\r\n",(n-m));
TMR_ConfigCounter(TMR5,0);
m=TMR_ReadCounter(TMR5);
for (s = 0; s < 100; s++)
{
ans[1] = cos(a);//math.h cos()
}
n=TMR_ReadCounter(TMR5);
printf("\r\nC math.h COS(): %5.11f\r\n", ans[1]);
printf("Time:%d\r\n",(n-m));
}
使用串口就能打印输出浮点运算值和所用时间。
输入角度为10°时的结果。
输入角度为120°的结果:
从计算结果来对比看,浮点运算值都还是比较准确的。
APM32E103的FPU对计算效率的提升还是很明显的,目前由于是硬件完成计算,不同的输入值对运算时间基本没有影响。
而使用math.h的sin()和cos()需要转换运算,不同输入值的计算时间都不一样。
整体而言APM32E103的FPU对支持的浮点运算函数,运算的效率和准确性还是很不错的,有比较多浮点运算的场合还是比较合适的。
|