📄 stm32f10x_i2c.lst
字号:
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 + -