打印
[综合信息]

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

[复制链接]
2263|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 | 只看该作者
static void SetSysClock(void)
{
/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* 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)
  {
    /* Select regulator voltage output Scale 1 mode */
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    PWR->CR |= PWR_CR_VOS;

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

#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)      
    /* PCLK2 = HCLK / 2*/
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
   
    /* PCLK1 = HCLK / 4*/
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx */

#if defined (STM32F401xx)
    /* PCLK2 = HCLK / 2*/
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK / 4*/
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
#endif /* STM32F401xx */
   
    /* Configure the main PLL */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

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

    /* Wait till the main PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
#if defined (STM32F427_437xx) || defined (STM32F429_439xx)
    /* Enable the Over-drive to extend the clock frequency to 180 Mhz */
    PWR->CR |= PWR_CR_ODEN;
    while((PWR->CSR & PWR_CSR_ODRDY) == 0)
    {
    }
    PWR->CR |= PWR_CR_ODSWEN;
    while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
    {
    }      
    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
#endif /* STM32F427_437x || STM32F429_439xx  */

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

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

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

    /* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != 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 */
  }
}

使用特权

评论回复
板凳
nongfuxu|  楼主 | 2021-5-6 16:19 | 只看该作者
本帖最后由 nongfuxu 于 2021-5-6 16:22 编辑

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

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


使用特权

评论回复
地板
nongfuxu|  楼主 | 2021-5-6 16:22 | 只看该作者
static void SysClkConfig(void)
{
    stc_clk_sysclk_cfg_t    stcSysClkCfg;
    stc_clk_xtal_cfg_t      stcXtalCfg;
    stc_clk_mpll_cfg_t      stcMpllCfg;

    MEM_ZERO_STRUCT(stcSysClkCfg);
    MEM_ZERO_STRUCT(stcXtalCfg);
    MEM_ZERO_STRUCT(stcMpllCfg);

    /* Set bus clk div. */
    stcSysClkCfg.enHclkDiv  = ClkSysclkDiv1;  // 100MHz
    stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;  // 50MHz
    stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;  // 100MHz
    stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;  // 50MHz
    stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;  // 25MHz
    stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;  // 25MHz
    stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;  // 50MHz
    CLK_SysClkConfig(&stcSysClkCfg);

    /* Switch system clock source to MPLL. */
    /* Use Xtal as MPLL source. */
    stcXtalCfg.enMode        = ClkXtalModeOsc;
    stcXtalCfg.enDrv         = ClkXtalLowDrv;
    stcXtalCfg.enFastStartup = Enable;
    CLK_XtalConfig(&stcXtalCfg);
    CLK_XtalCmd(Enable);

    /* MPLL config. */
    stcMpllCfg.pllmDiv = 1ul;
    stcMpllCfg.plln    =50ul;
    stcMpllCfg.PllpDiv = 4ul;
    stcMpllCfg.PllqDiv = 4ul;
    stcMpllCfg.PllrDiv = 4ul;
    CLK_SetPllSource(ClkPllSrcXTAL);
    CLK_MpllConfig(&stcMpllCfg);

    /* flash read wait cycle setting */
    EFM_Unlock();
    EFM_SetLatency(5ul);
    EFM_Lock();

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

    /* Wait MPLL ready. */
    while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
    {
        ;
    }

    /* Switch system clock source to MPLL. */
    CLK_SetSysClkSource(CLKSysSrcMPLL);
}

使用特权

评论回复
5
nongfuxu|  楼主 | 2021-5-6 17:00 | 只看该作者
再看下面一段代码,摘自驱动库串口例子程序
    //初始化串口用端口 Initialize USART IO */
    PORT_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_FUNC, Disable);  //PortE
    PORT_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_FUNC, Disable);


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


使用特权

评论回复
评论
martinhu 2021-5-7 09:54 回复TA
如果你看看里面的函数,就会明白,这个主功能设置为UART,副功能禁止…… 
6
nongfuxu|  楼主 | 2021-5-6 17:01 | 只看该作者
PORT_SetFunc 函数原型

 *******************************************************************************
** \brief   Set Port Pin function
**
** \param   [in]  enPort               GPIO port index, This parameter can be
**                                     any value of [url=home.php?mod=space&uid=144993]@ref[/url] en_port_t
** \param   [in]  u16Pin               GPIO pin index, This parameter can be
**                                     any value of @ref en_pin_t
** \param   [in]  enFuncSel            Function selection, This parameter can be
**                                     any value of @ref en_port_func_t
**
** \param   [in] enSubFunc             The new state of the gpio sub-function.
** \arg     Enable                     Enable.
** \arg     Disable                    Disable.
**
** \retval  Ok                         Set successful to corresponding pins
**
******************************************************************************/
en_result_t PORT_SetFunc(en_port_t enPort, uint16_t u16Pin, en_port_func_t enFuncSel,  \
                  en_functional_state_t enSubFunc)
{

使用特权

评论回复
7
fcccc| | 2021-5-6 20:51 | 只看该作者
这个代码是GD32吗?

使用特权

评论回复
8
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); //功能选择寄存器:各端口的副功能配置

使用特权

评论回复
9
nongfuxu|  楼主 | 2021-5-6 22:13 | 只看该作者
en_result_t PORT_SetFunc (...)
{
    for (u8PinPos = 0u; u8PinPos < 16u; u8PinPos ++)
    {
        if (u16Pin & (uint16_t)(1ul<<u8PinPos))
        {
            PFSRx = (stc_port_pfsr_field_t *)((uint32_t)(&M4_PORT->PFSRA0) \
                    + 0x40ul * enPort + 0x4ul * u8PinPos);

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

            /* sub function enable setting */
            PFSRx->BFE = (Enable == enSubFunc ? Enable : Disable);
        }
    }
}

其中功能选择寄存器:各端口的副功能配置,是不是用于在 “有些应用 情 况,需要将一个端口同时设成两种功能”场合?
PFSRx->BFE = (Enable == enSubFunc ? Enable : Disable);

使用特权

评论回复
10
zlf1208| | 2021-5-7 08:46 | 只看该作者
nongfuxu 发表于 2021-5-6 22:13
其中功能选择寄存器:各端口的副功能配置,是不是用于在 “有些应用 情 况,需要将一个端口同时设成两种功 ...

文档是可以省略的,写文档成本太高了。呵呵!

使用特权

评论回复
11
caizhiwei| | 2021-5-7 09:39 | 只看该作者
华大的库吗?

使用特权

评论回复
12
wuwei888| | 2021-5-7 10:05 | 只看该作者
你觉得谁好,学谁的就完了

使用特权

评论回复
13
825cow| | 2021-5-7 13:40 | 只看该作者
没有对比就没有伤害

使用特权

评论回复
14
fcccc| | 2021-5-7 16:39 | 只看该作者
现在代码大部分流行自注释了吧.
不过下面这写法个别地方有点容易产生歧义.

使用特权

评论回复
15
单片小菜| | 2021-5-7 22:56 | 只看该作者
感谢楼主的分享,不错的想法。

使用特权

评论回复
16
忘了停止| | 2021-5-27 21:20 | 只看该作者
感觉象是水文,如果真是水文,值"二毛五分钱",如果不是水文,请楼主海涵.要比较就要和更好的比较,和不如你的比较有什么意思?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

417

主题

4293

帖子

2

粉丝