stm32f10x_usart.txt
来自「基于cortex arm stm32f103RB的智能卡(SmartCard)程」· 文本 代码 · 共 844 行 · 第 1/3 页
TXT
844 行
000010 8181 STRH r1,[r0,#0xc]
;;;260 }
;;;261 }
000012 4770 BX lr
ENDP
AREA ||i.USART_ITConfig||, CODE, READONLY, ALIGN=1
USART_ITConfig PROC
;;;284 void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState)
;;;285 {
000000 b510 PUSH {r4,lr}
;;;286 u32 usartreg = 0x00, itpos = 0x00, itmask = 0x00;
;;;287 u32 address = 0x00;
;;;288
;;;289 /* Check the parameters */
;;;290 assert_param(IS_USART_CONFIG_IT(USART_IT));
;;;291 assert_param(IS_FUNCTIONAL_STATE(NewState));
;;;292
;;;293 /* Get the USART register index */
;;;294 usartreg = (((u8)USART_IT) >> 0x05);
000002 f3c1f3c1 UBFX r3,r1,#5,#3
;;;295
;;;296 /* Get the interrupt position */
;;;297 itpos = USART_IT & USART_IT_Mask;
000006 f001f001 AND r4,r1,#0x1f
;;;298
;;;299 itmask = (((u32)0x01) << itpos);
00000a 2101 MOVS r1,#1
00000c 40a1 LSLS r1,r1,r4
;;;300 address = *(u32*)&(USARTx);
;;;301
;;;302 if (usartreg == 0x01) /* The IT is in CR1 register */
00000e 2b01 CMP r3,#1
000010 d101 BNE |L5.22|
;;;303 {
;;;304 address += 0x0C;
000012 300c ADDS r0,r0,#0xc
000014 e004 B |L5.32|
|L5.22|
;;;305 }
;;;306 else if (usartreg == 0x02) /* The IT is in CR2 register */
000016 2b02 CMP r3,#2
000018 d101 BNE |L5.30|
;;;307 {
;;;308 address += 0x10;
00001a 3010 ADDS r0,r0,#0x10
00001c e000 B |L5.32|
|L5.30|
;;;309 }
;;;310 else /* The IT is in CR3 register */
;;;311 {
;;;312 address += 0x14;
00001e 3014 ADDS r0,r0,#0x14
|L5.32|
;;;313 }
;;;314 if (NewState != DISABLE)
000020 2a00 CMP r2,#0
000022 6802 LDR r2,[r0,#0]
000024 d001 BEQ |L5.42|
;;;315 {
;;;316 *(u32*)address |= itmask;
000026 430a ORRS r2,r2,r1
000028 e000 B |L5.44|
|L5.42|
;;;317 }
;;;318 else
;;;319 {
;;;320 *(u32*)address &= ~itmask;
00002a 438a BICS r2,r2,r1
|L5.44|
00002c 6002 STR r2,[r0,#0]
;;;321 }
;;;322 }
00002e bd10 POP {r4,pc}
ENDP
AREA ||i.USART_DMACmd||, CODE, READONLY, ALIGN=1
USART_DMACmd PROC
;;;343
;;;344 if (NewState != DISABLE)
000000 2a00 CMP r2,#0
;;;345 {
;;;346 /* Enable the DMA transfer for selected requests by setting the DMAT and/or
;;;347 DMAR bits in the USART CR3 register */
;;;348 USARTx->CR3 |= USART_DMAReq;
000002 8a82 LDRH r2,[r0,#0x14]
000004 d001 BEQ |L6.10|
000006 430a ORRS r2,r2,r1
000008 e000 B |L6.12|
|L6.10|
;;;349 }
;;;350 else
;;;351 {
;;;352 /* Disable the DMA transfer for selected requests by clearing the DMAT and/or
;;;353 DMAR bits in the USART CR3 register */
;;;354 USARTx->CR3 &= (u16)~USART_DMAReq;
00000a 438a BICS r2,r2,r1
|L6.12|
00000c 8282 STRH r2,[r0,#0x14]
;;;355 }
;;;356 }
00000e 4770 BX lr
ENDP
AREA ||i.USART_SetAddress||, CODE, READONLY, ALIGN=1
USART_SetAddress PROC
;;;372 /* Clear the USART address */
;;;373 USARTx->CR2 &= CR2_Address_Mask;
000000 8a02 LDRH r2,[r0,#0x10]
000002 f022f022 BIC r2,r2,#0xf
000006 8202 STRH r2,[r0,#0x10]
;;;374 /* Set the USART address node */
;;;375 USARTx->CR2 |= USART_Address;
000008 8a02 LDRH r2,[r0,#0x10]
00000a 430a ORRS r2,r2,r1
00000c 8202 STRH r2,[r0,#0x10]
;;;376 }
00000e 4770 BX lr
ENDP
AREA ||i.USART_WakeUpConfig||, CODE, READONLY, ALIGN=1
USART_WakeUpConfig PROC
;;;394
;;;395 USARTx->CR1 &= CR3_WAKE_Mask;
000000 8982 LDRH r2,[r0,#0xc]
000002 f422f422 BIC r2,r2,#0x800
000006 8182 STRH r2,[r0,#0xc]
;;;396 USARTx->CR1 |= USART_WakeUp;
000008 8982 LDRH r2,[r0,#0xc]
00000a 430a ORRS r2,r2,r1
00000c 8182 STRH r2,[r0,#0xc]
;;;397 }
00000e 4770 BX lr
ENDP
AREA ||i.USART_ReceiverWakeUpCmd||, CODE, READONLY, ALIGN=1
USART_ReceiverWakeUpCmd PROC
;;;413
;;;414 if (NewState != DISABLE)
000000 2900 CMP r1,#0
;;;415 {
;;;416 /* Enable the mute mode USART by setting the RWU bit in the CR1 register */
;;;417 USARTx->CR1 |= CR1_RWU_Set;
000002 8981 LDRH r1,[r0,#0xc]
000004 d002 BEQ |L9.12|
000006 f041f041 ORR r1,r1,#2
00000a e001 B |L9.16|
|L9.12|
;;;418 }
;;;419 else
;;;420 {
;;;421 /* Disable the mute mode USART by clearing the RWU bit in the CR1 register */
;;;422 USARTx->CR1 &= CR1_RWU_Reset;
00000c f021f021 BIC r1,r1,#2
|L9.16|
000010 8181 STRH r1,[r0,#0xc]
;;;423 }
;;;424 }
000012 4770 BX lr
ENDP
AREA ||i.USART_LINBreakDetectLengthConfig||, CODE, READONLY, ALIGN=1
USART_LINBreakDetectLengthConfig PROC
;;;443
;;;444 USARTx->CR2 &= CR3_LBDL_Mask;
000000 8a02 LDRH r2,[r0,#0x10]
000002 f022f022 BIC r2,r2,#0x20
000006 8202 STRH r2,[r0,#0x10]
;;;445 USARTx->CR2 |= USART_LINBreakDetectLength;
000008 8a02 LDRH r2,[r0,#0x10]
00000a 430a ORRS r2,r2,r1
00000c 8202 STRH r2,[r0,#0x10]
;;;446 }
00000e 4770 BX lr
ENDP
AREA ||i.USART_LINCmd||, CODE, READONLY, ALIGN=1
USART_LINCmd PROC
;;;462
;;;463 if (NewState != DISABLE)
000000 2900 CMP r1,#0
;;;464 {
;;;465 /* Enable the LIN mode by setting the LINE bit in the CR2 register */
;;;466 USARTx->CR2 |= CR2_LINE_Set;
000002 8a01 LDRH r1,[r0,#0x10]
000004 d002 BEQ |L11.12|
000006 f441f441 ORR r1,r1,#0x4000
00000a e001 B |L11.16|
|L11.12|
;;;467 }
;;;468 else
;;;469 {
;;;470 /* Disable the LIN mode by clearing the LINE bit in the CR2 register */
;;;471 USARTx->CR2 &= CR2_LINE_Reset;
00000c f421f421 BIC r1,r1,#0x4000
|L11.16|
000010 8201 STRH r1,[r0,#0x10]
;;;472 }
;;;473 }
000012 4770 BX lr
ENDP
AREA ||i.USART_SendData||, CODE, READONLY, ALIGN=1
USART_SendData PROC
;;;489 /* Transmit Data */
;;;490 USARTx->DR = (Data & (u16)0x01FF);
000000 f3c1f3c1 UBFX r1,r1,#0,#9
000004 8081 STRH r1,[r0,#4]
;;;491 }
000006 4770 BX lr
ENDP
AREA ||i.USART_ReceiveData||, CODE, READONLY, ALIGN=1
USART_ReceiveData PROC
;;;503 /* Receive Data */
;;;504 return (u16)(USARTx->DR & (u16)0x01FF);
000000 8880 LDRH r0,[r0,#4]
000002 f3c0f3c0 UBFX r0,r0,#0,#9
;;;505 }
000006 4770 BX lr
ENDP
AREA ||i.USART_SendBreak||, CODE, READONLY, ALIGN=1
USART_SendBreak PROC
;;;517 /* Send break characters */
;;;518 USARTx->CR1 |= CR1_SBK_Set;
000000 8981 LDRH r1,[r0,#0xc]
000002 f041f041 ORR r1,r1,#1
000006 8181 STRH r1,[r0,#0xc]
;;;519 }
000008 4770 BX lr
ENDP
AREA ||i.USART_SetGuardTime||, CODE, READONLY, ALIGN=1
USART_SetGuardTime PROC
;;;532 /* Clear the USART Guard time */
;;;533 USARTx->GTPR &= GTPR_LSB_Mask;
000000 8b02 LDRH r2,[r0,#0x18]
000002 b2d2 UXTB r2,r2
000004 8302 STRH r2,[r0,#0x18]
;;;534 /* Set the USART guard time */
;;;535 USARTx->GTPR |= (u16)((u16)USART_GuardTime << 0x08);
000006 8b02 LDRH r2,[r0,#0x18]
000008 ea42ea42 ORR r1,r2,r1,LSL #8
00000c 8301 STRH r1,[r0,#0x18]
;;;536 }
00000e 4770 BX lr
ENDP
AREA ||i.USART_SetPrescaler||, CODE, READONLY, ALIGN=1
USART_SetPrescaler PROC
;;;549 /* Clear the USART prescaler */
;;;550 USARTx->GTPR &= GTPR_MSB_Mask;
000000 8b02 LDRH r2,[r0,#0x18]
000002 f402f402 AND r2,r2,#0xff00
000006 8302 STRH r2,[r0,#0x18]
;;;551 /* Set the USART prescaler */
;;;552 USARTx->GTPR |= USART_Prescaler;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?