你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求助ST32F103VBT6 采用HAL库的问题(浮点运算占用CPU)

[复制链接]
hjyhjy 提问时间:2018-8-20 17:25 /
大家好!
   最近我做了个小测试程序
///
void delay(u16  time)
   {
       u16        i=0;
       while(time--)
         {
                i=12000;
                while(i--);
         }
    }

   while(1)
    {
         delay(1000)
         LED=0;
         delay(1000);
         LED=1;
    }
     分别将此程序放置到HAL库和标准库中;  HAL库程序运行, 灯的亮灭时间特别长,标准库则基本是在1S左右亮灭切换,
  请大家帮忙分析 ;是什么原因。   特别是采用HAL库时,有浮点数运算,占用CPU时间特别长,占几百毫秒
  HAL库的初始化跟正点原子 一样
   HAL_Init();
   SystemClock_Config();
   谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!
  

收藏 评论11 发布时间:2018-8-20 17:25

举报

11个回答
hjyhjy 回答时间:2018-8-21 08:58:38
??顶一个
smallcsduck 回答时间:2018-8-21 09:24:39
你这个东西有啥浮点运算?
SystemClock_Config();里面pll配置的正确么?
主频是多少?

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

hjyhjy 回答时间:2018-8-21 09:27:32
void Stm32_Clock_Init(u32 PLL)
{
    HAL_StatusTypeDef ret = HAL_OK;
    RCC_OscInitTypeDef RCC_OscInitStructure;
    RCC_ClkInitTypeDef RCC_ClkInitStructure;
   
    RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;            //ʱÖÓԴΪHSE
    RCC_OscInitStructure.HSEState=RCC_HSE_ON;                              //´ò¿ªHSE
        RCC_OscInitStructure.HSEPredivValue=RCC_HSE_PREDIV_DIV1;                //HSEÔ¤·ÖƵ
    RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;                                        //´ò¿ªPLL
    RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;                        //PLLʱÖÓÔ´Ñ¡ÔñHSE
    RCC_OscInitStructure.PLL.PLLMUL=RCC_PLL_MUL9;                                                         //Ö÷PLL±¶ÆµÒò×Ó
    ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//³õʼ»¯
       
    if(ret!=HAL_OK) while(1);
   
    //Ñ¡ÖÐPLL×÷ΪϵͳʱÖÓÔ´²¢ÇÒÅäÖÃHCLK,PCLK1ºÍPCLK2
    RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
    RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;                //ÉèÖÃϵͳʱÖÓʱÖÓԴΪPLL
    RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;                                //AHB·ÖƵϵÊýΪ1
    RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV2;                                 //APB1·ÖƵϵÊýΪ2
    RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV1;                                 //APB2·ÖƵϵÊýΪ1
    ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_2);        //ͬʱÉèÖÃFLASHÑÓʱÖÜÆÚΪ2WS£¬Ò²¾ÍÊÇ3¸öCPUÖÜÆÚ¡£
               
    if(ret!=HAL_OK) while(1);
}
hjyhjy 回答时间:2018-8-21 09:28:24
这个都是按照正点原子的模版来的,基本和标准库一样  SYSCLK=72M
电子星辰 回答时间:2018-8-21 10:11:07
你看看SystemCoreClock是多少?
捕获.JPG

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wenyangzeng 回答时间:2018-8-21 10:49:28
楼主的运行过程CPU时间都耗在指令跳转中。
整数减法运算应该没有用到浮点运算吧?楼主应该进行浮点小数运算、傅里叶运算等才能体现。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

hjyhjy 回答时间:2018-8-21 15:00:28
是的,我是用FFT运算电压  电流了,标准库就没这问题
hjyhjy 回答时间:2018-8-21 15:05:05
电子星辰 发表于 2018-8-21 10:11
你看看SystemCoreClock是多少?

就是这个   uint32_t SystemCoreClock         = 72000000;        /*!< System Clock Frequency (Core Clock) */


在 option里宏定义 :USE_HAL_DRIVER,STM32F103xE
G:\
风忆柔情 回答时间:2018-8-21 15:09:02
一直用库函数,hal库还没接触,有必要学吗
smallcsduck 回答时间:2018-8-22 07:10:17
本帖最后由 smallcsduck 于 2018-8-22 07:11 编辑
hjyhjy 发表于 2018-8-21 15:05
就是这个   uint32_t SystemCoreClock         = 72000000;        /*!< System Clock Frequency (Core Cl ...

void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Enables the Clock Security System
    */
  HAL_RCC_EnableCSS();

    /**Configure the Systick interrupt time
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000);

    /**Configure the Systick
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
}

这个是标准的流程 晶振是8M的

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

小K的木鱼脑袋 回答时间:2018-9-4 14:49:48
楼主解决了没有,我也遇到一样的问题,能否请教一下,QQ1011058310

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版