调试I2C遇到的一些问题

发布者:tgdddt最新更新时间:2019-04-08 来源: eefocus关键字:调试  I2C  模式 手机看文章 扫描二维码
随时随地手机看文章

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)

{


  GPIO_InitTypeDef GPIO_InitStruct;

  if(hi2c->Instance==I2C2)

  {

  /* USER CODE BEGIN I2C2_MspInit 0 */


  /* USER CODE END I2C2_MspInit 0 */

  

    /**I2C2 GPIO Configuration    

    PB10     ------> I2C2_SCL

    PB3     ------> I2C2_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_10;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    //这个选项只能为低,为其他的模式会出现错误。

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_3;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF9_I2C2;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Peripheral clock enable */

    __HAL_RCC_I2C2_CLK_ENABLE();

  /* USER CODE BEGIN I2C2_MspInit 1 */


  /* USER CODE END I2C2_MspInit 1 */

  }


}


 


 


if(hi2c->Instance==I2C1)

  {

  /* USER CODE BEGIN I2C1_MspInit 0 */


  /* USER CODE END I2C1_MspInit 0 */

  

    /**I2C1 GPIO Configuration    

    PB6     ------> I2C1_SCL

    PB7     ------> I2C1_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Peripheral clock enable */

    __HAL_RCC_I2C1_CLK_ENABLE();

    /* Peripheral interrupt init */

    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);

    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);

  /* USER CODE BEGIN I2C1_MspInit 1 */


  /* USER CODE END I2C1_MspInit 1 */

  }

  else if(hi2c->Instance==I2C2)

  {

  /* USER CODE BEGIN I2C2_MspInit 0 */


  /* USER CODE END I2C2_MspInit 0 */

  

    /**I2C2 GPIO Configuration    

    PB10     ------> I2C2_SCL

    PB3     ------> I2C2_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_10;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_3;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF9_I2C2;  //注意模式的设置不是简单的模仿GPIO_AF4_I2C2,而是现在的这个模式

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Peripheral clock enable */

    __HAL_RCC_I2C2_CLK_ENABLE();

  /* USER CODE BEGIN I2C2_MspInit 1 */


  /* USER CODE END I2C2_MspInit 1 */

  }

  else if(hi2c->Instance==I2C3)

  {

  /* USER CODE BEGIN I2C3_MspInit 0 */


  /* USER CODE END I2C3_MspInit 0 */

  

    /**I2C3 GPIO Configuration    

    PC9     ------> I2C3_SDA

    PA8     ------> I2C3_SCL 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_9;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;

    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_8;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /* Peripheral clock enable */

    __HAL_RCC_I2C3_CLK_ENABLE();

  /* USER CODE BEGIN I2C3_MspInit 1 */


  /* USER CODE END I2C3_MspInit 1 */

  }


 


第二个问题怎么修改库,让第一个I2C的写只有start,没有stop,第二条I2C的读有start也有stop。


status = HAL_I2C_Master_Transmit_touch(&hi2c2, TOUCH_ADDR, &WriteBuff[0], 1, 30 );

    

        status = HAL_I2C_Master_Receive_touch(&hi2c2, TOUCH_ADDR, &ReadBuff[0], 8, 30);


修改库函数标红的为屏蔽代码。


 


HAL_StatusTypeDef HAL_I2C_Master_Transmit_touch(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

{

  uint32_t tickstart = 0x00U;


  /* Init tickstart for timeout management*/

  tickstart = HAL_GetTick();


  if(hi2c->State == HAL_I2C_STATE_READY)

  {

    /* Wait until BUSY flag is reset */

    if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)

    {

      return HAL_BUSY;

    }


    /* Process Locked */

    __HAL_LOCK(hi2c);


    /* Check if the I2C is already enabled */

    if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)

    {

      /* Enable I2C peripheral */

      __HAL_I2C_ENABLE(hi2c);

    }


    /* Disable Pos */

    hi2c->Instance->CR1 &= ~I2C_CR1_POS;


    hi2c->State     = HAL_I2C_STATE_BUSY_TX;

    hi2c->Mode      = HAL_I2C_MODE_MASTER;

    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;


    /* Prepare transfer parameters */

    hi2c->pBuffPtr    = pData;

    hi2c->XferCount   = Size;

    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

    hi2c->XferSize    = hi2c->XferCount;


    /* Send Slave Address */

    if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)

    {

      if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)

      {

        /* Process Unlocked */

        __HAL_UNLOCK(hi2c);

        return HAL_ERROR;

      }

      else

      {

        /* Process Unlocked */

        __HAL_UNLOCK(hi2c);

        return HAL_TIMEOUT;

      }

    }


    /* Clear ADDR flag */

    __HAL_I2C_CLEAR_ADDRFLAG(hi2c);


    while(hi2c->XferSize > 0U)

    {

      /* Wait until TXE flag is set */

      if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

      {

        if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)

        {

          /* Generate Stop */

          hi2c->Instance->CR1 |= I2C_CR1_STOP;

          return HAL_ERROR;

        }

        else

        {

          return HAL_TIMEOUT;

        }

      }


      /* Write data to DR */

      hi2c->Instance->DR = (*hi2c->pBuffPtr++);

      hi2c->XferCount--;

      hi2c->XferSize--;


      if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0U))

      {

        /* Write data to DR */

        hi2c->Instance->DR = (*hi2c->pBuffPtr++);

        hi2c->XferCount--;

        hi2c->XferSize--;

      }

      

      /* Wait until BTF flag is set */

      if(I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

      {

        if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)

        {

          /* Generate Stop */

          hi2c->Instance->CR1 |= I2C_CR1_STOP;

          return HAL_ERROR;

        }

        else

        {

          return HAL_TIMEOUT;

        }

      }

    }


    /* Generate Stop */

//    hi2c->Instance->CR1 |= I2C_CR1_STOP;


    hi2c->State = HAL_I2C_STATE_READY;

    hi2c->Mode = HAL_I2C_MODE_NONE;

    

    /* Process Unlocked */

    __HAL_UNLOCK(hi2c);


    return HAL_OK;

  }

  else

  {

    return HAL_BUSY;

  }

}


 


 


 


 


 


HAL_StatusTypeDef HAL_I2C_Master_Receive_touch(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

{

  uint32_t tickstart = 0x00U;


  /* Init tickstart for timeout management*/

  tickstart = HAL_GetTick();


  if(hi2c->State == HAL_I2C_STATE_READY)

  {

    /* Wait until BUSY flag is reset */

//    if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)

//    {

//      return HAL_BUSY;

//    }


    /* Process Locked */

    __HAL_LOCK(hi2c);


    /* Check if the I2C is already enabled */

    if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)

    {

      /* Enable I2C peripheral */

      __HAL_I2C_ENABLE(hi2c);

    }


    /* Disable Pos */

    hi2c->Instance->CR1 &= ~I2C_CR1_POS;


    hi2c->State       = HAL_I2C_STATE_BUSY_RX;

    hi2c->Mode        = HAL_I2C_MODE_MASTER;

    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;


    /* Prepare transfer parameters */

    hi2c->pBuffPtr    = pData;

    hi2c->XferCount   = Size;

    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

    hi2c->XferSize    = hi2c->XferCount;


    /* Send Slave Address */

    if(I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)

    {

      if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)

      {

        /* Process Unlocked */

        __HAL_UNLOCK(hi2c);

        return HAL_ERROR;

      }

      else

      {

        /* Process Unlocked */

        __HAL_UNLOCK(hi2c);

        return HAL_TIMEOUT;

      }

    }


    if(hi2c->XferSize == 0U)

    {

      /* Clear ADDR flag */

      __HAL_I2C_CLEAR_ADDRFLAG(hi2c);


      /* Generate Stop */

      hi2c->Instance->CR1 |= I2C_CR1_STOP;

    }

    else if(hi2c->XferSize == 1U)

    {

      /* Disable Acknowledge */

      hi2c->Instance->CR1 &= ~I2C_CR1_ACK;


      /* Clear ADDR flag */

      __HAL_I2C_CLEAR_ADDRFLAG(hi2c);


      /* Generate Stop */

      hi2c->Instance->CR1 |= I2C_CR1_STOP;

    }

    else if(hi2c->XferSize == 2U)

    {

      /* Disable Acknowledge */

      hi2c->Instance->CR1 &= ~I2C_CR1_ACK;


      /* Enable Pos */

      hi2c->Instance->CR1 |= I2C_CR1_POS;


      /* Clear ADDR flag */

      __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

    }

    else

    {

      /* Enable Acknowledge */

      hi2c->Instance->CR1 |= I2C_CR1_ACK;


      /* Clear ADDR flag */

      __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

    }


    while(hi2c->XferSize > 0U)

    {

      if(hi2c->XferSize <= 3U)

      {

        /* One byte */

        if(hi2c->XferSize == 1U)

        {

          /* Wait until RXNE flag is set */

          if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)      

          {

            if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)

            {

              return HAL_TIMEOUT;

            }

            else

            {

              return HAL_ERROR;

            }

          }


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;

        }

        /* Two bytes */

        else if(hi2c->XferSize == 2U)

        {

          /* Wait until BTF flag is set */

          if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)

          {

            return HAL_TIMEOUT;

          }


          /* Generate Stop */

          hi2c->Instance->CR1 |= I2C_CR1_STOP;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;

        }

        /* 3 Last bytes */

        else

        {

          /* Wait until BTF flag is set */

          if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)

          {

            return HAL_TIMEOUT;

          }


          /* Disable Acknowledge */

          hi2c->Instance->CR1 &= ~I2C_CR1_ACK;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;


          /* Wait until BTF flag is set */

          if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)

          {

            return HAL_TIMEOUT;

          }


          /* Generate Stop */

          hi2c->Instance->CR1 |= I2C_CR1_STOP;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;

        }

      }

      else

      {

        /* Wait until RXNE flag is set */

        if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)      

        {

          if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)

          {

            return HAL_TIMEOUT;

          }

          else

          {

            return HAL_ERROR;

          }

        }


        /* Read data from DR */

        (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

        hi2c->XferSize--;

        hi2c->XferCount--;


        if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)

        {

          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;

        }

      }

    }


    hi2c->State = HAL_I2C_STATE_READY;

    hi2c->Mode = HAL_I2C_MODE_NONE;


    /* Process Unlocked */

    __HAL_UNLOCK(hi2c);


    return HAL_OK;

  }

  else

  {

    return HAL_BUSY;

  }

}


关键字:调试  I2C  模式 引用地址:调试I2C遇到的一些问题

上一篇:I2C死锁原因及解决方法
下一篇:i2c出现的bug

推荐阅读最新更新时间:2024-03-16 16:26

雷军:华米成功赴美上市 小米生态链模式的巨大胜利
  2月8日晚, 华米 科技在美国纽约证券交易所上市,成为 小米 生态链首家在美上市企业。此次, 华米 科技以每股ADS(美国存托股份)11美元的定价,首次公开发行1000万股ADS,总融资额超1.1亿美元,承销商为瑞士信贷、花旗集团以及华兴资本。下面就随嵌入式小编一起来了解一下相关内容吧。      雷军:华米成功赴美上市 小米生态链模式的巨大胜利   对于 华米 科技的成功上市, 小米 CEO雷军第一时间通过微博发来贺电。雷军表示,华米成功赴美上市,是 小米 生态链模式的巨大胜利!感谢黄汪带领华米团队研发了小米手环、小米体脂秤等优秀产品,也感谢广大米粉的支持! 雷军:华米成功赴美上市 小米生态链模式的巨大胜利
[嵌入式]
七千万单项研发成本背后:荣耀的模式和野心
  春节刚过,手机厂商们就快马加鞭,高速向目标进发。这不,勇敢做自己的 荣耀 率先给业界打了个样儿。下面就随嵌入式小编一起来了解一下相关内容吧。   七千万单项研发成本背后:荣耀的模式和野心   近日, 荣耀 发布了2018开年新机 荣耀 畅玩7C。除了双摄、全面屏等亮点以外,荣耀更是将价值7000万研发成本的人脸识别功能带入售价仅899元起的荣耀畅玩7C。树立千元机新标杆的同时,背后又体现出怎样的商业逻辑呢?    “三年前五”大业开干   客观来讲,在荣耀每年发布的众多新品手机中,定位于千元档位的荣耀畅玩7C算不上什么主角。但后置1300万+200万高清双摄、5.99英寸全面屏、智能柔光自拍、独立三卡槽、EMUI 8.
[嵌入式]
一种I2C设备控制方法的设计和实现
1 引 言 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。AT91SAM7X256是Atmel公司于2005年推出的基于ARM7的工业级芯片,他以体积小、功耗低、连接方式广泛、处理资源丰富、控制灵活等特点受到嵌入式领域开发人员的重视。本文介绍AT91SAM7X256的I2C控制器TWI接口(two-wired interface)的使用方法,并以I2C设备E2PROM和日历时钟芯片为例,实现AT91SAM
[单片机]
一种<font color='red'>I2C</font>设备控制方法的设计和实现
iOS新增USB限制模式但一个配件就可能“破解”
   新浪手机讯 7月10日上午消息,苹果今日正式推送iOS 11.4.1,带来了一个USB限制模式,防止黑客利用破解工具进行iPhone密码破解。   新推送的iOS 11.4.1中新增的USB限制模式,目的是为了防止第三方公司通过USB方式破解iPhone并获取其中数据。   在iOS设备锁屏1小时之后,用户无法访问任何类型的第三方软件,仅能通过Lightning接口充电,这样就可以将此前的“GrayKey灰钥匙”等密码破解工具拒之门外,第三方无法成功破解手机。   然而,网络安全公司ElcomSoft的研究人员又发现了一个新漏洞,只要你将USB配件插入iPhone的Lightning接口就可以重置倒计时1小时,无论手机过去
[手机便携]
模式生命体征监测前端助力破局可穿戴电子产品“内卷”困境
从数据准确性和算法有效性入手,多模式生命体征监测前端助力破局可穿戴电子产品“内卷”困境 继智能手机后,近年来可穿戴设备正“包揽”全身,逐步成为消费者新时尚: 耳戴TWS耳机,腕戴智能手环/智能手表,头戴智能眼镜/智能头显,身穿心电T恤…… 多种多样的智能穿戴设备正成为继手机后撬动着消费电子市场增长的新亮点。但看似百花齐放的繁荣表象背后,可穿戴设备发展却暗藏隐忧——应用场景单一、功能更新缓慢、同质化严重、入局者众多…… ADI中国产品事业部高级市场应用经理何源 “贝索斯曾经说过,很多人关注并追求未来十年会变化的东西,但是他问自己更多的是未来十年什么是不会变的。从可穿戴产品来看,人类对于健康的追求是不变的,健康消费一定
[物联网]
多<font color='red'>模式</font>生命体征监测前端助力破局可穿戴电子产品“内卷”困境
复制国内模式,OPPO 手机强势问鼎菲律宾市场
电子网 9月18日综合报道 在将国外手机品牌逐渐逼出中国市场后,当前中国智能手机厂商正在复制“中国模式”将成功经验移植到海外,其中包括东南亚的市场。 种种迹象表明,OPPO 、vivo 等强调渠道、营销、产品的三板斧方式是最有效的。越来越多的厂商也开始学习。据IDC统计,OPPO、vivo 目前已经站稳了菲律宾的中高端市场。 具体数据显示,2017年第二季度,菲律宾当地手机品牌Cherry Mobile稳坐第一大手机品牌,不过其主要依靠50美元以下的手机打下半壁江山。三星保持先发优势,依旧名列菲律宾第二大手机品牌,27%的市占率维持持平局面。菲律宾等地另一品牌Cloudfone,主攻25美元的低价手机市场,守住第四名。 而OPPO
[手机便携]
理解一下单片机的I2C和SPI通信
应某位网友要求,今天说一下单片机的I2C SPI通信,可能说不清楚,因为这毕竟要做实验才可完全理解。 I2C和SPI是两种不同的通信协议。 听到协议,似乎高不可攀,其实协议就是人们定义的一个标准而已,我们只要遵照这个标准去做事,就可以。比如公司规定早上9点上班,我们就9点上班,不然就会扣薪水,这就是个协议。 用I2C通信的芯片最常用的就是EEPROM芯片,如Atmel的AT24CXX系列,此外,还有一些其它功能的芯片。用SPI通信的芯片有外置FLASH芯片,同样,还有其他功能的一些芯片。 I2C通信需要用到两个引脚:SDA SCL。SCL是时钟引脚,SDA是数据引脚。 (这是EEPROM芯片) (这是时钟芯片) SPI通信
[单片机]
理解一下单片机的<font color='red'>I2C</font>和SPI通信
stm32单片机待机模式的设计
一 待机模式简介 在stm32的低功耗模式中,待机模式可以实现系统的最低功耗,在这种模式下,只需要2uA左右的电流。 三 待机唤醒程序分析 实验现象: 将程序下载到开发板上后,LED灯会不断地亮灭,当按下KEY2键超过3s时,LED灯灭,标志着单片机进入待机模式,再按下KEY1键,这时唤醒单片机,LED又开始不断地亮灭亮灭。 程序中用到的一些宏定义 #definemacEXTI_GPIO_CLK(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO) #definemacEXTI_GPIO_PORTGPIOC #definemacEXTI_GPIO_PINGPIO_Pin_13 #definem
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved