⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_i2c.lst

📁 STM32利用正交编码器实现电机的控制
💻 LST
📖 第 1 页 / 共 4 页
字号:
##############################################################################
#                                                                            #
# IAR ARM ANSI C/C++ Compiler V4.42A/W32               15/May/2008  12:06:31 #
# Copyright 1999-2005 IAR Systems. All rights reserved.                      #
#                                                                            #
#    Cpu mode        =  thumb                                                #
#    Endian          =  little                                               #
#    Stack alignment =  4                                                    #
#    Source file     =  C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM        #
#                       Encoder\example\FWLib\src\stm32f10x_i2c.c            #
#    Command line    =  "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM       #
#                       Encoder\example\FWLib\src\stm32f10x_i2c.c" -D        #
#                       VECT_TAB_FLASH -lcN "C:\David JIANG\ST               #
#                       MCU\Docs\STM32\AN_JIANG\TIM                          #
#                       Encoder\example\project\EWARM\BOOT_FLASH\List\" -lb  #
#                       "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM       #
#                       Encoder\example\project\EWARM\BOOT_FLASH\List\" -o   #
#                       "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM       #
#                       Encoder\example\project\EWARM\BOOT_FLASH\Obj\" -z3   #
#                       --no_cse --no_unroll --no_inline --no_code_motion    #
#                       --no_tbaa --no_clustering --no_scheduling --debug    #
#                       --cpu_mode thumb --endian little --cpu cortex-M3     #
#                       --stack_align 4 --require_prototypes --fpu None      #
#                       --dlib_config "C:\Program Files\IAR                  #
#                       Systems\Embedded Workbench                           #
#                       4.0\arm\LIB\dl7mptnnl8f.h" -I "C:\David JIANG\ST     #
#                       MCU\Docs\STM32\AN_JIANG\TIM                          #
#                       Encoder\example\project\EWARM\" -I "C:\David         #
#                       JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM                 #
#                       Encoder\example\project\EWARM\..\include\" -I        #
#                       "C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM       #
#                       Encoder\example\project\EWARM\..\..\FWLib\inc\" -I   #
#                       "C:\Program Files\IAR Systems\Embedded Workbench     #
#                       4.0\arm\INC\"                                        #
#    List file       =  C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM        #
#                       Encoder\example\project\EWARM\BOOT_FLASH\List\stm32f #
#                       10x_i2c.lst                                          #
#    Object file     =  C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM        #
#                       Encoder\example\project\EWARM\BOOT_FLASH\Obj\stm32f1 #
#                       0x_i2c.r79                                           #
#                                                                            #
#                                                                            #
##############################################################################

C:\David JIANG\ST MCU\Docs\STM32\AN_JIANG\TIM Encoder\example\FWLib\src\stm32f10x_i2c.c
      1          /******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
      2          * File Name          : stm32f10x_i2c.c
      3          * Author             : MCD Application Team
      4          * Date First Issued  : 09/29/2006
      5          * Description        : This file provides all the I2C firmware functions.
      6          ********************************************************************************
      7          * History:
      8          * 05/21/2007: V0.3
      9          * 04/02/2007: V0.2
     10          * 02/05/2007: V0.1
     11          * 09/29/2006: V0.01
     12          ********************************************************************************
     13          * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
     14          * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
     15          * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
     16          * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
     17          * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
     18          * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
     19          *******************************************************************************/
     20          
     21          /* Includes ------------------------------------------------------------------*/
     22          #include "stm32f10x_i2c.h"
     23          #include "stm32f10x_rcc.h"
     24          
     25          /* Private typedef -----------------------------------------------------------*/
     26          /* Private define ------------------------------------------------------------*/
     27          /* I2C SPE mask */
     28          #define CR1_PE_Set              ((u16)0x0001)
     29          #define CR1_PE_Reset            ((u16)0xFFFE)
     30          
     31          /* I2C DMAEN mask */
     32          #define CR2_DMAEN_Set           ((u16)0x0800)
     33          #define CR2_DMAEN_Reset         ((u16)0xF7FF)
     34          
     35          /* I2C LAST mask */
     36          #define CR2_LAST_Set            ((u16)0x1000)
     37          #define CR2_LAST_Reset          ((u16)0xEFFF)
     38          
     39          /* I2C START mask */
     40          #define CR1_START_Set           ((u16)0x0100)
     41          #define CR1_START_Reset         ((u16)0xFEFF)
     42          
     43          /* I2C STOP mask */
     44          #define CR1_STOP_Set            ((u16)0x0200)
     45          #define CR1_STOP_Reset          ((u16)0xFDFF)
     46          
     47          /* I2C ACK mask */
     48          #define CR1_ACK_Set             ((u16)0x0400)
     49          #define CR1_ACK_Reset           ((u16)0xFBFF)
     50          
     51          /* I2C ENGC mask */
     52          #define CR1_ENGC_Set            ((u16)0x0040)
     53          #define CR1_ENGC_Reset          ((u16)0xFFBF)
     54          
     55          /* I2C ADD0 mask */
     56          #define OAR1_ADD0_Set           ((u16)0x0001)
     57          #define OAR1_ADD0_Reset         ((u16)0xFFFE)
     58          
     59          /* I2C SWRST mask */
     60          #define CR1_SWRST_Set           ((u16)0x8000)
     61          #define CR1_SWRST_Reset         ((u16)0x7FFF)
     62          
     63          /* I2C PEC mask */
     64          #define CR1_PEC_Set             ((u16)0x1000)
     65          #define CR1_PEC_Reset           ((u16)0xEFFF)
     66          
     67          /* I2C ENPEC mask */
     68          #define CR1_ENPEC_Set           ((u16)0x0020)
     69          #define CR1_ENPEC_Reset         ((u16)0xFFDF)
     70          
     71          /* I2C ENARP mask */
     72          #define CR1_ENARP_Set           ((u16)0x0010)
     73          #define CR1_ENARP_Reset         ((u16)0xFFEF)
     74          
     75          /* I2C NOSTRETCH mask */
     76          #define CR1_NOSTRETCH_Set       ((u16)0x0080)
     77          #define CR1_NOSTRETCH_Reset     ((u16)0xFF7F)
     78          
     79          /* I2C ENDUAL mask */
     80          #define OAR2_ENDUAL_Set         ((u16)0x0001)
     81          #define OAR2_ENDUAL_Reset       ((u16)0xFFFE)
     82          
     83          /* I2C F/S mask */
     84          #define CCR_FS_Set              ((u16)0x8000)
     85          
     86          /* I2C ADD2 mask */
     87          #define OAR2_ADD2_Reset         ((u16)0xFF01)
     88          
     89          /* I2C FREQ mask */
     90          #define CR2_FREQ_Reset          ((u16)0xFFC0)
     91          
     92          /* I2C CCR mask */
     93          #define CCR_CCR_Set             ((u16)0x0FFF)
     94          
     95          /* I2C FLAG mask */
     96          #define I2C_FLAG_Mask           ((u32)0x00FFFFFF)
     97          
     98          /* I2C registers Masks */
     99          #define CR1_CLEAR_Mask          ((u16)0xFBF5)
    100          
    101          /* Private macro -------------------------------------------------------------*/
    102          /* Private variables ---------------------------------------------------------*/
    103          /* Private function prototypes -----------------------------------------------*/
    104          /* Private functions ---------------------------------------------------------*/
    105          
    106          /*******************************************************************************
    107          * Function Name  : I2C_DeInit
    108          * Description    : Deinitializes the I2Cx peripheral registers to their default
    109          *                  reset values.
    110          * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
    111          * Output         : None
    112          * Return         : None
    113          *******************************************************************************/
    114          void I2C_DeInit(I2C_TypeDef* I2Cx)
    115          {
    116            switch (*(u32*)&I2Cx)
    117            {
    118              case I2C1_BASE:
    119                /* Enable I2C1 reset state */
    120                RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
    121                /* Release I2C1 from reset state */
    122                RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
    123                break;
    124          
    125              case I2C2_BASE:
    126                /* Enable I2C2 reset state */
    127                RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
    128                /* Release I2C2 from reset state */
    129                RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
    130                break;
    131          
    132              default:
    133                break;
    134            }
    135          }
    136          
    137          /*******************************************************************************
    138          * Function Name  : I2C_Init
    139          * Description    : Initializes the I2Cx peripheral according to the specified 
    140          *                  parameters in the I2C_InitStruct.
    141          * Input          : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.
    142          *                  - I2C_InitStruct: pointer to a I2C_InitTypeDef structure that
    143          *                    contains the configuration information for the specified
    144          *                    I2C peripheral.
    145          * Output         : None
    146          * Return         : None
    147          ******************************************************************************/
    148          void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)
    149          {
    150            u16 tmpreg = 0, freqrange = 0;
    151            u16 result = 0x04;
    152            u32 pclk1clock = 12000000;
    153            RCC_ClocksTypeDef  RCC_Clocks;
    154          
    155            /* Check the parameters */
    156            assert(IS_I2C_MODE(I2C_InitStruct->I2C_Mode));
    157            assert(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle));
    158            assert(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1));
    159            assert(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack));
    160            assert(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress));
    161            assert(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed));
    162          
    163          /*---------------------------- I2Cx CR2 Configuration ------------------------*/
    164            /* Get the I2Cx CR2 value */
    165            tmpreg = I2Cx->CR2;
    166            /* Clear frequency FREQ[5:0] bits */
    167            tmpreg &= CR2_FREQ_Reset;
    168            /* Get PCLK1Clock frequency value */
    169            RCC_GetClocksFreq(&RCC_Clocks);
    170            pclk1clock = RCC_Clocks.PCLK1_Frequency;
    171            /* Set frequency bits depending on PCLK1Clock value */
    172            freqrange = (u16)(pclk1clock / 1000000);
    173            tmpreg |= freqrange;
    174            /* Write to I2Cx CR2 */
    175            I2Cx->CR2 = tmpreg;
    176          
    177          /*---------------------------- I2Cx CCR Configuration ------------------------*/
    178            /* Disable I2Cx to configure TRISE */
    179            I2C_Cmd(I2Cx, DISABLE);
    180          
    181            /* Reset tmpreg value */
    182            /* Clear F/S, DUTY and CCR[11:0] bits */
    183            tmpreg = 0;
    184          
    185            /* Configure speed in standard mode */
    186            if (I2C_InitStruct->I2C_ClockSpeed <= 100000)
    187            {
    188              /* Standard mode speed calculate */
    189              result = (u16)(pclk1clock / (I2C_InitStruct->I2C_ClockSpeed << 1));
    190              /* Test if CCR value is under 0x4*/
    191              if (result < 0x04)
    192              {
    193                /* Set minimum allowed value */
    194                result = 0x04;  
    195              }
    196              /* Set speed value for standard mode */
    197              tmpreg |= result;	  
    198              /* Set Maximum Rise Time: ((1000/(1000000000/pclk1clock))+1 */
    199              I2Cx->TRISE = freqrange + 1; 
    200            }
    201            /* Configure speed in fast mode */
    202            else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/
    203            {
    204              if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2)
    205              {
    206                /* Fast mode speed calculate: Tlow/Thigh = 2 */
    207                result = (u16)(pclk1clock / (I2C_InitStruct->I2C_ClockSpeed * 3));
    208              }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -