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

stsw-stm8069库函数问题

[复制链接]
595953427 提问时间:2017-12-24 13:42 /
前几天下载了最新的stsw-stm8069库,在调试的过程中发现有问题,不知道是我理解错误还是库函数有bug。在stm8s_i2c.c文件中的第759行,void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG)这个函数是用来清除标志位的
函数内容如下
  1. void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG)
  2. {
  3.   uint16_t flagpos = 0;
  4.   /* Check the parameters */
  5.   assert_param(IS_I2C_CLEAR_FLAG_OK(I2C_FLAG));

  6.   /* Get the I2C flag position */
  7.   flagpos = (uint16_t)I2C_FLAG & FLAG_Mask;
  8.   /* Clear the selected I2C flag */
  9.   I2C->SR2 = (uint8_t)((uint16_t)(~flagpos));
  10. }
复制代码
这是一个带参数的函数,可用的参数定义在stm8s_i2c.h中的第100行,参数如下
  1. typedef enum
  2. {
  3.   /* SR1 register flags */
  4.   I2C_FLAG_TXEMPTY             = (uint16_t)0x0180,  /*!< Transmit Data Register Empty flag */
  5.   I2C_FLAG_RXNOTEMPTY          = (uint16_t)0x0140,  /*!< Read Data Register Not Empty flag */
  6.   I2C_FLAG_STOPDETECTION       = (uint16_t)0x0110,  /*!< Stop detected flag */
  7.   I2C_FLAG_HEADERSENT          = (uint16_t)0x0108,  /*!< 10-bit Header sent flag */
  8.   I2C_FLAG_TRANSFERFINISHED    = (uint16_t)0x0104,  /*!< Data Byte Transfer Finished flag */
  9.   I2C_FLAG_ADDRESSSENTMATCHED  = (uint16_t)0x0102,  /*!< Address Sent/Matched (master/slave) flag */
  10.   I2C_FLAG_STARTDETECTION      = (uint16_t)0x0101,  /*!< Start bit sent flag */

  11.   /* SR2 register flags */
  12.   I2C_FLAG_WAKEUPFROMHALT      = (uint16_t)0x0220,  /*!< Wake Up From Halt Flag */
  13.   I2C_FLAG_OVERRUNUNDERRUN     = (uint16_t)0x0208,  /*!< Overrun/Underrun flag */
  14.   I2C_FLAG_ACKNOWLEDGEFAILURE  = (uint16_t)0x0204,  /*!< Acknowledge Failure Flag */
  15.   I2C_FLAG_ARBITRATIONLOSS     = (uint16_t)0x0202,  /*!< Arbitration Loss Flag */
  16.   I2C_FLAG_BUSERROR            = (uint16_t)0x0201,  /*!< Misplaced Start or Stop condition */

  17.   /* SR3 register flags */
  18.   I2C_FLAG_GENERALCALL         = (uint16_t)0x0310,  /*!< General Call header received Flag */
  19.   I2C_FLAG_TRANSMITTERRECEIVER = (uint16_t)0x0304,  /*!< Transmitter Receiver Flag */
  20.   I2C_FLAG_BUSBUSY             = (uint16_t)0x0302,  /*!< Bus Busy Flag */
  21.   I2C_FLAG_MASTERSLAVE         = (uint16_t)0x0301   /*!< Master Slave Flag */
  22. } I2C_Flag_TypeDef;
复制代码
从参数中可以看出有SR1、SR2和SR3 三个寄存器的标志位,stm8s_i2c.c文件中第759行的函数void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG)是可以清掉三个寄存器的标志,但是从void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG)的代码来看,只是把SR2的标志位给清除了。
如果在调用这个函数的时候,参数使用了I2C_Flag_TypeDef中定义的SR1或SR3的标志位,程序就是死在这个函数。

正确的做法应该是先判断参数是要清除哪个寄存器,然后再清除相应的寄存器。
收藏 评论1 发布时间:2017-12-24 13:42

举报

1个回答
595953427 回答时间:2017-12-24 14:24:43
是我看错了,
在stm8s_i2c.c的第876行有判断这个函数的参数是正确,判断参数是否正确的宏定义在stm8s_i2c.h的第422行,
  1. #define IS_I2C_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & (uint16_t)0xFD00) == 0x00) \
  2.                                      && ((uint16_t)(FLAG) != 0x00))
复制代码

这里定义了只能清除I2C_SR2寄存器,如果函数的参数是要清除另外两个寄存器(I2C_SR1和I2C_SR3)的话就会出错。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

所属标签

相似问题

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