(实验46)单片机,STM32F4学习笔记,代码讲解【FPU测试实验】【正点原子】【原创】


其它文章链接,独家吐血整理

(实验3)单片机,STM32F4学习笔记,代码讲解【按键输入实验】【正点原子】【原创】
(实验4)单片机,STM32F4学习笔记,代码讲解【串口实验】【正点原子】【原创】
(实验5)单片机,STM32F4学习笔记,代码讲解【外部中断实验】【正点原子】【原创】
(实验6,实验7)单片机,STM32F4学习笔记,代码讲解【看门狗实验】【正点原子】【原创】
(实验8)单片机,STM32F4学习笔记,代码讲解【定时器实验】【正点原子】【原创】
(实验9)单片机,STM32F4学习笔记,代码讲解【PWM输出实验】【正点原子】【原创】
(实验10)单片机,STM32F4学习笔记,代码讲解【输入捕获实验】【正点原子】【原创】
(实验11)单片机,STM32F4学习笔记,代码讲解【电容触摸按键实验】【正点原子】【原创】
(实验12)单片机,STM32F4学习笔记,代码讲解【OLED显示实验】【正点原子】【原创】
(实验13)单片机,STM32F4学习笔记,代码讲解【TFTLCD彩屏显示实验】【正点原子】【原创】
(实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】
(实验17)单片机,STM32F4学习笔记,代码讲解【待机唤醒实验】【正点原子】【原创】
(实验23)单片机,STM32F4学习笔记,代码讲解【DMA实验】【正点原子】【原创】
(实验25)单片机,STM32F4学习笔记,代码讲解【SPI实验】【正点原子】【原创】
(实验34)单片机,STM32F4学习笔记,代码讲解【FLASH模拟EEPROM实验】【正点原子】【原创】
(实验36)单片机,STM32F4学习笔记,代码讲解【外部SRAM实验】【正点原子】【原创】
(实验37)单片机,STM32F4学习笔记,代码讲解【内存管理实验】【正点原子】【原创】
(实验38)单片机,STM32F4学习笔记,代码讲解【SD卡实验】【正点原子】【原创】
(实验39)单片机,STM32F4学习笔记,代码讲解【FATFS实验】【正点原子】【原创】
(实验46)单片机,STM32F4学习笔记,代码讲解【FPU测试实验】【正点原子】【原创】
(实验47)单片机,STM32F4学习笔记,代码讲解【DSP-FFT测试实验】【正点原子】【原创】
(实验50)单片机,STM32F4学习笔记,代码讲解【串口IAP实验】【正点原子】【原创】
(实验50)单片机,STM32F4学习笔记,代码讲解【串口IAP实验-RTC时钟实验】【正点原子】【原创】
(实验55)单片机,STM32F4学习笔记,代码讲解【网络通信实验】【正点原子】【原创】

实验现象

本实验开机后,根据迭代次数生成颜色表(RGB565),然后计算Julia分形,并显示到LCD上面。同时,程序开启了定时器3,用于统计一帧所要的时间(ms),在一帧Julia分形图片显示完成后,程序会显示运行时间、当前是否使用FPU和缩放因子(zoom)等信息,方便观察对比。KEY0/KEY2用于调节缩放因子,KEY_UP用于设置自动缩放,还是手动缩放。DS0用于提示程序运行状况。

主程序

u8 timeout;

int main(void)
{ 
	u8 key;
	u8 i=0;
	u8 autorun=0;
	float time; 
	u8 buf[50];
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	uart_init(115200);		//初始化串口波特率为115200
	
 
	
	LED_Init();					//初始化LED
	KEY_Init();
 	LCD_Init();
 
	TIM3_Int_Init(65535,8400-1);//10Khz计数频率,最大计时6.5秒超出
	POINT_COLOR=RED; 
	LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");	
	LCD_ShowString(30,70,200,16,16,"FPU TEST");	
	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,110,200,16,16,"2014/7/2");	
	LCD_ShowString(30,130,200,16,16,"KEY0:+    KEY2:-");	//显示提示信息
	LCD_ShowString(30,150,200,16,16,"KEY_UP:AUTO/MANUL");	//显示提示信息	
	delay_ms(1200);
	POINT_COLOR=BLUE;	//设置字体为蓝色 
	InitCLUT(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 KEY2_PRES:
				if(i)i--;
				else i=sizeof(zoom_ratio)/2-1;
				break;
			case WKUP_PRES:
				autorun=!autorun;	//自动/手动
				break;
		} 
		if(autorun==1)//自动时,自动设置缩放因子
		{
			i++;
			if(i>sizeof(zoom_ratio)/2-1)i=0;//限制范围
		}
		LCD_Set_Window(0,0,lcddev.width,lcddev.height);//设置窗口
		LCD_WriteRAM_Prepare();
		TIM3->CNT=0;//重设TIM3定时器的计数器值
		timeout=0;
		GenerateJulia_fpu(lcddev.width,lcddev.height,lcddev.width/2,lcddev.height/2,zoom_ratio[i]);
		time=TIM3->CNT+(u32)timeout*65536;
		sprintf((char*)buf,"%s: zoom:%d  runtime:%0.1fms\r\n",SCORE_FPU_MODE,zoom_ratio[i],time/10);
		LCD_ShowString(5,lcddev.height-5-12,lcddev.width-5,12,12,buf);//显示当前运行情况	 
		printf("%s",buf);//输出到串口
		LED0=!LED0;
	}
}

FPU初始化程序

//46_1,本版本为开启硬件FPU版本.

//FPU模式提示
#if __FPU_USED==1
#define SCORE_FPU_MODE                  "FPU On" 
#else
#define SCORE_FPU_MODE                  "FPU Off" 
#endif

#define 	ITERATION			128			//迭代次数
#define	 	REAL_CONSTANT		0.285f		//实部常量
#define	 	IMG_CONSTANT		0.01f		//虚部常量
//颜色表
u16 color_map[ITERATION];
//缩放因子列表
const u16 zoom_ratio[] =
{
	120, 110, 100, 150, 200, 275, 350, 450,
	600, 800, 1000, 1200, 1500, 2000, 1500,
	1200, 1000, 800, 600, 450, 350, 275, 200,
	150, 100, 110,
}; 

//初始化颜色表
//clut:颜色表指针
void InitCLUT(u16 * clut)
{
 	u32 i=0x00;
	u16  red=0,green=0,blue=0;  
	for(i=0;i<ITERATION;i++)//产生颜色表
	{
		//产生RGB颜色值
		red=(i*8*256/ITERATION)%256;
		green=(i*6*256/ITERATION)%256;
		blue=(i*4*256 /ITERATION)%256; 
 		//将RGB888,转换为RGB565
		red=red>>3;
		red=red<<11;
		green=green>>2;
		green=green<<5;
		blue=blue>>3; 
		clut[i]=red+green+blue;
	}
} 

//产生Julia分形图形
//size_x,size_y:屏幕x,y方向的尺寸
//offset_x,offset_y:屏幕x,y方向的偏移
//zoom:缩放因子
void GenerateJulia_fpu(u16 size_x,u16 size_y,u16 offset_x,u16 offset_y,u16 zoom)
{
	u8 i;
	u16 x,y;  
	float tmp1,tmp2;
	float num_real,num_img;
	float radius; 
	for(y=0;y<size_y;y++)
	{
       	for(x=0;x<size_x;x++)
   		{
       		num_real=y-offset_y;
         	num_real=num_real/zoom;
           	num_img=x-offset_x;
          	num_img=num_img/zoom;
           	i=0;
          	radius=0;
           	while((i<ITERATION-1)&&(radius<4))
           	{
           		tmp1=num_real*num_real;
               	tmp2=num_img*num_img;
              	num_img=2*num_real*num_img+IMG_CONSTANT;
             	num_real=tmp1-tmp2+REAL_CONSTANT;
               	radius=tmp1+tmp2;
              	i++;
           	}
			LCD->LCD_RAM=color_map[i];//绘制到屏幕 
       	}
	}
}

代码讲解

//FPU=浮点运算单元=float point unit=F4硬件FPU,用于数据处理,算法处理
//1步设置CPACR寄存器bit20-23为1,使能硬件FPU,2步MDK中target设置,至此完成很简单
//第一步操作在stm32f4xx文件里开启,此代码默认已开启,第二步就是__FPU_USED=1(stm32f4xx.h文件里开启之后还要MDK设置一下)
//const=关键字,限制变量不允许被改变,可以提高程序的安全性和可靠性

//i=sizeof(zoom_ratio)/2-1;
//上面这句话,因为数组是u16类型=2个字节,所以数组长度每个成员都是2所以要/2,然后还要-1
// if(autorun==1)//自动时,自动设置缩放因子
// {
// i++;
// if(i>sizeof(zoom_ratio)/2-1)i=0;//限制范围
// }
//我以为自动是什么,好高级呢,原来只是i的值在变化而已,哈哈,期待一场落空

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值