搜索

[STM32F7] ST库有多烂多万恶? 给你见识一下吧!

[复制链接]
1733|26
netjob|  楼主 | 2021-6-10 15:23 | 显示全部楼层 |阅读模式
本帖最后由 netjob 于 2021-6-10 15:40 编辑

ST库有多烂多万恶?  给你见识一下吧!

SystemClock_Config();

这个函数不能调用两次,否则第二次在里面关掉,仿真看看。

使用特权

评论回复

评论

netjob 2021-6-11 08:20 回复TA
@cooldog123pp :为什么调用两次? 你竟然问问什么调用两次? 这样都敢问? 还问?。。。? 
cooldog123pp 2021-6-11 08:12 回复TA
哥哥,你主要是负责搞笑的吧 
cooldog123pp 2021-6-11 08:11 回复TA
这为啥要调用两次呢? 如果你要改,要用别的函数,这个函数就调用一次就好了呀,不带参数的。 
netjob|  楼主 | 2021-6-10 16:00 | 显示全部楼层
  这是函数源码:

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI14;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.HSI14CalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

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

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

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

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

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

使用特权

评论回复
caoenq| | 2021-6-10 16:52 | 显示全部楼层
netjob 发表于 2021-6-10 16:00
这是函数源码:

/**

推荐你使用LL库或者STD库

使用特权

评论回复
fanwei700615| | 2021-6-10 17:34 | 显示全部楼层
函数也是人写的嘛,有不好用的函数可以修改后提交社区的,st那边一般下一版本都会改进

使用特权

评论回复
netjob|  楼主 | 2021-6-10 18:07 | 显示全部楼层
其实 这个 void SystemClock_Config(void) 函数,就是HAL 库新改的,改的真 恶心。而且还有BUG 的!!

本人用回原来的函数:
static void SetSysClock(void);

void SystemInit2 (void)
{   
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */
  RCC->CFGR &= (uint32_t)0xF8FFB80C;
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
  RCC->CFGR &= (uint32_t)0xFFC0FFFF;

  /* Reset PREDIV1[3:0] bits */
  RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;

  /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
  RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;

  /* Reset HSI14 bit */
  RCC->CR2 &= (uint32_t)0xFFFFFFFE;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

  /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
  SetSysClock();
  
}
static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
            
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }  
}

使用特权

评论回复
netjob|  楼主 | 2021-6-10 18:34 | 显示全部楼层
本帖最后由 netjob 于 2021-6-10 18:36 编辑

还有一个版本,  ST公司对这个函数 一改再改, 改了好几个版本呢

void SetSysClock2(void)
{
  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;

/******************************************************************************/
/*            PLL (clocked by HSI) used as System clock source                */
/******************************************************************************/
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
  /* Enable HSi */   
  RCC->CR |= ((uint32_t)RCC_CR_HSION);//RCC_CR_HSION

  /* Wait till HSi is ready and if Time out is reached exit */
  do
  {
    HSIStatus = RCC->CR & RCC_CR_HSIRDY;//RCC_CR_HSIRDY,RCC_CR_HSERDY
    StartUpCounter++;  
  } while((HSIStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  {
    HSIStatus = (uint32_t)0x01;
  }
  else
  {
    HSIStatus = (uint32_t)0x00;
  }  

  if (HSIStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK/2      */  
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK = HCLK/2 */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
               
        //HSI RC=8MHZ
  /* PLL configuration = (HSI/2) * 12 = ~48 MHz */
  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL));  //清空PLLSRC和PLLMUL
  RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2 | RCC_CFGR_PLLMUL2);  //HSI两分频,乘以12,倍频到48MHz
      

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /* Select PLL as system clock source   SYSCLK  */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  
        
}//END SUB

使用特权

评论回复
yangxiaor520| | 2021-6-10 21:44 | 显示全部楼层
呵呵

使用特权

评论回复
pq113_6| | 2021-6-11 08:30 | 显示全部楼层
一个好的库能满足80%的需求就可以了,一般什么都想要的库都不怎么样

使用特权

评论回复
我感觉还是挺稳定的,不知道为什么楼主会有这样的现象。

使用特权

评论回复
玄德| | 2021-6-11 09:03 | 显示全部楼层

问题是,你为啥要调用两次?


使用特权

评论回复
内政奇才| | 2021-6-11 09:19 | 显示全部楼层
pq113_6 发表于 2021-6-11 08:30
一个好的库能满足80%的需求就可以了,一般什么都想要的库都不怎么样

说的精辟哟

使用特权

评论回复
前功尽弃| | 2021-6-11 09:22 | 显示全部楼层
大哥,你为什么要调用两次?

使用特权

评论回复
netjob|  楼主 | 2021-6-11 09:24 | 显示全部楼层
如果这种代码 , 被全D志这样的公司写。 他们肯定不好公开源代码的。 这种已经算是 核心的底层驱动代码。

如果用这个芯片, 这个代码是必不可少的。而且可能只有厂家才能写,如果他们把部分寄存器不公开的话, 好比全D志,

但ST公司 的芯片是公开资料的, 这种代码我们其实用心去写也是可以写出来的。 但是可能会很花时间。


使用特权

评论回复
ouyanglei92| | 2021-6-11 09:47 | 显示全部楼层
很多理论都是在一定条件下使用的,就像函数传递参数,这些参数就已经限定函数的功能了

使用特权

评论回复
zhamatu| | 2021-6-11 10:02 | 显示全部楼层
我认为不要轻易去怀疑人家多年的成果,每个软件都有自己的bug,任何配置的顺序都是有要求的。

使用特权

评论回复
yklstudent| | 2021-6-11 10:51 | 显示全部楼层
很好奇楼主写的代码是有多严谨,能经得起别人的测试嘛

使用特权

评论回复
royal90| | 2021-6-11 10:58 | 显示全部楼层
新人,问下楼主出于上面原因调用两次?你需要重新调整时钟来初始化外设接口吗?

使用特权

评论回复
z_no1| | 2021-6-11 11:18 | 显示全部楼层
royal90 发表于 2021-6-11 10:58
新人,问下楼主出于上面原因调用两次?你需要重新调整时钟来初始化外设接口吗? ...

如果我要再次初始化时钟,我会直接重启,然后判断该怎么初始化.不然牵涉太多了.

使用特权

评论回复

评论

royal90 2021-6-16 09:31 回复TA
很好奇楼主为什么要初始化系统时钟两次? 
b838899| | 2021-6-11 11:22 | 显示全部楼层
一般什么都想要的库都不怎么样,

使用特权

评论回复
CI-KE| | 2021-6-11 12:31 | 显示全部楼层
楼主水平不够,说ST库有问题,笑掉大牙。
你敢把你自己的代码贴出来吗?你的水平够的上ST的工程师吗?不要在这丢人现眼,台。毒。小丑。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 wolfe_yu 得到打赏 ¥170.00
  • 2 最美葫芦娃 得到打赏 ¥155.00
  • 3 小叶三千 得到打赏 ¥155.00
  • 4 呐咯密密 得到打赏 ¥130.00
  • 5 hk386 得到打赏 ¥95.00
  • 6 laocuo1142 得到打赏 ¥85.00
  • 7 年轻的国王 得到打赏 ¥60.00
  • 8 ezcui 得到打赏 ¥60.00
  • 9 两只袜子 得到打赏 ¥56.00
  • 10 lxl666 得到打赏 ¥55.00
在线客服 快速回复 返回顶部 返回列表