📄 stm32f10x_usart.lst
字号:
149 {
150 RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
\ 0000005E 0121 MOVS R1,#+1
\ 00000060 5FF40020 MOVS R0,#+524288
\ 00000064 ........ BL RCC_APB1PeriphResetCmd
151 RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
\ 00000068 0021 MOVS R1,#+0
\ 0000006A 5FF40020 MOVS R0,#+524288
\ 0000006E ........ BL RCC_APB1PeriphResetCmd
\ 00000072 0CE0 B.N ??USART_DeInit_1
152 }
153 else
154 {
155 if (USARTx == UART5)
\ ??USART_DeInit_4:
\ 00000074 .... LDR.N R0,??DataTable1_4 ;; 0x40005000
\ 00000076 8442 CMP R4,R0
\ 00000078 09D1 BNE.N ??USART_DeInit_1
156 {
157 RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
\ 0000007A 0121 MOVS R1,#+1
\ 0000007C 5FF48010 MOVS R0,#+1048576
\ 00000080 ........ BL RCC_APB1PeriphResetCmd
158 RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
\ 00000084 0021 MOVS R1,#+0
\ 00000086 5FF48010 MOVS R0,#+1048576
\ 0000008A ........ BL RCC_APB1PeriphResetCmd
159 }
160 }
161 }
\ ??USART_DeInit_1:
\ 0000008E 10BD POP {R4,PC} ;; return
162
163 /**
164 * @brief Initializes the USARTx peripheral according to the specified
165 * parameters in the USART_InitStruct .
166 * @param USARTx: Select the USART or the UART peripheral.
167 * This parameter can be one of the following values:
168 * USART1, USART2, USART3, UART4 or UART5.
169 * @param USART_InitStruct: pointer to a USART_InitTypeDef structure
170 * that contains the configuration information for the specified USART peripheral.
171 * @retval None
172 */
\ In section .text, align 2, keep-with-next
173 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
174 {
\ USART_Init:
\ 00000000 2DE9F047 PUSH {R4-R10,LR}
\ 00000004 86B0 SUB SP,SP,#+24
\ 00000006 0400 MOVS R4,R0
\ 00000008 0D00 MOVS R5,R1
175 uint32_t tmpreg = 0x00, apbclock = 0x00;
\ 0000000A 0026 MOVS R6,#+0
\ 0000000C 0027 MOVS R7,#+0
176 uint32_t integerdivider = 0x00;
\ 0000000E 5FF00008 MOVS R8,#+0
177 uint32_t fractionaldivider = 0x00;
\ 00000012 5FF00009 MOVS R9,#+0
178 uint32_t usartxbase = 0;
\ 00000016 5FF0000A MOVS R10,#+0
179 RCC_ClocksTypeDef RCC_ClocksStatus;
180 /* Check the parameters */
181 assert_param(IS_USART_ALL_PERIPH(USARTx));
182 assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate));
183 assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength));
184 assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits));
185 assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity));
186 assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode));
187 assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl));
188 /* The hardware flow control is available only for USART1, USART2 and USART3 */
189 if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None)
\ 0000001A A889 LDRH R0,[R5, #+12]
\ 0000001C 0028 CMP R0,#+0
190 {
191 assert_param(IS_USART_123_PERIPH(USARTx));
192 }
193
194 usartxbase = (uint32_t)USARTx;
\ ??USART_Init_0:
\ 0000001E A246 MOV R10,R4
195
196 /*---------------------------- USART CR2 Configuration -----------------------*/
197 tmpreg = USARTx->CR2;
\ 00000020 208A LDRH R0,[R4, #+16]
\ 00000022 0600 MOVS R6,R0
198 /* Clear STOP[13:12] bits */
199 tmpreg &= CR2_STOP_CLEAR_Mask;
\ 00000024 4CF6FF70 MOVW R0,#+53247
\ 00000028 0640 ANDS R6,R0,R6
200 /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/
201 /* Set STOP[13:12] bits according to USART_StopBits value */
202 tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
\ 0000002A E888 LDRH R0,[R5, #+6]
\ 0000002C 0643 ORRS R6,R0,R6
203
204 /* Write to USART CR2 */
205 USARTx->CR2 = (uint16_t)tmpreg;
\ 0000002E 2682 STRH R6,[R4, #+16]
206
207 /*---------------------------- USART CR1 Configuration -----------------------*/
208 tmpreg = USARTx->CR1;
\ 00000030 A089 LDRH R0,[R4, #+12]
\ 00000032 0600 MOVS R6,R0
209 /* Clear M, PCE, PS, TE and RE bits */
210 tmpreg &= CR1_CLEAR_Mask;
\ 00000034 4EF6F310 MOVW R0,#+59891
\ 00000038 0640 ANDS R6,R0,R6
211 /* Configure the USART Word Length, Parity and mode ----------------------- */
212 /* Set the M bits according to USART_WordLength value */
213 /* Set PCE and PS bits according to USART_Parity value */
214 /* Set TE and RE bits according to USART_Mode value */
215 tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
216 USART_InitStruct->USART_Mode;
\ 0000003A A888 LDRH R0,[R5, #+4]
\ 0000003C 2989 LDRH R1,[R5, #+8]
\ 0000003E 0843 ORRS R0,R1,R0
\ 00000040 6989 LDRH R1,[R5, #+10]
\ 00000042 0843 ORRS R0,R1,R0
\ 00000044 0643 ORRS R6,R0,R6
217 /* Write to USART CR1 */
218 USARTx->CR1 = (uint16_t)tmpreg;
\ 00000046 A681 STRH R6,[R4, #+12]
219
220 /*---------------------------- USART CR3 Configuration -----------------------*/
221 tmpreg = USARTx->CR3;
\ 00000048 A08A LDRH R0,[R4, #+20]
\ 0000004A 0600 MOVS R6,R0
222 /* Clear CTSE and RTSE bits */
223 tmpreg &= CR3_CLEAR_Mask;
\ 0000004C 4FF6FF40 MOVW R0,#+64767
\ 00000050 0640 ANDS R6,R0,R6
224 /* Configure the USART HFC -------------------------------------------------*/
225 /* Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
226 tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
\ 00000052 A889 LDRH R0,[R5, #+12]
\ 00000054 0643 ORRS R6,R0,R6
227 /* Write to USART CR3 */
228 USARTx->CR3 = (uint16_t)tmpreg;
\ 00000056 A682 STRH R6,[R4, #+20]
229
230 /*---------------------------- USART BRR Configuration -----------------------*/
231 /* Configure the USART Baud Rate -------------------------------------------*/
232 RCC_GetClocksFreq(&RCC_ClocksStatus);
\ 00000058 00A8 ADD R0,SP,#+0
\ 0000005A ........ BL RCC_GetClocksFreq
233 if (usartxbase == USART1_BASE)
\ 0000005E .... LDR.N R0,??DataTable1 ;; 0x40013800
\ 00000060 8245 CMP R10,R0
\ 00000062 02D1 BNE.N ??USART_Init_1
234 {
235 apbclock = RCC_ClocksStatus.PCLK2_Frequency;
\ 00000064 0398 LDR R0,[SP, #+12]
\ 00000066 0700 MOVS R7,R0
\ 00000068 01E0 B.N ??USART_Init_2
236 }
237 else
238 {
239 apbclock = RCC_ClocksStatus.PCLK1_Frequency;
\ ??USART_Init_1:
\ 0000006A 0298 LDR R0,[SP, #+8]
\ 0000006C 0700 MOVS R7,R0
240 }
241
242 /* Determine the integer part */
243 if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
\ ??USART_Init_2:
\ 0000006E A089 LDRH R0,[R4, #+12]
\ 00000070 0004 LSLS R0,R0,#+16
\ 00000072 08D5 BPL.N ??USART_Init_3
244 {
245 /* Integer part computing in case Oversampling mode is 8 Samples */
246 integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
\ 00000074 1920 MOVS R0,#+25
\ 00000076 00FB07F0 MUL R0,R0,R7
\ 0000007A 2968 LDR R1,[R5, #+0]
\ 0000007C 4900 LSLS R1,R1,#+1
\ 0000007E B0FBF1F0 UDIV R0,R0,R1
\ 00000082 8046 MOV R8,R0
\ 00000084 07E0 B.N ??USART_Init_4
247 }
248 else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
249 {
250 /* Integer part computing in case Oversampling mode is 16 Samples */
251 integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
\ ??USART_Init_3:
\ 00000086 1920 MOVS R0,#+25
\ 00000088 00FB07F0 MUL R0,R0,R7
\ 0000008C 2968 LDR R1,[R5, #+0]
\ 0000008E 8900 LSLS R1,R1,#+2
\ 00000090 B0FBF1F0 UDIV R0,R0,R1
\ 00000094 8046 MOV R8,R0
252 }
253 tmpreg = (integerdivider / 100) << 4;
\ ??USART_Init_4:
\ 00000096 6420 MOVS R0,#+100
\ 00000098 B8FBF0F0 UDIV R0,R8,R0
\ 0000009C 0001 LSLS R0,R0,#+4
\ 0000009E 0600 MOVS R6,R0
254
255 /* Determine the fractional part */
256 fractionaldivider = integerdivider - (100 * (tmpreg >> 4));
\ 000000A0 3009 LSRS R0,R6,#+4
\ 000000A2 6421 MOVS R1,#+100
\ 000000A4 01FB1080 MLS R0,R1,R0,R8
\ 000000A8 8146 MOV R9,R0
257
258 /* Implement the fractional part in the register */
259 if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
\ 000000AA A089 LDRH R0,[R4, #+12]
\ 000000AC 0004 LSLS R0,R0,#+16
\ 000000AE 09D5 BPL.N ??USART_Init_5
260 {
261 tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
\ 000000B0 5FEAC900 LSLS R0,R9,#+3
\ 000000B4 3230 ADDS R0,R0,#+50
\ 000000B6 6421 MOVS R1,#+100
\ 000000B8 B0FBF1F0 UDIV R0,R0,R1
\ 000000BC 10F00700 ANDS R0,R0,#0x7
\ 000000C0 0643 ORRS R6,R0,R6
\ 000000C2 08E0 B.N ??USART_Init_6
262 }
263 else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
264 {
265 tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
\ ??USART_Init_5:
\ 000000C4 5FEA0910 LSLS R0,R9,#+4
\ 000000C8 3230 ADDS R0,R0,#+50
\ 000000CA 6421 MOVS R1,#+100
\ 000000CC B0FBF1F0 UDIV R0,R0,R1
\ 000000D0 10F00F00 ANDS R0,R0,#0xF
\ 000000D4 0643 ORRS R6,R0,R6
266 }
267
268 /* Write to USART BRR */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -