EDN首页   博客首页

14

关于投票
汉化STM32F2.02版固件库之十四(I2C)

/*******************************************************************************
* 函数名称: I2C_DeInit
* 功能描述: 将I2Cx外设寄存器复位到它们的默认值.
* 输入参数: I2Cx:x可为1或2来选择I2C外设.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_DeInit(I2C_TypeDef* I2Cx)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_I2C_ALL_PERIPH(I2Cx));

  switch (*(u32*)&I2Cx)
  {
    case I2C1_BASE:
      /* Enable I2C1 reset state [允许I2C1复位状态]*/
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
      /* Release I2C1 from reset state [解除I2C1复位状态]*/
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
      break;

    case I2C2_BASE:
      /* Enable I2C2 reset state [允许I2C2复位状态]*/
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
      /* Release I2C2 from reset state [解除I2C2复位状态]*/
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
      break;

    default:
      break;
  }
}

/*******************************************************************************
* 函数名称: I2C_Init
* 功能描述: 按照I2C_InitStruct的特定参数初始化I2C部件.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C部件.
*           (2)I2C_InitStruct:指向I2C_InitTypeDef结构,该结构包含了特定I2C部件的配置信息。
* 输出参数: 无
* 返回参数: 无
******************************************************************************/
void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)
{
  u16 tmpreg = 0, freqrange = 0;
  u16 result = 0x04;
  u32 pclk1 = 8000000;
  RCC_ClocksTypeDef  rcc_clocks;

  /* Check the parameters [检查参数]*/
  assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode));
  assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle));
  assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1));
  assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack));
  assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress));
  assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed));

/*---------------------------- I2Cx CR2 Configuration ------------------------*/
  /* Get the I2Cx CR2 value */
  tmpreg = I2Cx->CR2;
  /* Clear frequency FREQ[5:0] bits */
  tmpreg &= CR2_FREQ_Reset;
  /* Get pclk1 frequency value */
  RCC_GetClocksFreq(&rcc_clocks);
  pclk1 = rcc_clocks.PCLK1_Frequency;
  /* Set frequency bits depending on pclk1 value */
  freqrange = (u16)(pclk1 / 1000000);
  tmpreg |= freqrange;
  /* Write to I2Cx CR2 */
  I2Cx->CR2 = tmpreg;

/*---------------------------- I2Cx CCR Configuration ------------------------*/
  /* Disable the selected I2C peripheral to configure TRISE */
  I2Cx->CR1 &= CR1_PE_Reset;

  /* Reset tmpreg value */
  /* Clear F/S, DUTY and CCR[11:0] bits */
  tmpreg = 0;

  /* Configure speed in standard mode */
  if (I2C_InitStruct->I2C_ClockSpeed <= 100000)
  {
    /* Standard mode speed calculate */
    result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1));
    /* Test if CCR value is under 0x4*/
    if (result < 0x04)
    {
      /* Set minimum allowed value */
      result = 0x04; 
    }
    /* Set speed value for standard mode */
    tmpreg |= result;    
    /* Set Maximum Rise Time for standard mode */
    I2Cx->TRISE = freqrange + 1;
  }
  /* Configure speed in fast mode */
  else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/
  {
    if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2)
    {
      /* Fast mode speed calculate: Tlow/Thigh = 2 */
      result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3));
    }
    else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/
    {
      /* Fast mode speed calculate: Tlow/Thigh = 16/9 */
      result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25));
      /* Set DUTY bit */
      result |= I2C_DutyCycle_16_9;
    }
    /* Test if CCR value is under 0x1*/
    if ((result & CCR_CCR_Set) == 0)
    {
      /* Set minimum allowed value */
      result |= (u16)0x0001; 
    }
    /* Set speed value and set F/S bit for fast mode */
    tmpreg |= result | CCR_FS_Set;
    /* Set Maximum Rise Time for fast mode */
    I2Cx->TRISE = (u16)(((freqrange * 300) / 1000) + 1); 
  }
  /* Write to I2Cx CCR */
  I2Cx->CCR = tmpreg;

  /* Enable the selected I2C peripheral */
  I2Cx->CR1 |= CR1_PE_Set;

/*---------------------------- I2Cx CR1 Configuration ------------------------*/
  /* Get the I2Cx CR1 value */
  tmpreg = I2Cx->CR1;
  /* Clear ACK, SMBTYPE and  SMBUS bits */
  tmpreg &= CR1_CLEAR_Mask;
  /* Configure I2Cx: mode and acknowledgement */
  /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */
  /* Set ACK bit according to I2C_Ack value */
  tmpreg |= (u16)((u32)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack);
  /* Write to I2Cx CR1 */
  I2Cx->CR1 = tmpreg;

/*---------------------------- I2Cx OAR1 Configuration -----------------------*/
  /* Set I2Cx Own Address1 and acknowledged address */
  I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1);
}

完整stm32f10x_i2c.c点击下载请您在下载的同时到左上角顶我一下,以示支持!谢谢

系统分类: 单片机
用户分类: STM32F
标签: STM32F 中文 汉化 固件库 I2C
来源: 原创
发表评论 阅读全文(560) | 回复(0)

13

关于投票
汉化STM32F2.02版固件库之十三(FLASH)

/*******************************************************************************
* 函数名称: FLASH_SetLatency
* 功能描述: 设置代码延时值.
* 输入参数: FLASH_Latency指定了FLASH延时值。
*                    这个参数可以是下面的值之一:
*                       - FLASH_Latency_0: 0个延时周期
*                       - FLASH_Latency_1: 1个延时周期
*                       - FLASH_Latency_2: 2个延时周期
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void FLASH_SetLatency(u32 FLASH_Latency)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_FLASH_LATENCY(FLASH_Latency));
 
  /* Sets the Latency value [设置延时值]*/
  FLASH->ACR &= ACR_LATENCY_Mask;
  FLASH->ACR |= FLASH_Latency;
}

/*******************************************************************************
* 函数名称: FLASH_HalfCycleAccessCmd
* 功能描述: 使能(或禁能)半周期Flash访问
* 输入参数: FLASH_HalfCycleAccess:FLASH半周期模式。
*                    这个参数可以是下面的值之一:
*                       - FLASH_HalfCycleAccess_Enable: 使能半周期访问
*                       - FLASH_HalfCycleAccess_Disable: 禁能半周期访问
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void FLASH_HalfCycleAccessCmd(u32 FLASH_HalfCycleAccess)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess));
 
  /* Enable or disable the Half cycle access [使能或者禁止半周期访问]*/
  FLASH->ACR &= ACR_HLFCYA_Mask;
  FLASH->ACR |= FLASH_HalfCycleAccess;
}

/*******************************************************************************
* 函数名称: FLASH_PrefetchBufferCmd
* 功能描述: 使能(或禁能)预取缓冲区
* 输入参数: FLASH_PrefetchBuffer:领取缓冲区状态.
*                    这个参数可以是下面的值之一:
*                       - FLASH_PrefetchBuffer_Enable: FLASH 预取缓冲区使能
*                       - FLASH_PrefetchBuffer_Disable: FLASH 预取缓冲区禁能
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void FLASH_PrefetchBufferCmd(u32 FLASH_PrefetchBuffer)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer));
 
  /* Enable or disable the Prefetch Buffer [使能或者禁能预取缓冲区]*/
  FLASH->ACR &= ACR_PRFTBE_Mask;
  FLASH->ACR |= FLASH_PrefetchBuffer;
}

完整stm32f10x_flash.c点击下载请您在下载的同时到左上角顶我一下,以示支持!谢谢

系统分类: 单片机
用户分类: STM32F
标签: STM32F 中文 汉化 固件库 FLASH
来源: 原创
发表评论 阅读全文(499) | 回复(0)
总共 , 当前 /