[综合信息] 同样是做设计,他们的差别,不仅仅体现在技术水平上!

[复制链接]
2785|16
 楼主| nongfuxu 发表于 2021-5-6 16:09 | 显示全部楼层 |阅读模式
PLL, SCALE, se, hz, TE, ck
本帖最后由 nongfuxu 于 2021-5-6 16:16 编辑

同样是做设计,他们的差别,不仅仅体现在技术水平上!

下面代码来自芯片厂家的驱动库函数

  *=============================================================================
  *                    Supported STM32F40xxx/41xxx devices
  *-----------------------------------------------------------------------------
  *        System Clock source                    | PLL (HSE)
  *-----------------------------------------------------------------------------
  *        SYSCLK(Hz)                             | 168000000
  *-----------------------------------------------------------------------------
  *        HCLK(Hz)                               | 168000000
  *-----------------------------------------------------------------------------
  *        AHB Prescaler                          | 1
  *-----------------------------------------------------------------------------
  *        APB1 Prescaler                         | 4
  *-----------------------------------------------------------------------------
  *        APB2 Prescaler                         | 2
  *-----------------------------------------------------------------------------
  *        HSE Frequency(Hz)                      | 25000000
  *-----------------------------------------------------------------------------
  *        PLL_M                                  | 25
  *-----------------------------------------------------------------------------
  *        PLL_N                                  | 336
  *-----------------------------------------------------------------------------
  *        PLL_P                                  | 2
  *-----------------------------------------------------------------------------
  *        PLL_Q                                  | 7
  *-----------------------------------------------------------------------------
  *        PLLI2S_N                               | NA
  *-----------------------------------------------------------------------------
  *        PLLI2S_R                               | NA
  *-----------------------------------------------------------------------------
  *        I2S input clock                        | NA
  *-----------------------------------------------------------------------------
  *        VDD(V)                                 | 3.3
  *-----------------------------------------------------------------------------
  *        Main regulator output voltage          | Scale1 mode
  *-----------------------------------------------------------------------------
  *        Flash Latency(WS)                      | 5
  *-----------------------------------------------------------------------------
上面是给出设置“ 系统频率函数 ” void SetSysClock(void)之前的注释。


 楼主| nongfuxu 发表于 2021-5-6 16:13 | 显示全部楼层
  1. static void SetSysClock(void)
  2. {
  3. /******************************************************************************/
  4. /*            PLL (clocked by HSE) used as System clock source                */
  5. /******************************************************************************/
  6.   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  7.   
  8.   /* Enable HSE */
  9.   RCC->CR |= ((uint32_t)RCC_CR_HSEON);

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

  16.   if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  17.   {
  18.     HSEStatus = (uint32_t)0x01;
  19.   }
  20.   else
  21.   {
  22.     HSEStatus = (uint32_t)0x00;
  23.   }

  24.   if (HSEStatus == (uint32_t)0x01)
  25.   {
  26.     /* Select regulator voltage output Scale 1 mode */
  27.     RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  28.     PWR->CR |= PWR_CR_VOS;

  29.     /* HCLK = SYSCLK / 1*/
  30.     RCC->CFGR |= RCC_CFGR_HPRE_DIV1;

  31. #if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)      
  32.     /* PCLK2 = HCLK / 2*/
  33.     RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
  34.    
  35.     /* PCLK1 = HCLK / 4*/
  36.     RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
  37. #endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx */

  38. #if defined (STM32F401xx)
  39.     /* PCLK2 = HCLK / 2*/
  40.     RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
  41.    
  42.     /* PCLK1 = HCLK / 4*/
  43.     RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
  44. #endif /* STM32F401xx */
  45.    
  46.     /* Configure the main PLL */
  47.     RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  48.                    (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

  49.     /* Enable the main PLL */
  50.     RCC->CR |= RCC_CR_PLLON;

  51.     /* Wait till the main PLL is ready */
  52.     while((RCC->CR & RCC_CR_PLLRDY) == 0)
  53.     {
  54.     }
  55.    
  56. #if defined (STM32F427_437xx) || defined (STM32F429_439xx)
  57.     /* Enable the Over-drive to extend the clock frequency to 180 Mhz */
  58.     PWR->CR |= PWR_CR_ODEN;
  59.     while((PWR->CSR & PWR_CSR_ODRDY) == 0)
  60.     {
  61.     }
  62.     PWR->CR |= PWR_CR_ODSWEN;
  63.     while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
  64.     {
  65.     }      
  66.     /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
  67.     FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
  68. #endif /* STM32F427_437x || STM32F429_439xx  */

  69. #if defined (STM32F40_41xxx)     
  70.     /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
  71.     FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
  72. #endif /* STM32F40_41xxx  */

  73. #if defined (STM32F401xx)
  74.     /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
  75.     FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
  76. #endif /* STM32F401xx */

  77.     /* Select the main PLL as system clock source */
  78.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  79.     RCC->CFGR |= RCC_CFGR_SW_PLL;

  80.     /* Wait till the main PLL is used as system clock source */
  81.     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
  82.     {
  83.     }
  84.   }
  85.   else
  86.   { /* If HSE fails to start-up, the application will have wrong clock
  87.          configuration. User can add here some code to deal with this error */
  88.   }
  89. }
 楼主| nongfuxu 发表于 2021-5-6 16:19 | 显示全部楼层
本帖最后由 nongfuxu 于 2021-5-6 16:22 编辑

再看另外一家公司给出的驱动函数,注解能省则省。

  1. ======***前面没有注释***=======


 楼主| nongfuxu 发表于 2021-5-6 16:22 | 显示全部楼层
  1. static void SysClkConfig(void)
  2. {
  3.     stc_clk_sysclk_cfg_t    stcSysClkCfg;
  4.     stc_clk_xtal_cfg_t      stcXtalCfg;
  5.     stc_clk_mpll_cfg_t      stcMpllCfg;

  6.     MEM_ZERO_STRUCT(stcSysClkCfg);
  7.     MEM_ZERO_STRUCT(stcXtalCfg);
  8.     MEM_ZERO_STRUCT(stcMpllCfg);

  9.     /* Set bus clk div. */
  10.     stcSysClkCfg.enHclkDiv  = ClkSysclkDiv1;  // 100MHz
  11.     stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;  // 50MHz
  12.     stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;  // 100MHz
  13.     stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;  // 50MHz
  14.     stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;  // 25MHz
  15.     stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;  // 25MHz
  16.     stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;  // 50MHz
  17.     CLK_SysClkConfig(&stcSysClkCfg);

  18.     /* Switch system clock source to MPLL. */
  19.     /* Use Xtal as MPLL source. */
  20.     stcXtalCfg.enMode        = ClkXtalModeOsc;
  21.     stcXtalCfg.enDrv         = ClkXtalLowDrv;
  22.     stcXtalCfg.enFastStartup = Enable;
  23.     CLK_XtalConfig(&stcXtalCfg);
  24.     CLK_XtalCmd(Enable);

  25.     /* MPLL config. */
  26.     stcMpllCfg.pllmDiv = 1ul;
  27.     stcMpllCfg.plln    =50ul;
  28.     stcMpllCfg.PllpDiv = 4ul;
  29.     stcMpllCfg.PllqDiv = 4ul;
  30.     stcMpllCfg.PllrDiv = 4ul;
  31.     CLK_SetPllSource(ClkPllSrcXTAL);
  32.     CLK_MpllConfig(&stcMpllCfg);

  33.     /* flash read wait cycle setting */
  34.     EFM_Unlock();
  35.     EFM_SetLatency(5ul);
  36.     EFM_Lock();

  37.     /* Enable MPLL. */
  38.     CLK_MpllCmd(Enable);

  39.     /* Wait MPLL ready. */
  40.     while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
  41.     {
  42.         ;
  43.     }

  44.     /* Switch system clock source to MPLL. */
  45.     CLK_SetSysClkSource(CLKSysSrcMPLL);
  46. }
 楼主| nongfuxu 发表于 2021-5-6 17:00 | 显示全部楼层
再看下面一段代码,摘自驱动库串口例子程序
  1.     //初始化串口用端口 Initialize USART IO */
  2.     PORT_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_FUNC, Disable);  //PortE
  3.     PORT_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_FUNC, Disable);


这是使用(使能),还是不用(禁止)呀?


评论

如果你看看里面的函数,就会明白,这个主功能设置为UART,副功能禁止……  发表于 2021-5-7 09:54
 楼主| nongfuxu 发表于 2021-5-6 17:01 | 显示全部楼层
PORT_SetFunc 函数原型

  1. *******************************************************************************
  2. ** \brief   Set Port Pin function
  3. **
  4. ** \param   [in]  enPort               GPIO port index, This parameter can be
  5. **                                     any value of [url=home.php?mod=space&uid=144993]@ref[/url] en_port_t
  6. ** \param   [in]  u16Pin               GPIO pin index, This parameter can be
  7. **                                     any value of @ref en_pin_t
  8. ** \param   [in]  enFuncSel            Function selection, This parameter can be
  9. **                                     any value of @ref en_port_func_t
  10. **
  11. ** \param   [in] enSubFunc             The new state of the gpio sub-function.
  12. ** \arg     Enable                     Enable.
  13. ** \arg     Disable                    Disable.
  14. **
  15. ** \retval  Ok                         Set successful to corresponding pins
  16. **
  17. ******************************************************************************/
  18. en_result_t PORT_SetFunc(en_port_t enPort, uint16_t u16Pin, en_port_func_t enFuncSel,  \
  19.                   en_functional_state_t enSubFunc)
  20. {
fcccc 发表于 2021-5-6 20:51 | 显示全部楼层
这个代码是GD32吗?
 楼主| nongfuxu 发表于 2021-5-6 22:01 | 显示全部楼层
nongfuxu 发表于 2021-5-6 17:00
再看下面一段代码,摘自驱动库串口例子程序

            /* main function setting */
            PFSRx->FSEL = enFuncSel;  //功能选择寄存器:各端口的主功能配置

            /* sub function enable setting */
            PFSRx->BFE = (Enable == enSubFunc ? Enable : Disable); //功能选择寄存器:各端口的副功能配置
 楼主| nongfuxu 发表于 2021-5-6 22:13 | 显示全部楼层
  1. en_result_t PORT_SetFunc (...)
  2. {
  3.     for (u8PinPos = 0u; u8PinPos < 16u; u8PinPos ++)
  4.     {
  5.         if (u16Pin & (uint16_t)(1ul<<u8PinPos))
  6.         {
  7.             PFSRx = (stc_port_pfsr_field_t *)((uint32_t)(&M4_PORT->PFSRA0) \
  8.                     + 0x40ul * enPort + 0x4ul * u8PinPos);

  9.             /* main function setting */
  10.             PFSRx->FSEL = enFuncSel;  //功能选择寄存器(PFSRxy)

  11.             /* sub function enable setting */
  12.             PFSRx->BFE = (Enable == enSubFunc ? Enable : Disable);
  13.         }
  14.     }
  15. }

其中功能选择寄存器:各端口的副功能配置,是不是用于在 “有些应用 情 况,需要将一个端口同时设成两种功能”场合?
PFSRx->BFE = (Enable == enSubFunc ? Enable : Disable);
zlf1208 发表于 2021-5-7 08:46 | 显示全部楼层
nongfuxu 发表于 2021-5-6 22:13
其中功能选择寄存器:各端口的副功能配置,是不是用于在 “有些应用 情 况,需要将一个端口同时设成两种功 ...

文档是可以省略的,写文档成本太高了。呵呵!
caizhiwei 发表于 2021-5-7 09:39 | 显示全部楼层
华大的库吗?
wuwei888 发表于 2021-5-7 10:05 | 显示全部楼层
你觉得谁好,学谁的就完了
825cow 发表于 2021-5-7 13:40 | 显示全部楼层
没有对比就没有伤害
fcccc 发表于 2021-5-7 16:39 | 显示全部楼层
现在代码大部分流行自注释了吧.
不过下面这写法个别地方有点容易产生歧义.
单片小菜 发表于 2021-5-7 22:56 | 显示全部楼层
感谢楼主的分享,不错的想法。
忘了停止 发表于 2021-5-27 21:20 | 显示全部楼层
感觉象是水文,如果真是水文,值"二毛五分钱",如果不是水文,请楼主海涵.要比较就要和更好的比较,和不如你的比较有什么意思?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

417

主题

4297

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部