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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版