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

F4官方库RTC驱动参数例外

[复制链接]
giveup 提问时间:2018-5-20 11:15 /
做一个小试验,安装了例外检查,结果发现官方库的一个例外。
stm32f407vetx,STM32Cube_FW_F4_V1.21.0/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c
的HAL_RTC_SetDate函数中,大约652行,应该是明显的错误。简化版本为:
  1. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
  2. {
  3.   uint32_t datetmpreg = 0U;
  4.   。。。
  5.   if(Format == RTC_FORMAT_BIN)
  6.   { 。。。
  7. }
  8.   else
  9.   {   
  10.     assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(sDate->Year)));
  11.     assert_param(IS_RTC_MONTH(datetmpreg));
  12.     assert_param(IS_RTC_DATE(datetmpreg));
  13.        datetmpreg = ((((uint32_t)sDate->Year) << 16U) | \
  14.                   (((uint32_t)sDate->Month) << 8U) | \
  15.                   ((uint32_t)sDate->Date) | \
  16.                   (((uint32_t)sDate->WeekDay) << 13U));  
  17.   }
复制代码


此时,datetmpreg为0,会引发两次assert_param例外。
怀疑此处参数检查本意是检查传入的年月日是否正确,但意外检查了一个临时变量,因为月,日为0,不符合要求。
估计应该替换为
    assert_param(IS_RTC_MONTH(sDate->Month));
    assert_param(IS_RTC_DATE(sDate->Date));
之所以错误比较隐蔽,一般情况下,生成的void assert_failed(uint8_t* file, uint32_t line)函数是空白的,自动被忽略了。
恰巧我实现了该函数,导致引发了一系列异常输出才偶然发现。

收藏 1 评论0 发布时间:2018-5-20 11:15

举报

0个回答

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版