📄 hal_uart.lst
字号:
431 P0SEL |= HAL_UART_0_P0_RX_TX;
432
433 /* Make sure ADC doesnt use this */
434 ADCCFG &= ~HAL_UART_0_P0_RX_TX;
435
436 /* Mode is UART Mode */
437 U0CSR = CSR_MODE;
438
439 /* Flush it */
440 U0UCR = UCR_FLUSH;
441 #endif
442
443 #if HAL_UART_1_ENABLE
444 // Set UART1 I/O location to P1.
445 PERCFG |= HAL_UART_1_PERCFG_BIT;
\ 000008 43F102 ORL 0xf1,#0x2
446
447 /* Enable Tx and Rx on P1 */
448 P1SEL |= HAL_UART_1_P1_RX_TX;
\ 00000B 43F4C0 ORL 0xf4,#0xc0
\ 00000E E5F4 MOV A,0xf4
449
450 /* Make sure ADC doesnt use this */
451 ADCCFG &= ~HAL_UART_1_P1_RX_TX;
\ 000010 53F23F ANL 0xf2,#0x3f
\ 000013 E5F2 MOV A,0xf2
452
453 /* Mode is UART Mode */
454 U1CSR = CSR_MODE;
\ 000015 75F880 MOV 0xf8,#-0x80
455
456 /* Flush it */
457 U1UCR = UCR_FLUSH;
\ 000018 75FB80 MOV 0xfb,#-0x80
458 #endif
459
460 #if HAL_UART_DMA
461 // Setup Tx by DMA.
462 ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_TX );
463
464 // The start address of the destination.
465 HAL_DMA_SET_DEST( ch, DMA_UDBUF );
466
467 // Using the length field to determine how many bytes to transfer.
468 HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN );
469
470 // One byte is transferred each time.
471 HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE );
472
473 // The bytes are transferred 1-by-1 on Tx Complete trigger.
474 HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE );
475 HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_TX );
476
477 // The source address is decremented by 1 byte after each transfer.
478 HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_1 );
479
480 // The destination address is constant - the Tx Data Buffer.
481 HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_0 );
482
483 // The DMA is to be polled and shall not issue an IRQ upon completion.
484 HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE );
485
486 // Xfer all 8 bits of a byte xfer.
487 HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS );
488
489 // DMA Tx has shared priority for memory access - every other one.
490 HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH );
491
492 // Setup Rx by DMA.
493 ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_RX );
494
495 // The start address of the source.
496 HAL_DMA_SET_SOURCE( ch, DMA_UDBUF );
497
498 // Using the length field to determine how many bytes to transfer.
499 HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN );
500
501 /* The trick is to cfg DMA to xfer 2 bytes for every 1 byte of Rx.
502 * The byte after the Rx Data Buffer is the Baud Cfg Register,
503 * which always has a known value. So init Rx buffer to inverse of that
504 * known value. DMA word xfer will flip the bytes, so every valid Rx byte
505 * in the Rx buffer will be preceded by a DMA_PAD char equal to the
506 * Baud Cfg Register value.
507 */
508 HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD );
509
510 // The bytes are transferred 1-by-1 on Rx Complete trigger.
511 HAL_DMA_SET_TRIG_MODE( ch, HAL_DMA_TMODE_SINGLE );
512 HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX );
513
514 // The source address is constant - the Rx Data Buffer.
515 HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 );
516
517 // The destination address is incremented by 1 word after each transfer.
518 HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 );
519
520 // The DMA is to be polled and shall not issue an IRQ upon completion.
521 HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE );
522
523 // Xfer all 8 bits of a byte xfer.
524 HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS );
525
526 // DMA has highest priority for memory access.
527 HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH );
528 #endif
529 }
\ 00001B 02.... LJMP ?BRET
530
531 /******************************************************************************
532 * @fn HalUARTOpen
533 *
534 * @brief Open a port according tp the configuration specified by parameter.
535 *
536 * @param port - UART port
537 * config - contains configuration information
538 *
539 * @return Status of the function call
540 *****************************************************************************/
\ In segment BANKED_CODE, align 1, keep-with-next
541 uint8 HalUARTOpen( uint8 port, halUARTCfg_t *config )
\ HalUARTOpen:
542 {
\ 000000 74F2 MOV A,#-0xe
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 14
\ 000005 ; Auto size: 0
\ 000005 89.. MOV ?V0 + 2,R1
\ 000007 8A.. MOV ?V0 + 0,R2
\ 000009 8B.. MOV ?V0 + 1,R3
543 uartCfg_t **cfgPP = NULL;
\ 00000B 7E00 MOV R6,#0x0
\ 00000D 7F00 MOV R7,#0x0
544 uartCfg_t *cfg;
545
546 #if HAL_UART_0_ENABLE
547 if ( port == HAL_UART_PORT_0 )
548 {
549 cfgPP = &cfg0;
550 }
551 #endif
552
553 #if HAL_UART_1_ENABLE
554 if ( port == HAL_UART_PORT_1 )
\ 00000F 7401 MOV A,#0x1
\ 000011 65.. XRL A,?V0 + 2
\ 000013 7004 JNZ ??HalUARTOpen_0
555 {
556 cfgPP = &cfg1;
\ 000015 7E.. MOV R6,#(??cfg1 & 0xff)
\ 000017 7F.. MOV R7,#((??cfg1 >> 8) & 0xff)
557 }
558 #endif
559
560 HAL_UART_ASSERT( cfgPP );
561
562 #if HAL_UART_CLOSE
563 // Protect against user re-opening port before closing it.
564 HalUARTClose( port );
565 #else
566 HAL_UART_ASSERT( *cfgPP == NULL );
567 #endif
568
569 HAL_UART_ASSERT( (config->baudRate == HAL_UART_BR_38400) ||
570 (config->baudRate == HAL_UART_BR_115200) );
571
572 /* Whereas runtime heap alloc can be expected to fail - one-shot system
573 * initialization must succeed, so no check for alloc fail.
574 */
575 *cfgPP = (uartCfg_t *)osal_mem_alloc( sizeof( uartCfg_t ) );
\ ??HalUARTOpen_0:
\ 000019 ; Setup parameters for call to function osal_mem_alloc
\ 000019 7A13 MOV R2,#0x13
\ 00001B 7B00 MOV R3,#0x0
\ 00001D 90.... MOV DPTR,#(osal_mem_alloc & 0xffff)
\ 000020 74.. MOV A,#((osal_mem_alloc >> 16) & 0xff)
\ 000022 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 000025 8E82 MOV DPL,R6
\ 000027 8F83 MOV DPH,R7
\ 000029 EA MOV A,R2
\ 00002A F0 MOVX @DPTR,A
\ 00002B A3 INC DPTR
\ 00002C EB MOV A,R3
\ 00002D F0 MOVX @DPTR,A
576 cfg = *cfgPP;
\ 00002E 8E82 MOV DPL,R6
\ 000030 8F83 MOV DPH,R7
\ 000032 E0 MOVX A,@DPTR
\ 000033 FE MOV R6,A
\ 000034 A3 INC DPTR
\ 000035 E0 MOVX A,@DPTR
\ 000036 FF MOV R7,A
577 HAL_UART_ASSERT( cfg );
578
579 cfg->rxMax = config->rx.maxBufSize;
\ 000037 E5.. MOV A,?V0 + 0
\ 000039 240A ADD A,#0xa
\ 00003B F5.. MOV ?V0 + 4,A
\ 00003D E5.. MOV A,?V0 + 1
\ 00003F 3400 ADDC A,#0x0
\ 000041 F5.. MOV ?V0 + 5,A
\ 000043 85..82 MOV DPL,?V0 + 4
\ 000046 F583 MOV DPH,A
\ 000048 E0 MOVX A,@DPTR
\ 000049 8E82 MOV DPL,R6
\ 00004B 8F83 MOV DPH,R7
\ 00004D A3 INC DPTR
\ 00004E A3 INC DPTR
\ 00004F A3 INC DPTR
\ 000050 A3 INC DPTR
\ 000051 F0 MOVX @DPTR,A
580
581 #if !HAL_UART_BIG_TX_BUF
582 HAL_UART_ASSERT( (config->tx.maxBufSize < 256) );
583 #endif
584 cfg->txMax = config->tx.maxBufSize;
\ 000052 EE MOV A,R6
\ 000053 240C ADD A,#0xc
\ 000055 F8 MOV R0,A
\ 000056 EF MOV A,R7
\ 000057 3400 ADDC A,#0x0
\ 000059 F9 MOV R1,A
\ 00005A E5.. MOV A,?V0 + 0
\ 00005C 2412 ADD A,#0x12
\ 00005E 12.... LCALL ?Subroutine8 & 0xFFFF
\ ??CrossCallReturnLabel_21:
\ 000061 8882 MOV DPL,R0
\ 000063 8983 MOV DPH,R1
\ 000065 F0 MOVX @DPTR,A
585 cfg->txBuf = osal_mem_alloc( cfg->txMax+1 );
\ 000066 ; Setup parameters for call to function osal_mem_alloc
\ 000066 12.... LCALL ?Subroutine11 & 0xFFFF
\ ??CrossCallReturnLabel_33:
\ 000069 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 00006C 8E82 MOV DPL,R6
\ 00006E 8F83 MOV DPH,R7
\ 000070 A3 INC DPTR
\ 000071 A3 INC DPTR
\ 000072 A3 INC DPTR
\ 000073 A3 INC DPTR
\ 000074 A3 INC DPTR
\ 000075 A3 INC DPTR
\ 000076 A3 INC DPTR
\ 000077 A3 INC DPTR
\ 000078 EA MOV A,R2
\ 000079 F0 MOVX @DPTR,A
\ 00007A A3 INC DPTR
\ 00007B EB MOV A,R3
\ 00007C F0 MOVX @DPTR,A
586
587 cfg->rxHead = cfg->rxTail = 0;
\ 00007D E4 CLR A
\ 00007E 8E82 MOV DPL,R6
\ 000080 8F83 MOV DPH,R7
\ 000082 A3 INC DPTR
\ 000083 A3 INC DPTR
\ 000084 A3 INC DPTR
\ 000085 12.... LCALL ?Subroutine14 & 0xFFFF
\ ??CrossCallReturnLabel_40:
\ 000088 A3 INC DPTR
\ 000089 F0 MOVX @DPTR,A
588 cfg->txHead = cfg->txTail = 0;
\ 00008A EE MOV A,R6
\ 00008B 240B ADD A,#0xb
\ 00008D 12.... LCALL ?Subroutine16 & 0xFFFF
\ ??CrossCallReturnLabel_46:
\ 000090 E4 CLR A
\ 000091 12.... LCALL ?Subroutine10 & 0xFFFF
\ ??CrossCallReturnLabel_32:
\ 000094 A3 INC DPTR
\ 000095 A3 INC DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -