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

NUCLEO-L073RZ LSE时钟不能初始化

[复制链接]
nigel1983 提问时间:2019-4-9 18:03 /
试了两块板子,毛病一样。晶振也换了。代码如下

        LL_RCC_LSE_Enable();//=>RCC->CSR |=RCC_CSR_LSEON;
       
        //卡在此处循环,LSE不起振
        while(!LL_RCC_LSE_IsReady())  //while(0==(RCC->CSR & RCC_CSR_LSERDY))
        {                       
                result=LL_RCC_LSE_IsReady();        //返回值 0
                result=LL_RCC_LSE_IsCSSDetected();  //返回值 0
        }

望大神指教!拜谢!
收藏 评论5 发布时间:2019-4-9 18:03

举报

5个回答
衔胆栖冰 回答时间:2019-4-9 22:52:22
换LSI试下,如果内部没问题,拿示波器去找硬件问题

评分

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

查看全部评分

nigel1983 回答时间:2019-4-10 06:48:56
LSI是正常的,LSE死活不起振。开始以为是硬件问题,两个板都一个样。而且另一块板还换了一下晶振。接LSE的PC引脚当普通GPIO使用也正常。真是郁闷,搞好几天了。没找到原因。
Cortexxx 回答时间:2019-4-10 08:09:35
要不用CubeMX生成一下code 試試看

评分

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

查看全部评分

nigel1983 回答时间:2019-4-12 17:07:50
估计是代码不对,我用HAL可以启动,追了一下HAL库内代码,好像和备份域有关系
if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)
  {
    FlagStatus       pwrclkchanged = RESET;

    /* Check the parameters */
    assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));

    /* Update LSE configuration in Backup Domain control register    */
    /* Requires to enable write access to Backup Domain of necessary */
    if(__HAL_RCC_PWR_IS_CLK_DISABLED())
    {
      __HAL_RCC_PWR_CLK_ENABLE();
      pwrclkchanged = SET;
    }

    if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP))
    {
      /* Enable write access to Backup domain */
      SET_BIT(PWR->CR, PWR_CR_DBP);

      /* Wait for Backup domain Write protection disable */
      tickstart = HAL_GetTick();

      while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP))
      {
        if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
        {
          return HAL_TIMEOUT;
        }
      }
    }

    /* Set the new LSE configuration -----------------------------------------*/
    __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
    /* Check the LSE State */
    if(RCC_OscInitStruct->LSEState != RCC_LSE_OFF)
    {
      /* Get Start Tick */
      tickstart = HAL_GetTick();

      /* Wait till LSE is ready */
      while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
      {
        if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
        {
          return HAL_TIMEOUT;
        }
      }
    }
    else
    {
      /* Get Start Tick */
      tickstart = HAL_GetTick();

      /* Wait till LSE is disabled */
      while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0U)
      {
        if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
        {
          return HAL_TIMEOUT;
        }
      }
    }

    /* Require to disable power clock if necessary */
    if(pwrclkchanged == SET)
    {
      __HAL_RCC_PWR_CLK_DISABLE();
    }
  }
nigel1983 回答时间:2019-4-12 17:53:01
强制改代码,解决。不过原因还要深入研究,望前辈指教!

void StartLSE(void)
{
        #define RCC_FLAG_LSERDY                  ((uint8_t)((CSR_REG_INDEX << 5) | RCC_CSR_LSERDY_Pos))
        #define CR_REG_INDEX                     ((uint8_t)1)
        #define CSR_REG_INDEX                    ((uint8_t)2)
        #define CRRCR_REG_INDEX                  ((uint8_t)3)
        #define RCC_FLAG_MASK                    ((uint8_t)0x1F)
        #define __LL_RCC_GET_FLAG(__FLAG__)      (((((((((__FLAG__) >> 5) == CR_REG_INDEX)? RCC->CR (((__FLAG__) >> 5) == CSR_REG_INDEX) ? RCC->CSR :RCC->CRRCR)))) & ((uint32_t)1 << ((__FLAG__) & RCC_FLAG_MASK))) != 0U ) ? 1U : 0U )
        #define LL_IS_BIT_CLR(REG, BIT)          (((REG) & (BIT)) == 0U)
        #define LL_IS_BIT_SET(REG, BIT)         (((REG) & (BIT)) == (BIT))
        #define __LL_RCC_LSE_CONFIG(__STATE__)                                    \
                    do{                                                     \
                      if ((__STATE__) == RCC_CSR_LSEON)                     \
                      {                                                     \
                        SET_BIT(RCC->CSR, RCC_CSR_LSEON);                   \
                      }                                                     \
                      else if ((__STATE__) == RCC_CSR_OFF)                  \
                      {                                                     \
                        CLEAR_BIT(RCC->CSR, RCC_CSR_LSEON);                 \
                        CLEAR_BIT(RCC->CSR, RCC_CSR_LSEBYP);                \
                      }                                                     \
                      else if ((__STATE__) == RCC_CSR_BYPASS)               \
                      {                                                     \
                        SET_BIT(RCC->CSR, RCC_CSR_LSEBYP);                  \
                        SET_BIT(RCC->CSR, RCC_CSR_LSEON);                   \
                      }                                                     \
                      else                                                  \
                      {                                                     \
                        CLEAR_BIT(RCC->CSR, RCC_CSR_LSEON);                 \
                        CLEAR_BIT(RCC->CSR, RCC_CSR_LSEBYP);                \
                      }                                                     \
                    }while(0)
                                                                               
                                                                               
        FlagStatus       pwrclkchanged = RESET;

        /* Update LSE configuration in Backup Domain control register    */
        /* Requires to enable write access to Backup Domain of necessary */
        if((READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN) == 0U))
        {
                SET_BIT(RCC->APB1ENR, (RCC_APB1ENR_PWREN));
                pwrclkchanged = SET;
        }                                                                               
       
        if(LL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP))
        {
                /* Enable write access to Backup domain */
                SET_BIT(PWR->CR, PWR_CR_DBP);
               
                while(LL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP))
                {
                        LL_mDelay(100);
                        //Timeout
                }
        }

        /* Set the new LSE configuration -----------------------------------------*/
        //_LL_RCC_LSE_CONFIG(RCC_CSR_LSEON);
        SET_BIT(RCC->CSR, RCC_CSR_LSEON);  
               
        /* Wait till LSE is ready */
        while(__LL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
        {
                LL_mDelay(5000);
        }
               
        /* Wait till LSE is disabled */
//        while(__LL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0U)
//        {                       
//                LL_mDelay(5000);
//                //³¬Ê±´úÂë
//        }

        /* Require to disable power clock if necessary */
        if(pwrclkchanged == SET)
        {
                CLEAR_BIT(RCC->APB1ENR, (RCC_APB1ENR_PWREN));
        }
  
       
        #undef RCC_FLAG_LSERDY               
        #undef CR_REG_INDEX                  
        #undef CSR_REG_INDEX                  
        #undef CRRCR_REG_INDEX                  
        #undef RCC_FLAG_MASK                    
        #undef __LL_RCC_GET_FLAG(__FLAG__)
        #undef LL_IS_BIT_CLR(REG, BIT)        
        #undef LL_IS_BIT_SET(REG, BIT)        
        #undef __LL_RCC_LSE_CONFIG(__STATE__)
}

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版