• 【正点原子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();
        }
    }
    
    • 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
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    从上面的代码中可以看出,本实验就是使用函数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分形图形。

  • 相关阅读:
    idea设置项目启动的JVM运行内存大小
    LevelSequence源码分析
    C++并发与多线程(8) | 互斥量
    朋友圈里都是中顶会的大神,是一种什么样的体验?
    应该选择网络安全还是程序员?
    界面组件DevExpress ASP.NET Core v22.1 - 增强数据导出功能
    大白话解析 Dubbo3.0
    P8976 「DTOI-4」排列,贪心
    Eyeshot 2022.3 Fem Released Crack
    计算机的发展史,让你想到了什么?
  • 原文地址:https://blog.csdn.net/weixin_55796564/article/details/134414873