1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##
本章介绍使用APM32F407的FPU加速浮点运算。通过本章的学习,读者将学习到如何开启APM32F407的FPU。
本章分为如下几个小节:
55.1 硬件设计
55.2 程序设计
55.3 下载验证
55.1 硬件设计
55.1.1 例程功能
int main(void)
{
uint8_t key;
uint8_t i = 0;
uint8_t autorun = 0;
float time;
char buf[50];
NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3); /* 设置中断优先级分组为组3 */
sys_apm32_clock_init(336, 8, 2, 7); /* 配置系统时钟 */
delay_init(168); /* 初始化延时功能 */
usart_init(115200); /* 初始化串口 */
led_init(); /* 初始化LED */
key_init(); /* 初始化按键 */
lcd_init(); /* 初始化LCD */
btmr_tmrx_int_init(0xFFFF, 8400 - 1); /* 初始化基本定时器中断 */
lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "FPU TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "KEY_0:+", RED);
lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:AUTO/MANUL", RED);
delay_ms(500);
julia_clut_init(g_color_map); /* 初始化颜色表 */
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES:/* 增加缩放因子 */
{
i++;
if (i > (sizeof(zoom_ratio) / 2 - 1))
{
i = 0;
}
break;
}
case WKUP_PRES:/* 切换自动缩放 */
{
autorun = !autorun;
break;
}
default:
{
break;
}
}
if (autorun != 0)/* 自动缩放 */
{
LED1(0);
i++;
if (i > (sizeof(zoom_ratio) / 2 - 1))
{
i = 0;
}
}
else
{
LED1(1);
}
/* 设置窗口 */
lcd_set_window(0, 0, lcddev.width, lcddev.height);
lcd_write_ram_prepare();
/* 重设基本定时器的计数器值 */
TMR_ConfigCounter(BTMR_TMRX_INT, 0);
g_timeout = 0;
/* 产生Julia分形图形 */
julia_generate_fpu( lcddev.width, lcddev.height,
lcddev.width / 2, lcddev.height / 2,
zoom_ratio[i]);
/* 计算耗时 */
time = TMR_ReadCounter(BTMR_TMRX_INT) + (uint32_t)g_timeout * 0x10000;
/* 显示当前运行情况 */
sprintf(buf, "%s: zoom:%d runtime:%0.1fms\r\n",
SCORE_FPU_MODE, zoom_ratio[i], time / 10);
lcd_show_string(5, lcddev.height - 5 - 12, lcddev.width - 5,
12, 12, buf, RED);
printf("%s", buf);
LED0_TOGGLE();
}
}
从上面的代码中可以看出,本实验就是使用函数julia_genetate_fpu()实时产生Julia分形图形,并在LCD上进行显示,同时通过TMR6计算函数julia_generate_fpu()的执行时间,并将执行时间在LCD上进行显示。
本章实验要对比开启和关闭FPU的实验效果,在Options for Target窗口的Target选项卡中可以开启或关闭使用FPU,如下图所示:
图55.2.1.1 FPU开关
上图中的Floating Point Hardware选择“Not Used”就表示不使用硬件FPU,选择“Single Precision”就表示使用硬件FPU。
55.3 下载验证
在FPU开启和关闭的情况下,分别完成编译和烧录操作后,可以看到,LCD自动刷新显示了Julia分形图形,并且可以看到在不开启FPU的情况下生成并显示第一张Julia分形图像,大约耗时3000+毫秒,而在开启FPU后生成并显示第一张Julia分形图像的耗时缩短为300+毫秒,两者相差近10倍,由此可见使用FPU的优势。
通过可按下KEY0按键重新生成并显示不同缩放因子的Julia分形图像,也可按下KEY_UP按键使程序不断自动切换缩放因子,并重新生成和显示Julia分形图形。