stm32f10x_i2c.lst
来自「完成数据的采集」· LST 代码 · 共 1,161 行 · 第 1/5 页
LST
1,161 行
158 /*---------------------------- I2Cx CR2 Configuration ------------------------*/
159 /* Get the I2Cx CR2 value */
160 tmpreg = I2Cx->CR2;
\ 0000001A A088 LDRH R0,[R4, #+4]
\ 0000001C 0700 MOVS R7,R0
161 /* Clear frequency FREQ[5:0] bits */
162 tmpreg &= CR2_FREQ_Reset;
\ 0000001E 3800 MOVS R0,R7
\ 00000020 364F LDR.N R7,??I2C_Init_0+0x4 ;; 0xffc0
\ 00000022 0740 ANDS R7,R7,R0
163 /* Get PCLK1Clock frequency value */
164 RCC_GetClocksFreq(&RCC_Clocks);
\ 00000024 02A8 ADD R0,SP,#+8
\ 00000026 ........ BL RCC_GetClocksFreq
165 pclk1clock = RCC_Clocks.PCLK1_Frequency;
\ 0000002A 0498 LDR R0,[SP, #+16]
\ 0000002C 0090 STR R0,[SP, #+0]
166 /* Set frequency bits depending on PCLK1Clock value */
167 freqrange = (u16)(pclk1clock / 1000000);
\ 0000002E 0098 LDR R0,[SP, #+0]
\ 00000030 3349 LDR.N R1,??I2C_Init_0+0x8 ;; 0xf4240
\ 00000032 B0FBF1F0 UDIV R0,R0,R1
\ 00000036 ADF80400 STRH R0,[SP, #+4]
168 tmpreg |= freqrange;
\ 0000003A 3800 MOVS R0,R7
\ 0000003C BDF80470 LDRH R7,[SP, #+4]
\ 00000040 0743 ORRS R7,R7,R0
169 /* Write to I2Cx CR2 */
170 I2Cx->CR2 = tmpreg;
\ 00000042 A780 STRH R7,[R4, #+4]
171
172 /*---------------------------- I2Cx CCR Configuration ------------------------*/
173 /* Disable I2Cx to configure TRISE */
174 I2C_Cmd(I2Cx, DISABLE);
\ 00000044 0021 MOVS R1,#+0
\ 00000046 2000 MOVS R0,R4
\ 00000048 ........ BL I2C_Cmd
175
176 /* Reset tmpreg value */
177 /* Clear F/S, DUTY and CCR[11:0] bits */
178 tmpreg = 0;
\ 0000004C 0020 MOVS R0,#+0
\ 0000004E 0700 MOVS R7,R0
179
180 /* Configure speed in standard mode */
181 if (I2C_InitStruct->I2C_ClockSpeed <= 100000)
\ 00000050 E868 LDR R0,[R5, #+12]
\ 00000052 2C49 LDR.N R1,??I2C_Init_0+0xC ;; 0x186a1
\ 00000054 8842 CMP R0,R1
\ 00000056 10D2 BCS.N ??I2C_Init_1
182 {
183 /* Standard mode speed calculate */
184 result = (u16)(pclk1clock / (I2C_InitStruct->I2C_ClockSpeed << 1));
\ 00000058 0098 LDR R0,[SP, #+0]
\ 0000005A E968 LDR R1,[R5, #+12]
\ 0000005C 4900 LSLS R1,R1,#+1
\ 0000005E B0FBF1F0 UDIV R0,R0,R1
\ 00000062 0600 MOVS R6,R0
185 /* Test if CCR value is under 0x4*/
186 if (result < 0x04)
\ 00000064 B6B2 UXTH R6,R6 ;; ZeroExtS R6,R6,#+16,#+16
\ 00000066 042E CMP R6,#+4
\ 00000068 01D2 BCS.N ??I2C_Init_2
187 {
188 /* Set minimum allowed value */
189 result = 0x04;
\ 0000006A 0420 MOVS R0,#+4
\ 0000006C 0600 MOVS R6,R0
190 }
191 /* Set speed value for standard mode */
192 tmpreg |= result;
\ ??I2C_Init_2:
\ 0000006E 3743 ORRS R7,R7,R6
193 /* Set Maximum Rise Time: ((1000/(1000000000/pclk1clock))+1 */
194 I2Cx->TRISE = freqrange + 1;
\ 00000070 BDF80400 LDRH R0,[SP, #+4]
\ 00000074 401C ADDS R0,R0,#+1
\ 00000076 2084 STRH R0,[R4, #+32]
\ 00000078 27E0 B.N ??I2C_Init_3
195 }
196 /* Configure speed in fast mode */
197 else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/
198 {
199 if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2)
\ ??I2C_Init_1:
\ 0000007A 6888 LDRH R0,[R5, #+2]
\ 0000007C .... LDR.N R1,??DataTable1 ;; 0xbfff
\ 0000007E 8842 CMP R0,R1
\ 00000080 07D1 BNE.N ??I2C_Init_4
200 {
201 /* Fast mode speed calculate: Tlow/Thigh = 2 */
202 result = (u16)(pclk1clock / (I2C_InitStruct->I2C_ClockSpeed * 3));
\ 00000082 0098 LDR R0,[SP, #+0]
\ 00000084 E968 LDR R1,[R5, #+12]
\ 00000086 0322 MOVS R2,#+3
\ 00000088 5143 MULS R1,R2,R1
\ 0000008A B0FBF1F0 UDIV R0,R0,R1
\ 0000008E 0600 MOVS R6,R0
\ 00000090 08E0 B.N ??I2C_Init_5
203 }
204 else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/
205 {
206 /* Fast mode speed calculate: Tlow/Thigh = 16/9 */
207 result = (u16)(pclk1clock / (I2C_InitStruct->I2C_ClockSpeed * 25));
\ ??I2C_Init_4:
\ 00000092 0098 LDR R0,[SP, #+0]
\ 00000094 E968 LDR R1,[R5, #+12]
\ 00000096 1922 MOVS R2,#+25
\ 00000098 5143 MULS R1,R2,R1
\ 0000009A B0FBF1F0 UDIV R0,R0,R1
\ 0000009E 0600 MOVS R6,R0
208 /* Set DUTY bit */
209 result |= I2C_DutyCycle_16_9;
\ 000000A0 56F48046 ORRS R6,R6,#0x4000
210 }
211 /* Test if CCR value is under 0x1*/
212 if ((result & CCR_CCR_Set) == 0)
\ ??I2C_Init_5:
\ 000000A4 3005 LSLS R0,R6,#+20
\ 000000A6 01D1 BNE.N ??I2C_Init_6
213 {
214 /* Set minimum allowed value */
215 result |= (u16)0x0001;
\ 000000A8 56F00106 ORRS R6,R6,#0x1
216 }
217 /* Set speed value and set F/S bit for fast mode */
218 tmpreg |= result | CCR_FS_Set;
\ ??I2C_Init_6:
\ 000000AC 3800 MOVS R0,R7
\ 000000AE 56F40047 ORRS R7,R6,#0x8000
\ 000000B2 0743 ORRS R7,R7,R0
219 /* Set Maximum Rise Time: ((300/(1000000000/pclk1clock))+1 */
220 I2Cx->TRISE = (u16)(((freqrange * 300) / 1000) + 1);
\ 000000B4 BDF80400 LDRH R0,[SP, #+4]
\ 000000B8 5FF49671 MOVS R1,#+300
\ 000000BC 4843 MULS R0,R1,R0
\ 000000BE 5FF47A71 MOVS R1,#+1000
\ 000000C2 90FBF1F0 SDIV R0,R0,R1
\ 000000C6 401C ADDS R0,R0,#+1
\ 000000C8 2084 STRH R0,[R4, #+32]
221 }
222 /* Write to I2Cx CCR */
223 I2Cx->CCR = tmpreg;
\ ??I2C_Init_3:
\ 000000CA A783 STRH R7,[R4, #+28]
224
225 /* Enable I2Cx */
226 I2C_Cmd(I2Cx, ENABLE);
\ 000000CC 0121 MOVS R1,#+1
\ 000000CE 2000 MOVS R0,R4
\ 000000D0 ........ BL I2C_Cmd
227
228 /*---------------------------- I2Cx CR1 Configuration ------------------------*/
229 /* Get the I2Cx CR1 value */
230 tmpreg = I2Cx->CR1;
\ 000000D4 2088 LDRH R0,[R4, #+0]
\ 000000D6 0700 MOVS R7,R0
231 /* Clear ACK, SMBTYPE and SMBUS bits */
232 tmpreg &= CR1_CLEAR_Mask;
\ 000000D8 3800 MOVS R0,R7
\ 000000DA 0B4F LDR.N R7,??I2C_Init_0+0x10 ;; 0xfbf5
\ 000000DC 0740 ANDS R7,R7,R0
233 /* Configure I2Cx: mode and acknowledgement */
234 /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */
235 /* Set ACK bit according to I2C_Ack value */
236 tmpreg |= (u16)((u32)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack);
\ 000000DE 3900 MOVS R1,R7
\ 000000E0 2888 LDRH R0,[R5, #+0]
\ 000000E2 EF88 LDRH R7,[R5, #+6]
\ 000000E4 0743 ORRS R7,R7,R0
\ 000000E6 0F43 ORRS R7,R7,R1
237 /* Write to I2Cx CR1 */
238 I2Cx->CR1 = tmpreg;
\ 000000E8 2780 STRH R7,[R4, #+0]
239
240 /*---------------------------- I2Cx OAR1 Configuration -----------------------*/
241 /* Set I2Cx Own Address1 and acknowledged address */
242 I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1);
\ 000000EA 2889 LDRH R0,[R5, #+8]
\ 000000EC A988 LDRH R1,[R5, #+4]
\ 000000EE 0143 ORRS R1,R1,R0
\ 000000F0 2181 STRH R1,[R4, #+8]
243 }
\ 000000F2 07B0 ADD SP,SP,#+28
\ 000000F4 F0BD POP {R4-R7,PC} ;; return
\ 000000F6 00BF Nop
\ ??I2C_Init_0:
\ 000000F8 001BB700 DC32 0xb71b00
\ 000000FC C0FF0000 DC32 0xffc0
\ 00000100 40420F00 DC32 0xf4240
\ 00000104 A1860100 DC32 0x186a1
\ 00000108 F5FB0000 DC32 0xfbf5
244
245 /*******************************************************************************
246 * Function Name : I2C_StructInit
247 * Description : Fills each I2C_InitStruct member with its default value.
248 * Input : - I2C_InitStruct: pointer to an I2C_InitTypeDef structure
249 * which will be initialized.
250 * Output : None
251 * Return : None
252 *******************************************************************************/
\ In section .XML, align 4, keep-with-next
253 void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct)
254 {
255 /*---------------- Reset I2C init structure parameters values ----------------*/
256 /* Initialize the I2C_Mode member */
257 I2C_InitStruct->I2C_Mode = I2C_Mode_I2C;
\ I2C_StructInit:
\ 00000000 0021 MOVS R1,#+0
\ 00000002 0180 STRH R1,[R0, #+0]
258
259 /* Initialize the I2C_DutyCycle member */
260 I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2;
\ 00000004 .... LDR.N R1,??DataTable1 ;; 0xbfff
\ 00000006 4180 STRH R1,[R0, #+2]
261
262 /* Initialize the I2C_OwnAddress1 member */
263 I2C_InitStruct->I2C_OwnAddress1 = 0;
\ 00000008 0021 MOVS R1,#+0
\ 0000000A 8180 STRH R1,[R0, #+4]
264
265 /* Initialize the I2C_Ack member */
266 I2C_InitStruct->I2C_Ack = I2C_Ack_Disable;
\ 0000000C 0021 MOVS R1,#+0
\ 0000000E C180 STRH R1,[R0, #+6]
267
268 /* Initialize the I2C_AcknowledgedAddress member */
269 I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
\ 00000010 5FF48041 MOVS R1,#+16384
\ 00000014 0181 STRH R1,[R0, #+8]
270
271 /* initialize the I2C_ClockSpeed member */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?