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

📄 stm32f10x_i2c.lst

📁 stm32+ucos-ii
💻 LST
📖 第 1 页 / 共 5 页
字号:
    181          
    182          /**
    183            * @brief  Initializes the I2Cx peripheral according to the specified 
    184            *   parameters in the I2C_InitStruct.
    185            * @param  I2Cx: where x can be 1 or 2 to select the I2C peripheral.
    186            * @param  I2C_InitStruct: pointer to a I2C_InitTypeDef structure that
    187            *   contains the configuration information for the specified I2C peripheral.
    188            * @retval None
    189            */

   \                                 In section .text, align 2, keep-with-next
    190          void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)
    191          {
   \                     I2C_Init:
   \   00000000   2DE9F043           PUSH     {R4-R9,LR}
   \   00000004   85B0               SUB      SP,SP,#+20
   \   00000006   0400               MOVS     R4,R0
   \   00000008   0D00               MOVS     R5,R1
    192            uint16_t tmpreg = 0, freqrange = 0;
   \   0000000A   5FF00009           MOVS     R9,#+0
   \   0000000E   0026               MOVS     R6,#+0
    193            uint16_t result = 0x04;
   \   00000010   0427               MOVS     R7,#+4
    194            uint32_t pclk1 = 8000000;
   \   00000012   ........           LDR.W    R8,??DataTable1_1  ;; 0x7a1200
    195            RCC_ClocksTypeDef  rcc_clocks;
    196            /* Check the parameters */
    197            assert_param(IS_I2C_ALL_PERIPH(I2Cx));
    198            assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed));
    199            assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode));
    200            assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle));
    201            assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1));
    202            assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack));
    203            assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress));
    204          
    205          /*---------------------------- I2Cx CR2 Configuration ------------------------*/
    206            /* Get the I2Cx CR2 value */
    207            tmpreg = I2Cx->CR2;
   \   00000016   A088               LDRH     R0,[R4, #+4]
   \   00000018   8146               MOV      R9,R0
    208            /* Clear frequency FREQ[5:0] bits */
    209            tmpreg &= CR2_FREQ_Reset;
   \   0000001A   4FF6C070           MOVW     R0,#+65472
   \   0000001E   10EA0909           ANDS     R9,R0,R9
    210            /* Get pclk1 frequency value */
    211            RCC_GetClocksFreq(&rcc_clocks);
   \   00000022   00A8               ADD      R0,SP,#+0
   \   00000024   ........           BL       RCC_GetClocksFreq
    212            pclk1 = rcc_clocks.PCLK1_Frequency;
   \   00000028   0298               LDR      R0,[SP, #+8]
   \   0000002A   8046               MOV      R8,R0
    213            /* Set frequency bits depending on pclk1 value */
    214            freqrange = (uint16_t)(pclk1 / 1000000);
   \   0000002C   ....               LDR.N    R0,??DataTable1_2  ;; 0xf4240
   \   0000002E   B8FBF0F0           UDIV     R0,R8,R0
   \   00000032   0600               MOVS     R6,R0
    215            tmpreg |= freqrange;
   \   00000034   56EA0909           ORRS     R9,R6,R9
    216            /* Write to I2Cx CR2 */
    217            I2Cx->CR2 = tmpreg;
   \   00000038   A4F80490           STRH     R9,[R4, #+4]
    218          
    219          /*---------------------------- I2Cx CCR Configuration ------------------------*/
    220            /* Disable the selected I2C peripheral to configure TRISE */
    221            I2Cx->CR1 &= CR1_PE_Reset;
   \   0000003C   2088               LDRH     R0,[R4, #+0]
   \   0000003E   4FF6FE71           MOVW     R1,#+65534
   \   00000042   0840               ANDS     R0,R1,R0
   \   00000044   2080               STRH     R0,[R4, #+0]
    222            /* Reset tmpreg value */
    223            /* Clear F/S, DUTY and CCR[11:0] bits */
    224            tmpreg = 0;
   \   00000046   0020               MOVS     R0,#+0
   \   00000048   8146               MOV      R9,R0
    225          
    226            /* Configure speed in standard mode */
    227            if (I2C_InitStruct->I2C_ClockSpeed <= 100000)
   \   0000004A   2868               LDR      R0,[R5, #+0]
   \   0000004C   ....               LDR.N    R1,??DataTable1_3  ;; 0x186a1
   \   0000004E   8842               CMP      R0,R1
   \   00000050   0ED2               BCS.N    ??I2C_Init_0
    228            {
    229              /* Standard mode speed calculate */
    230              result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1));
   \   00000052   2868               LDR      R0,[R5, #+0]
   \   00000054   4000               LSLS     R0,R0,#+1
   \   00000056   B8FBF0F0           UDIV     R0,R8,R0
   \   0000005A   0700               MOVS     R7,R0
    231              /* Test if CCR value is under 0x4*/
    232              if (result < 0x04)
   \   0000005C   BFB2               UXTH     R7,R7            ;; ZeroExt  R7,R7,#+16,#+16
   \   0000005E   042F               CMP      R7,#+4
   \   00000060   01D2               BCS.N    ??I2C_Init_1
    233              {
    234                /* Set minimum allowed value */
    235                result = 0x04;  
   \   00000062   0420               MOVS     R0,#+4
   \   00000064   0700               MOVS     R7,R0
    236              }
    237              /* Set speed value for standard mode */
    238              tmpreg |= result;	  
   \                     ??I2C_Init_1:
   \   00000066   57EA0909           ORRS     R9,R7,R9
    239              /* Set Maximum Rise Time for standard mode */
    240              I2Cx->TRISE = freqrange + 1; 
   \   0000006A   701C               ADDS     R0,R6,#+1
   \   0000006C   2084               STRH     R0,[R4, #+32]
   \   0000006E   26E0               B.N      ??I2C_Init_2
    241            }
    242            /* Configure speed in fast mode */
    243            else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/
    244            {
    245              if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2)
   \                     ??I2C_Init_0:
   \   00000070   E888               LDRH     R0,[R5, #+6]
   \   00000072   4BF6FF71           MOVW     R1,#+49151
   \   00000076   8842               CMP      R0,R1
   \   00000078   06D1               BNE.N    ??I2C_Init_3
    246              {
    247                /* Fast mode speed calculate: Tlow/Thigh = 2 */
    248                result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3));
   \   0000007A   2868               LDR      R0,[R5, #+0]
   \   0000007C   0321               MOVS     R1,#+3
   \   0000007E   4843               MULS     R0,R1,R0
   \   00000080   B8FBF0F0           UDIV     R0,R8,R0
   \   00000084   0700               MOVS     R7,R0
   \   00000086   07E0               B.N      ??I2C_Init_4
    249              }
    250              else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/
    251              {
    252                /* Fast mode speed calculate: Tlow/Thigh = 16/9 */
    253                result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25));
   \                     ??I2C_Init_3:
   \   00000088   2868               LDR      R0,[R5, #+0]
   \   0000008A   1921               MOVS     R1,#+25
   \   0000008C   4843               MULS     R0,R1,R0
   \   0000008E   B8FBF0F0           UDIV     R0,R8,R0
   \   00000092   0700               MOVS     R7,R0
    254                /* Set DUTY bit */
    255                result |= I2C_DutyCycle_16_9;
   \   00000094   57F48047           ORRS     R7,R7,#0x4000
    256              }
    257          
    258              /* Test if CCR value is under 0x1*/
    259              if ((result & CCR_CCR_Set) == 0)
   \                     ??I2C_Init_4:
   \   00000098   3805               LSLS     R0,R7,#+20
   \   0000009A   01D1               BNE.N    ??I2C_Init_5
    260              {
    261                /* Set minimum allowed value */
    262                result |= (uint16_t)0x0001;  
   \   0000009C   57F00107           ORRS     R7,R7,#0x1
    263              }
    264              /* Set speed value and set F/S bit for fast mode */
    265              tmpreg |= (uint16_t)(result | CCR_FS_Set);
   \                     ??I2C_Init_5:
   \   000000A0   57F40040           ORRS     R0,R7,#0x8000
   \   000000A4   50EA0909           ORRS     R9,R0,R9
    266              /* Set Maximum Rise Time for fast mode */
    267              I2Cx->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1);  
   \   000000A8   B6B2               UXTH     R6,R6            ;; ZeroExt  R6,R6,#+16,#+16
   \   000000AA   4FF49670           MOV      R0,#+300
   \   000000AE   00FB06F0           MUL      R0,R0,R6
   \   000000B2   4FF47A71           MOV      R1,#+1000
   \   000000B6   90FBF1F0           SDIV     R0,R0,R1
   \   000000BA   401C               ADDS     R0,R0,#+1
   \   000000BC   2084               STRH     R0,[R4, #+32]
    268            }
    269          
    270            /* Write to I2Cx CCR */
    271            I2Cx->CCR = tmpreg;
   \                     ??I2C_Init_2:
   \   000000BE   A4F81C90           STRH     R9,[R4, #+28]
    272            /* Enable the selected I2C peripheral */
    273            I2Cx->CR1 |= CR1_PE_Set;
   \   000000C2   2088               LDRH     R0,[R4, #+0]
   \   000000C4   50F00100           ORRS     R0,R0,#0x1
   \   000000C8   2080               STRH     R0,[R4, #+0]
    274          
    275          /*---------------------------- I2Cx CR1 Configuration ------------------------*/
    276            /* Get the I2Cx CR1 value */
    277            tmpreg = I2Cx->CR1;
   \   000000CA   2088               LDRH     R0,[R4, #+0]
   \   000000CC   8146               MOV      R9,R0
    278            /* Clear ACK, SMBTYPE and  SMBUS bits */
    279            tmpreg &= CR1_CLEAR_Mask;
   \   000000CE   4FF6F530           MOVW     R0,#+64501
   \   000000D2   10EA0909           ANDS     R9,R0,R9
    280            /* Configure I2Cx: mode and acknowledgement */
    281            /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */
    282            /* Set ACK bit according to I2C_Ack value */
    283            tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack);
   \   000000D6   A888               LDRH     R0,[R5, #+4]
   \   000000D8   6989               LDRH     R1,[R5, #+10]
   \   000000DA   0843               ORRS     R0,R1,R0
   \   000000DC   50EA0909           ORRS     R9,R0,R9
    284            /* Write to I2Cx CR1 */
    285            I2Cx->CR1 = tmpreg;
   \   000000E0   A4F80090           STRH     R9,[R4, #+0]
    286          
    287          /*---------------------------- I2Cx OAR1 Configuration -----------------------*/
    288            /* Set I2Cx Own Address1 and acknowledged address */
    289            I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1);
   \   000000E4   A889               LDRH     R0,[R5, #+12]
   \   000000E6   2989               LDRH     R1,[R5, #+8]
   \   000000E8   0843               ORRS     R0,R1,R0
   \   000000EA   2081               STRH     R0,[R4, #+8]
    290          }
   \   000000EC   05B0               ADD      SP,SP,#+20
   \   000000EE   BDE8F083           POP      {R4-R9,PC}       ;; return
    291          
    292          /**
    293            * @brief  Fills each I2C_InitStruct member with its default value.
    294            * @param  I2C_InitStruct: pointer to an I2C_InitTypeDef structure which will be initialized.
    295            * @retval None
    296            */

   \                                 In section .text, align 2, keep-with-next
    297          void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct)
    298          {
    299          /*---------------- Reset I2C init structure parameters values ----------------*/
    300            /* initialize the I2C_ClockSpeed member */
    301            I2C_InitStruct->I2C_ClockSpeed = 5000;
   \                     I2C_StructInit:
   \   00000000   41F28831           MOVW     R1,#+5000
   \   00000004   0160               STR      R1,[R0, #+0]
    302            /* Initialize the I2C_Mode member */
    303            I2C_InitStruct->I2C_Mode = I2C_Mode_I2C;
   \   00000006   0021               MOVS     R1,#+0
   \   00000008   8180               STRH     R1,[R0, #+4]
    304            /* Initialize the I2C_DutyCycle member */
    305            I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2;
   \   0000000A   4BF6FF71           MOVW     R1,#+49151
   \   0000000E   C180               STRH     R1,[R0, #+6]
    306            /* Initialize the I2C_OwnAddress1 member */
    307            I2C_InitStruct->I2C_OwnAddress1 = 0;
   \   00000010   0021               MOVS     R1,#+0
   \   00000012   0181               STRH     R1,[R0, #+8]
    308            /* Initialize the I2C_Ack member */
    309            I2C_InitStruct->I2C_Ack = I2C_Ack_Disable;
   \   00000014   0021               MOVS     R1,#+0
   \   00000016   4181               STRH     R1,[R0, #+10]
    310            /* Initialize the I2C_AcknowledgedAddress member */
    311            I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
   \   00000018   4FF48041           MOV      R1,#+16384
   \   0000001C   8181               STRH     R1,[R0, #+12]
    312          }
   \   0000001E   7047               BX       LR               ;; return
    313          
    314          /**

⌨️ 快捷键说明

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