7657|8

108

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【STM32F7设计大赛入侵者】进度贴:开启FPU进行图像处理 [复制链接]

折腾了那么久,终于有点好东西拿出来跟大家分享分享咯
1.确认编译器时候选择了FPU



2.勾选IAR自带的DSP库,不知道干嘛一定要用这个自带库,我在MDK测试都没有这么坑,(调了很久

3.添加宏定义__FPU_USED
__ICCARM__
__FPU_PRESENT
ARM_MATH_CM7
ARM_MATH_MATRIX_CHECK
ARM_MATH_ROUNDING

4.以下是DSP lib的定义,STM32F7属于小端单浮点型模式


5.添加代码,记得把DSP库的头文件路径加上
  1. #include "math.h"
  2. #include "arm_math.h"   

  3. #define DELTA 0.0001f

  4. uint8_t sin_cos_test(float angle,uint32_t times,uint8_t mode)
  5. {
  6.   float sinx,cosx;
  7.   float result;
  8.   uint32_t i=0;
  9.   if(mode==0)
  10.   {
  11.     for(i=0;i<times;i++)
  12.     {
  13.       cosx=cosf(angle);      //不使用 DSP 优化的 sin,cos 函数
  14.       sinx=sinf(angle);
  15.       result=sinx*sinx+cosx*cosx; //计算结果应该等于 1     
  16.       result=fabsf(result-1.0f); //对比与 1 的差值
  17.       if(result>DELTA)return 0XFF;//判断失败   
  18.       angle+=0.001f;      //角度自增
  19.     }
  20.   }else
  21.   {
  22.     for(i=0;i<times;i++)
  23.     {
  24.       cosx=arm_cos_f32(angle);  //使用 DSP 优化的 sin,cos 函数
  25.       sinx=arm_sin_f32(angle);
  26.       result=sinx*sinx+cosx*cosx; //计算结果应该等于 1     
  27.       result=fabsf(result-1.0f); //对比与 1 的差值
  28.       if(result>DELTA)return 0XFF;//判断失败   
  29.       angle+=0.001f;      //角度自增
  30.     }
  31.   }
  32.   return 0;//任务完成
  33. }   
  34. uint8_t timeout;//定时器溢出次数

  35. /* Private typedef -----------------------------------------------------------*/
  36. /* Private define ------------------------------------------------------------*/
  37. /* Private macro -------------------------------------------------------------*/
  38. /* Private variables ---------------------------------------------------------*/

  39. TIM_HandleTypeDef    TimHandle;

  40. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
  41. {
  42.   /*##-1- Enable peripheral clock #################################*/
  43.   /* TIMx Peripheral clock enable */
  44.   __HAL_RCC_TIM3_CLK_ENABLE();
  45.   
  46.   /*##-2- Configure the NVIC for TIMx ########################################*/
  47.   /* Set the TIMx priority */
  48.   HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);

  49.   /* Enable the TIMx global Interrupt */
  50.   HAL_NVIC_EnableIRQ(TIM3_IRQn);
  51. }
  52. void initTIM3(void)
  53. {
  54.   /* Compute the prescaler value to have TIMx counter clock equal to 10000 Hz */
  55.   /* Set TIMx instance */
  56.   TimHandle.Instance = TIM3;

  57.   /* Initialize TIMx peripheral as follows:
  58.        + Period = 10000 - 1
  59.        + Prescaler = ((SystemCoreClock / 2)/10000) - 1
  60.        + ClockDivision = 0
  61.        + Counter direction = Up
  62.   */
  63.   TimHandle.Init.Period            = 65535;
  64.   TimHandle.Init.Prescaler         = (uint32_t)(HAL_RCC_GetSysClockFreq() / 2) ;
  65.   TimHandle.Init.ClockDivision     = 0;
  66.   TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  67.   TimHandle.Init.RepetitionCounter = 0;

  68.   if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
  69.   {
  70.     /* Initialization Error */
  71.     Error_Handler();
  72.   }

  73.   /*##-2- Start the TIM Base generation in interrupt mode ####################*/
  74.   /* Start Channel1 */
  75.   if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
  76.   {
  77.     /* Starting Error */
  78.     Error_Handler();
  79.   }  
  80. }
  81. /**
  82.   * [url=home.php?mod=space&uid=159083]@brief[/url]  Main program
  83.   * @param  None
  84.   * @retval None
  85.   */
  86. int main(void)
  87. {
  88.   uint8_t res;
  89.   float time;
  90.   uint8_t buf[50];
  91.   /* Enable the CPU Cache */
  92.   CPU_CACHE_Enable();

  93.   /* STM32F7xx HAL library initialization:
  94.        - Configure the Flash ART accelerator on ITCM interface
  95.        - Configure the Systick to generate an interrupt each 1 msec
  96.        - Set NVIC Group Priority to 4
  97.        - Global MSP (MCU Support Package) initialization
  98.      */
  99.   HAL_Init();
  100.   
  101.   /* Configure the system clock to 200 MHz */
  102.   SystemClock_Config();
  103.   
  104.   /* Configure LED1 */
  105.   BSP_LED_Init(LED1);
  106.   
  107.   /*##-1- Configure LCD ######################################################*/
  108.   LCD_Config();
  109.   
  110.   /* Configure TAMPER Button */
  111.   BSP_PB_Init(BUTTON_TAMPER, BUTTON_MODE_GPIO);   
  112.   
  113.   BSP_LCD_Clear(LCD_COLOR_WHITE);
  114. //  BSP_LCD_DisplayStringAtLine(8, (uint8_t*)"  Please insert SD Card                  ");

  115.   while(1)
  116.   {   
  117.      initTIM3();
  118.      timeout=0;
  119.      res=sin_cos_test(PI/6,200000,0); //不使用DSP库
  120.      time=TIM3->CNT+(uint32_t)65536*timeout;
  121.      sprintf((char*)buf,"Runtime:%0.6fms",time/10);
  122.      if(0==res)
  123.      {
  124.        BSP_LCD_DisplayStringAtLine(1, (uint8_t*)"No Use DSP");
  125.        BSP_LCD_DisplayStringAtLine(2, (uint8_t*)buf);
  126.       
  127.      }
  128.      else BSP_LCD_DisplayStringAtLine(8, (uint8_t*)"error");       
  129.      
  130.      initTIM3();
  131.      timeout=0;
  132.      res=sin_cos_test(PI/6,200000,1); //使用DSP库
  133.       time=TIM3->CNT+(uint32_t)65536*timeout;
  134.       sprintf((char*)buf,"Runtime:%0.6fms",time/10);
  135.       if(0==res)
  136.       {
  137.         BSP_LCD_DisplayStringAtLine(7, (uint8_t*)"Use DSP");
  138.         BSP_LCD_DisplayStringAtLine(8, (uint8_t*)buf);
  139.       }
  140.       else BSP_LCD_DisplayStringAtLine(8, (uint8_t*)"error");       
  141.   }
  142. }
  143. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  144. {
  145.   timeout++;
  146.   BSP_LED_Toggle(LED1);
  147. }
  148. //部分代码参考,正点原子,如有侵权请联系删除


复制代码
运行结果:

没有使用硬件浮点运算的效果
使用硬件浮点运算的效果



此帖出自stm32/stm8论坛

最新回复

STM32F7里面也是单精度浮点,跑跑单精度浮点算法还是比较强大的,可以秒低端A系ARM了 不过相对于同频率cortex M4,提升不大。 在拥有FPU的情况下,再去想用定点计算替代浮点,一般也没有意义。  详情 回复 发表于 2015-12-9 15:13
点赞 关注
 

回复
举报

6107

帖子

4

TA的资源

版主

沙发
 
楼主 顶一个 加油!
此帖出自stm32/stm8论坛
 
 

回复

2057

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
支持一下
此帖出自stm32/stm8论坛
 
 

回复

606

帖子

1

TA的资源

一粒金砂(中级)

4
 
F7的怎么看起来挺卡的  F103的有人做的很流畅的
此帖出自stm32/stm8论坛

点评

nmg
刚路过一个群,有一个大侠看到此帖云: “浮点数确实很花CPU时间,如果能通过移位实现 会快很多 之前做过一个项目,要求40us内发送一个数据(中断实现),用的是stm32f051c8,中断里有浮点运算,超过了40us,后  详情 回复 发表于 2015-12-9 11:02
 
个人签名疏雨客晚归,荒烟乱,几许江南无晴!又落花,残香织梦,莫  莫  莫,白首衷肠……
 
 

回复

5263

帖子

239

TA的资源

管理员

5
 
wajuka 发表于 2015-12-9 10:21
F7的怎么看起来挺卡的  F103的有人做的很流畅的

刚路过一个群,有一个大侠看到此帖云:

“浮点数确实很花CPU时间,如果能通过移位实现 会快很多
之前做过一个项目,要求40us内发送一个数据(中断实现),用的是stm32f051c8,中断里有浮点运算,超过了40us,后面优化成移位运算才能达到要求
在浮点数后加f比不加f效率高些”



此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

看来是我孤陋寡闻了  详情 回复 发表于 2015-12-9 11:08
 
 
 

回复

606

帖子

1

TA的资源

一粒金砂(中级)

6
 
nmg 发表于 2015-12-9 11:02
刚路过一个群,有一个大侠看到此帖云:

“浮点数确实很花CPU时间,如果能通过移位实现 会快很多
之 ...

看来是我孤陋寡闻了
此帖出自stm32/stm8论坛
 
个人签名疏雨客晚归,荒烟乱,几许江南无晴!又落花,残香织梦,莫  莫  莫,白首衷肠……
 
 

回复

846

帖子

0

TA的资源

纯净的硅(中级)

7
 
多谢楼主分享,也在学习FPU的部分,前来学习学习先,楼主加油加油了
此帖出自stm32/stm8论坛
 
 
 

回复

750

帖子

3

TA的资源

版主

8
 
论坛里再顶一次
此帖出自stm32/stm8论坛
 
个人签名

要666

 
 

回复

750

帖子

3

TA的资源

版主

9
 
STM32F7里面也是单精度浮点,跑跑单精度浮点算法还是比较强大的,可以秒低端A系ARM了
不过相对于同频率cortex M4,提升不大。
在拥有FPU的情况下,再去想用定点计算替代浮点,一般也没有意义。
此帖出自stm32/stm8论坛
 
个人签名

要666

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表