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

一个软件引起的 LSE 驱动不良的问题

[复制链接]
STMCU小助手 发布时间:2022-8-4 22:03
1. 引言
现在大多数 STM32 系列都支持修改 LSE 的驱动能力以支持更多型号的 32.768kHz 晶体了。那么在设置 LSE 的驱动能力上,软件上是不是有需要注意的地方?


2. 问题描述
某客户在其产品的设计中,使用了 STM32L051R8T6。之前已经建议客户注意根据AN2867 以及 LSE 晶体的规格书,计算一下增益裕量,以确保 LSE 晶体可以正常起振。
但是,客户还是反馈小批量生产时,仍然发现少量的 LSE 晶体无法起振的问题。


3. 问题分析与定位
3.1. 了解问题
客户听取之前的建议,学习了 AN2867,然后对他们所使用的晶体进行增益裕量计算。计算过后客户决定使用最大档的 LSE 驱动能力。但是看起来并没有解决 LSE 晶体无法起振的问题,此问题在少量电路板上仍然存在。客户分享了他们所使用晶体的规格书以LSE 驱动的代码。

3.2. 分析问题
阅读客户发来的晶体的规格书,电气特性如图 1 所示。
图1. 32.768K 晶体电气特性
R}C7TUT]BBFVHR7[DA3(TAB.png

提取出三个重要参数:
ESR = 70k ohm
CL = 12.5pF
C0 = 1.0 pF
根据这三个重要参数进行跨导的计算。

O@]5S2YHQ{X5(ZR~83HKS.png

查看 STM32L051 的数据手册中查看关于 LSE 的驱动能力,如图 2:


CQYSMNQX2JJ2$VX9J5QSCA0.png

可以看到,这里所标注的跨导为 Gm,值为最大值,也就是说,并不需要去计算增益裕量,只需要计算出的 gmcrit满足这个最大值条件就可以了。从表格可以看到,STM32L051的 LSE 驱动能力在最低档位(LSEDRV=“00”)时,Gm最大值为 0.5uA/V;在最高档位 (LSEDRV=“11”)时,Gm最大值为 2.7uA/V。
所以,前面所计算出来的值为 2.163uA/V 的 gmcrit只能使用最高档位(LSEDRV=“11”)来驱动。
根据客户的反馈,他已经在程序里将 STM32L051 的 LSE 晶体设置到最高档位 LSEDRV=“11”了,按道理应该是可以正常驱动的。那为什么还是有驱动的问题呢?现在来检查一下客户的代码。

客户的代码中,LSE 的驱动程序是这样的:
  1. __HAL_RCC_PWR_CLK_ENABLE();
  2. HAL_PWR_EnableBkUpAccess();
  3. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
  4. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  5. RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  6. if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  7. {
  8. Error_Handler();
  9. }
  10. PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  11. PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  12. if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  13. {
  14. Error_Handler();
  15. }
  16. __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_HIGH);
复制代码


看了这段代码,大家是否发现了什么问题?
这段代码的执行顺序是这样的:打开 PWR 时钟并使能访问后备域→启动 LSE→将RTC 时钟源选择为 LSE→修改 LSE 驱动能力为最高档位。
虽然说在参考手册里有这么一段话,如图 2:


JKQ9}G8JS3G_T`]]UXFB)FK.png


它的意思是允许在运行过程中随时修改 LSEDRV 的值。但是,我们也不能随心所欲,想怎么改就怎么改,想在哪里改就在哪里改。
就比如现在这个问题,客户的代码是先启动 LSE,然后再去修改驱动能力为最高档的。也就是说,LSE 的启动是在最低档(默认 LSEDRV=“00”)时启动的,启动后才改的最高档。那么,刚才已经计算过,这个晶体在 LSE 最低档位驱动能力下并不能满足条件,所以不能起振的风险是很大的,而如果使用最高档位则没有问题。所以,代码选择在最低档位启动是存在风险的,如果起振没有成功,那么在下面代码
  1. if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  2. {
  3. Error_Handler();
  4. }
复制代码


跑到了 Error_Handler()中去,并死在那里,根本不会跑到后面去把驱动能力设置为最高档位。所以,这个代码的顺序是有问题的。


完整版请查看:附件


LAT1043 一个软件引起的LSE驱动不良的问题_v1.0.pdf

下载

400.28 KB, 下载次数: 33

收藏 评论0 发布时间:2022-8-4 22:03

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版