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

📄 stm32f10x_i2c.txt

📁 STM32F103ZET6+UCOSII+UCGUI源码
💻 TXT
📖 第 1 页 / 共 4 页
字号:
;;;303      }
;;;304    }
000012  4770              BX       lr
;;;305    
                          ENDP


                          AREA ||i.I2C_DMACmd||, CODE, READONLY, ALIGN=1

                  I2C_DMACmd PROC
;;;314    *******************************************************************************/
;;;315    void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000  2900              CMP      r1,#0
;;;316    {
;;;317      /* Check the parameters */
;;;318      assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;319      assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;320    
;;;321      if (NewState != DISABLE)
;;;322      {
;;;323        /* Enable the selected I2C DMA requests */
;;;324        I2Cx->CR2 |= CR2_DMAEN_Set;
000002  8881              LDRH     r1,[r0,#4]
000004  d002              BEQ      |L8.12|
000006  f4416100          ORR      r1,r1,#0x800
00000a  e001              B        |L8.16|
                  |L8.12|
;;;325      }
;;;326      else
;;;327      {
;;;328        /* Disable the selected I2C DMA requests */
;;;329        I2Cx->CR2 &= CR2_DMAEN_Reset;
00000c  f4216100          BIC      r1,r1,#0x800
                  |L8.16|
000010  8081              STRH     r1,[r0,#4]            ;324
;;;330      }
;;;331    }
000012  4770              BX       lr
;;;332    
                          ENDP


                          AREA ||i.I2C_DMALastTransferCmd||, CODE, READONLY, ALIGN=1

                  I2C_DMALastTransferCmd PROC
;;;341    *******************************************************************************/
;;;342    void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000  2900              CMP      r1,#0
;;;343    {
;;;344      /* Check the parameters */
;;;345      assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;346      assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;347    
;;;348      if (NewState != DISABLE)
;;;349      {
;;;350        /* Next DMA transfer is the last transfer */
;;;351        I2Cx->CR2 |= CR2_LAST_Set;
000002  8881              LDRH     r1,[r0,#4]
000004  d002              BEQ      |L9.12|
000006  f4415180          ORR      r1,r1,#0x1000
00000a  e001              B        |L9.16|
                  |L9.12|
;;;352      }
;;;353      else
;;;354      {
;;;355        /* Next DMA transfer is not the last transfer */
;;;356        I2Cx->CR2 &= CR2_LAST_Reset;
00000c  f4215180          BIC      r1,r1,#0x1000
                  |L9.16|
000010  8081              STRH     r1,[r0,#4]            ;351
;;;357      }
;;;358    }
000012  4770              BX       lr
;;;359    
                          ENDP


                          AREA ||i.I2C_DeInit||, CODE, READONLY, ALIGN=2

                  I2C_DeInit PROC
;;;108    *******************************************************************************/
;;;109    void I2C_DeInit(I2C_TypeDef* I2Cx)
000000  490a              LDR      r1,|L10.44|
;;;110    {
000002  b510              PUSH     {r4,lr}
;;;111      /* Check the parameters */
;;;112      assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;113    
;;;114      switch (*(u32*)&I2Cx)
000004  1840              ADDS     r0,r0,r1
000006  d00d              BEQ      |L10.36|
000008  f5b06f80          CMP      r0,#0x400
00000c  d10d              BNE      |L10.42|
;;;115      {
;;;116        case I2C1_BASE:
;;;117          /* Enable I2C1 reset state */
;;;118          RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
;;;119          /* Release I2C1 from reset state */
;;;120          RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
;;;121          break;
;;;122    
;;;123        case I2C2_BASE:
;;;124          /* Enable I2C2 reset state */
;;;125          RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
00000e  2101              MOVS     r1,#1
000010  058c              LSLS     r4,r1,#22
                  |L10.18|
000012  4620              MOV      r0,r4
000014  f7fffffe          BL       RCC_APB1PeriphResetCmd
;;;126          /* Release I2C2 from reset state */
;;;127          RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
000018  4620              MOV      r0,r4
00001a  e8bd4010          POP      {r4,lr}
00001e  2100              MOVS     r1,#0
000020  f7ffbffe          B.W      RCC_APB1PeriphResetCmd
                  |L10.36|
000024  2101              MOVS     r1,#1                 ;118
000026  054c              LSLS     r4,r1,#21             ;118
000028  e7f3              B        |L10.18|
                  |L10.42|
;;;128          break;
;;;129    
;;;130        default:
;;;131          break;
;;;132      }
;;;133    }
00002a  bd10              POP      {r4,pc}
;;;134    
                          ENDP

                  |L10.44|
                          DCD      0xbfffac00

                          AREA ||i.I2C_DualAddressCmd||, CODE, READONLY, ALIGN=1

                  I2C_DualAddressCmd PROC
;;;474    *******************************************************************************/
;;;475    void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000  2900              CMP      r1,#0
;;;476    {
;;;477      /* Check the parameters */
;;;478      assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;479      assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;480    
;;;481      if (NewState != DISABLE)
;;;482      {
;;;483        /* Enable dual addressing mode */
;;;484        I2Cx->OAR2 |= OAR2_ENDUAL_Set;
000002  8981              LDRH     r1,[r0,#0xc]
000004  d002              BEQ      |L11.12|
000006  f0410101          ORR      r1,r1,#1
00000a  e001              B        |L11.16|
                  |L11.12|
;;;485      }
;;;486      else
;;;487      {
;;;488        /* Disable dual addressing mode */
;;;489        I2Cx->OAR2 &= OAR2_ENDUAL_Reset;
00000c  f0210101          BIC      r1,r1,#1
                  |L11.16|
000010  8181              STRH     r1,[r0,#0xc]          ;484
;;;490      }
;;;491    }
000012  4770              BX       lr
;;;492    
                          ENDP


                          AREA ||i.I2C_FastModeDutyCycleConfig||, CODE, READONLY, ALIGN=1

                  I2C_FastModeDutyCycleConfig PROC
;;;870    *******************************************************************************/
;;;871    void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, u16 I2C_DutyCycle)
000000  f5b14f80          CMP      r1,#0x4000
;;;872    {
;;;873      /* Check the parameters */
;;;874      assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;875      assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle));
;;;876    
;;;877      if (I2C_DutyCycle != I2C_DutyCycle_16_9)
;;;878      {
;;;879        /* I2C fast mode Tlow/Thigh=2 */
;;;880        I2Cx->CCR &= I2C_DutyCycle_2;
000004  8b81              LDRH     r1,[r0,#0x1c]
000006  d002              BEQ      |L12.14|
000008  f4214180          BIC      r1,r1,#0x4000
00000c  e001              B        |L12.18|
                  |L12.14|
;;;881      }
;;;882      else
;;;883      {
;;;884        /* I2C fast mode Tlow/Thigh=16/9 */
;;;885        I2Cx->CCR |= I2C_DutyCycle_16_9;
00000e  f4414180          ORR      r1,r1,#0x4000
                  |L12.18|
000012  8381              STRH     r1,[r0,#0x1c]         ;880
;;;886      }
;;;887    }
000014  4770              BX       lr
;;;888    
                          ENDP


                          AREA ||i.I2C_GeneralCallCmd||, CODE, READONLY, ALIGN=1

                  I2C_GeneralCallCmd PROC
;;;501    *******************************************************************************/
;;;502    void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000  2900              CMP      r1,#0
;;;503    {
;;;504      /* Check the parameters */
;;;505      assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;506      assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;507    
;;;508      if (NewState != DISABLE)
;;;509      {
;;;510        /* Enable generall call */
;;;511        I2Cx->CR1 |= CR1_ENGC_Set;
000002  8801              LDRH     r1,[r0,#0]
000004  d002              BEQ      |L13.12|
000006  f0410140          ORR      r1,r1,#0x40
00000a  e001              B        |L13.16|
                  |L13.12|
;;;512      }
;;;513      else
;;;514      {
;;;515        /* Disable generall call */
;;;516        I2Cx->CR1 &= CR1_ENGC_Reset;
00000c  f0210140          BIC      r1,r1,#0x40
                  |L13.16|
000010  8001              STRH     r1,[r0,#0]            ;511
;;;517      }
;;;518    }
000012  4770              BX       lr
;;;519    
                          ENDP


                          AREA ||i.I2C_GenerateSTART||, CODE, READONLY, ALIGN=1

                  I2C_GenerateSTART PROC
;;;368    *******************************************************************************/
;;;369    void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000  2900              CMP      r1,#0
;;;370    {
;;;371      /* Check the parameters */
;;;372      assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;373      assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;374    
;;;375      if (NewState != DISABLE)
;;;376      {
;;;377        /* Generate a START condition */
;;;378        I2Cx->CR1 |= CR1_START_Set;
000002  8801              LDRH     r1,[r0,#0]
000004  d002              BEQ      |L14.12|
000006  f4417180          ORR      r1,r1,#0x100
00000a  e001              B        |L14.16|
                  |L14.12|
;;;379      }
;;;380      else
;;;381      {
;;;382        /* Disable the START condition generation */
;;;383        I2Cx->CR1 &= CR1_START_Reset;
00000c  f4217180          BIC      r1,r1,#0x100
                  |L14.16|
000010  8001              STRH     r1,[r0,#0]            ;378
;;;384      }
;;;385    }
000012  4770              BX       lr
;;;386    
                          ENDP


                          AREA ||i.I2C_GenerateSTOP||, CODE, READONLY, ALIGN=1

                  I2C_GenerateSTOP PROC
;;;395    *******************************************************************************/
;;;396    void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState)
000000  2900              CMP      r1,#0
;;;397    {
;;;398      /* Check the parameters */
;;;399      assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;400      assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;401    
;;;402      if (NewState != DISABLE)
;;;403      {
;;;404        /* Generate a STOP condition */
;;;405        I2Cx->CR1 |= CR1_STOP_Set;
000002  8801              LDRH     r1,[r0,#0]
000004  d002              BEQ      |L15.12|
000006  f4417100          ORR      r1,r1,#0x200
00000a  e001              B        |L15.16|
                  |L15.12|
;;;406      }
;;;407      else
;;;408      {
;;;409        /* Disable the STOP condition generation */
;;;410        I2Cx->CR1 &= CR1_STOP_Reset;
00000c  f4217100          BIC      r1,r1,#0x200
                  |L15.16|
000010  8001              STRH     r1,[r0,#0]            ;405
;;;411      }
;;;412    }
000012  4770              BX       lr
;;;413    
                          ENDP


                          AREA ||i.I2C_GetFlagStatus||, CODE, READONLY, ALIGN=1

                  I2C_GetFlagStatus PROC
;;;1002   *******************************************************************************/
;;;1003   FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, u32 I2C_FLAG)
000000  4602              MOV      r2,r0
;;;1004   {
;;;1005     FlagStatus bitstatus = RESET;
;;;1006     u32 i2cstatus = 0;
;;;1007     u32 flag1 = 0, flag2 = 0;
;;;1008   
;;;1009     /* Check the parameters */
;;;1010     assert_param(IS_I2C_ALL_PERIPH(I2Cx));
;;;1011     assert_param(IS_I2C_GET_FLAG(I2C_FLAG));
;;;1012   
;;;1013     /* Read the I2Cx status register */
;;;1014     flag1 = I2Cx->SR1;
000002  8a93              LDRH     r3,[r2,#0x14]
000004  2000              MOVS     r0,#0                 ;1005
;;;1015     flag2 = I2Cx->SR2;
000006  8b12              LDRH     r2,[r2,#0x18]
;;;1016     flag2 = (flag2 & FLAG_Mask) << 16;
;;;1017   
;;;1018     /* Get the I2C status value */
;;;1019     i2cstatus = flag1 | flag2;
;;;1020   
;;;1021     /* Get bit[23:0] of the flag */
;;;1022     I2C_FLAG &= FLAG_Mask;
000008  f021417f          BIC      r1,r1,#0xff000000
00000c  ea434302          ORR      r3,r3,r2,LSL #16      ;1019
;;;1023   
;;;1024     /* Check the status of the specified I2C flag */
;;;1025     if ((i2cstatus & I2C_FLAG) != (u32)RESET)
000010  420b              TST      r3,r1
000012  d000              BEQ      |L16.22|

⌨️ 快捷键说明

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