STM32 i2c从机模式中断处理参考

本文详细描述了I2C1中断处理程序的实现,包括处理各种I2C中断事件如接收就绪、发送就绪、停止条件、错误和溢出,并使用HAL库进行状态管理和错误清除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void I2C1_IRQHandler(void)
{
  /* USER CODE BEGIN I2C1_IRQn 0 */
    extern void i2c1_irq(I2C_HandleTypeDef *hi2c);
    i2c1_irq(&hi2c1);
    return ;
  /* USER CODE END I2C1_IRQn 0 */
  if (hi2c1.Instance->ISR & (I2C_FLAG_BERR | I2C_FLAG_ARLO | I2C_FLAG_OVR)) {
    HAL_I2C_ER_IRQHandler(&hi2c1);
  } else {
    HAL_I2C_EV_IRQHandler(&hi2c1);
  }
  /* USER CODE BEGIN I2C1_IRQn 1 */

  /* USER CODE END I2C1_IRQn 1 */
}

void i2c1_irq(I2C_HandleTypeDef *hi2c)
{
    uint32_t ITFlags   = READ_REG(hi2c->Instance->ISR);
    uint32_t ITSources = READ_REG(hi2c->Instance->CR1);
    
    
  if (((ITFlags & I2C_FLAG_ADDR) != RESET) )
  {
      i2c_sta.rx_index=0;
      i2c_sta.tx_index=0;
      if((ITFlags&I2C_ISR_DIR)!=0)
      {
          hi2c1.Instance->ISR |= I2C_ISR_TXE;
          i2c_sta.pec=Pectable[0^I2C_SLAVE_ADD];
      }
      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
  }
 
    if (((ITFlags & I2C_FLAG_RXNE) != RESET) )
    {
        i2c_sta.rx_flag=1;
        i2c_sta.rx_buff[i2c_sta.rx_index] = hi2c->Instance->RXDR;
        if(i2c_sta.rx_index< I2C_BUFF_LEN-1)
           i2c_sta.rx_index++;
  }
    
 
  if (((ITFlags & I2C_FLAG_TXIS) != RESET) )
  {
        if(i2c_sta.tx_index<i2c_sta.tx_len)
        {
            hi2c->Instance->TXDR = i2c_sta.tx_buff[i2c_sta.tx_index];
            i2c_sta.pec=Pectable[i2c_sta.pec^i2c_sta.tx_buff[i2c_sta.tx_index]];

            if(i2c_sta.tx_index< I2C_BUFF_LEN-1)
            i2c_sta.tx_index++;
        }
        else
            hi2c->Instance->TXDR = i2c_sta.pec;      
          
  }
  if (((ITFlags & I2C_FLAG_STOPF) != RESET) )
  {
        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
      i2c_sta.stop=1;
  }
 
    if (((ITFlags & I2C_FLAG_AF) != RESET) )
    {

        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
    }
    
    if (hi2c1.Instance->ISR & (I2C_FLAG_BERR )) {
        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
    }
    
    if (hi2c1.Instance->ISR & ( I2C_FLAG_ARLO )) {
        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
    }
    
    if (hi2c1.Instance->ISR & (I2C_FLAG_OVR)) {
        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
    }
    
    
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值