【正点原子STM32连载】第五十五章 FPU测试(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

第五十五章 FPU测试(Julia分形)实验

本章介绍使用APM32F407的FPU加速浮点运算。通过本章的学习,读者将学习到如何开启APM32F407的FPU。
本章分为如下几个小节:
55.1 硬件设计
55.2 程序设计
55.3 下载验证

55.1 硬件设计
55.1.1 例程功能

  1. 程序运行后,根据迭代次数生成颜色表,然后计算Julia分形,并在LCD上进行显示
  2. LCD和USART会提示单次计算Julia分形的耗时
  3. 按下KEY0或KEY_UP按键,可分别进行增加缩放因子和切换自动缩放的操作
  4. LED1亮起,提示正启用切换自动缩放,反之则禁用
  5. LED0闪烁,指示程序正在运行
    55.1.2 硬件资源
  6. LED
    LED0 - PF9
    LED1 - PF10
  7. 按键
    KEY0 - PE4
    KEY_UP - PA0
  8. USART1
  9. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  10. FPU
  11. 基本定时器6
    55.1.3 原理图
    本章实验使用的FPU为APM32F407的片上资源,因此没有对应的连接原理图。
    55.2 程序设计
    55.2.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,如下图所示:
【正点原子STM32连载】第五十五章 FPU测试(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南_第1张图片

图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分形图形。

你可能感兴趣的:(stm32,julia,嵌入式硬件)