前几天下载了最新的stsw-stm8069库,在调试的过程中发现有问题,不知道是我理解错误还是库函数有bug。在stm8s_i2c.c文件中的第759行,void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG)这个函数是用来清除标志位的
函数内容如下
- void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG)
- {
- uint16_t flagpos = 0;
- /* Check the parameters */
- assert_param(IS_I2C_CLEAR_FLAG_OK(I2C_FLAG));
- /* Get the I2C flag position */
- flagpos = (uint16_t)I2C_FLAG & FLAG_Mask;
- /* Clear the selected I2C flag */
- I2C->SR2 = (uint8_t)((uint16_t)(~flagpos));
- }
复制代码 这是一个带参数的函数,可用的参数定义在stm8s_i2c.h中的第100行,参数如下
- typedef enum
- {
- /* SR1 register flags */
- I2C_FLAG_TXEMPTY = (uint16_t)0x0180, /*!< Transmit Data Register Empty flag */
- I2C_FLAG_RXNOTEMPTY = (uint16_t)0x0140, /*!< Read Data Register Not Empty flag */
- I2C_FLAG_STOPDETECTION = (uint16_t)0x0110, /*!< Stop detected flag */
- I2C_FLAG_HEADERSENT = (uint16_t)0x0108, /*!< 10-bit Header sent flag */
- I2C_FLAG_TRANSFERFINISHED = (uint16_t)0x0104, /*!< Data Byte Transfer Finished flag */
- I2C_FLAG_ADDRESSSENTMATCHED = (uint16_t)0x0102, /*!< Address Sent/Matched (master/slave) flag */
- I2C_FLAG_STARTDETECTION = (uint16_t)0x0101, /*!< Start bit sent flag */
- /* SR2 register flags */
- I2C_FLAG_WAKEUPFROMHALT = (uint16_t)0x0220, /*!< Wake Up From Halt Flag */
- I2C_FLAG_OVERRUNUNDERRUN = (uint16_t)0x0208, /*!< Overrun/Underrun flag */
- I2C_FLAG_ACKNOWLEDGEFAILURE = (uint16_t)0x0204, /*!< Acknowledge Failure Flag */
- I2C_FLAG_ARBITRATIONLOSS = (uint16_t)0x0202, /*!< Arbitration Loss Flag */
- I2C_FLAG_BUSERROR = (uint16_t)0x0201, /*!< Misplaced Start or Stop condition */
- /* SR3 register flags */
- I2C_FLAG_GENERALCALL = (uint16_t)0x0310, /*!< General Call header received Flag */
- I2C_FLAG_TRANSMITTERRECEIVER = (uint16_t)0x0304, /*!< Transmitter Receiver Flag */
- I2C_FLAG_BUSBUSY = (uint16_t)0x0302, /*!< Bus Busy Flag */
- I2C_FLAG_MASTERSLAVE = (uint16_t)0x0301 /*!< Master Slave Flag */
- } 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的标志位,程序就是死在这个函数。
正确的做法应该是先判断参数是要清除哪个寄存器,然后再清除相应的寄存器。
|
在stm8s_i2c.c的第876行有判断这个函数的参数是正确,判断参数是否正确的宏定义在stm8s_i2c.h的第422行,
这里定义了只能清除I2C_SR2寄存器,如果函数的参数是要清除另外两个寄存器(I2C_SR1和I2C_SR3)的话就会出错。
评分
查看全部评分