4844|0

714

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

STM32L系列RTC使用HSE/16作为时钟源遇到的问题和解决 [复制链接]

        由于种种原因,所用的硬件没有LSE的晶振,在使用RTC模块的时候,一开始呢使用的是LSI作为时钟源,在单板上调试好后对时间精度要求不高的情况下倒是可以使用,但是LSI的时钟是一个范围值,导致每个板子的RTC_SynchPrediv的值是不一样的,就没有办法作为量产的设置。所以就考虑了用HSE作为时钟源(产品对精度要求一般),看了一些手册RTC的时钟源不能超过1M所以就对HSE进行了16分频,结合ST的库函数(V1.3.0),修改了RCC_RTCCLKConfig()中的参数改为RCC_RTCCLKSource_HSE_Div16,然后修改了RTC_InitStruct->RTC_SynchPrediv,RTC_InitStruct->RTC_AsynchPrediv,修改之后在尝试时间速度很快,那么问题出在哪里呢?
  1. /**
  2.   * [url=home.php?mod=space&uid=159083]@brief[/url]  Configures the RTC and LCD clock (RTCCLK / LCDCLK).
  3.   * @note     As the RTC clock configuration bits are in the RTC domain and write
  4.   *           access is denied to this domain after reset, you have to enable write
  5.   *           access using PWR_RTCAccessCmd(ENABLE) function before to configure
  6.   *           the RTC clock source (to be done once after reset).   
  7.   * @note     Once the RTC clock is configured it can't be changed unless the RTC
  8.   *           is reset using RCC_RTCResetCmd function, or by a Power On Reset (POR)
  9.   * @note     The RTC clock (RTCCLK) is used also to clock the LCD (LCDCLK).
  10.   *            
  11.   * @param  RCC_RTCCLKSource: specifies the RTC clock source.
  12.   *   This parameter can be one of the following values:
  13.   *     @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock
  14.   *     @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock
  15.   *     @arg RCC_RTCCLKSource_HSE_Div2: HSE divided by 2 selected as RTC clock
  16.   *     @arg RCC_RTCCLKSource_HSE_Div4: HSE divided by 4 selected as RTC clock
  17.   *     @arg RCC_RTCCLKSource_HSE_Div8: HSE divided by 8 selected as RTC clock
  18.   *     @arg RCC_RTCCLKSource_HSE_Div16: HSE divided by 16 selected as RTC clock
  19.   *      
  20.   * @note     If the LSE or LSI is used as RTC clock source, the RTC continues to
  21.   *           work in STOP and STANDBY modes, and can be used as wakeup source.
  22.   *           However, when the HSE clock is used as RTC clock source, the RTC
  23.   *           cannot be used in STOP and STANDBY modes.
  24.   *            
  25.   * @note     The maximum input clock frequency for RTC is 1MHz (when using HSE as
  26.   *           RTC clock source).
  27.   *                          
  28.   * @retval None
  29.   */
  30. void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource)
  31. {
  32.   uint32_t         tmpreg = 0;

  33.   /* Check the parameters */
  34.   assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
  35.   //logout("hse on =%d\r\n",RCC->CR&RCC_CR_HSEON);
  36.   if ((RCC_RTCCLKSource & RCC_CSR_RTCSEL_HSE) == RCC_CSR_RTCSEL_HSE)
  37.   {
  38.     /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */
  39.     tmpreg = RCC->CR;

  40.     /* Clear RTCPRE[1:0] bits */
  41.     tmpreg &= ~RCC_CR_RTCPRE;

  42.     /* Configure HSE division factor for RTC clock */
  43.     tmpreg |= (RCC_RTCCLKSource & RCC_CR_RTCPRE);

  44.     /* Store the new value */
  45.     RCC->CR = tmpreg;
  46.   }
  47.          
  48.   RCC->CSR &= ~RCC_CSR_RTCSEL;
  49.   
  50.   /* Select the RTC clock source */
  51.   RCC->CSR |= (RCC_RTCCLKSource & RCC_CSR_RTCSEL);
  52. }
复制代码
然后就一直在找,将RTC_InitStruct->RTC_SynchPrediv,RTC_InitStruct->RTC_AsynchPrediv这两个值调节到了最大,还是快,然后只能默默的对着数据手册找呀找呀,终于找到了这么一句话:

然后就看看设置时是否对这个值进行了处理,果然没有。。。。
又害怕在这个RCC_RTCCLKConfig()函数中进行修改会影响其他部分,然后只能默默的设置时钟的时候就直接对这个寄存器操作进行了相关位的操作。改完之后就很正常了。不过像这样RTC使用HSE的估计也很少,不过也说明那个库函数还是不是很严谨的。大家如果遇到类似的情况,希望可以帮到大家。也可能说的不对,不详细的,也欢迎指导指正
此帖出自stm32/stm8论坛
点赞 关注
个人签名Hello astroturfers
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表