📄 hal_uart.lst
字号:
417 {
\ 000000 ; Saved register size: 0
\ 000000 ; Auto size: 0
418 #if HAL_UART_DMA
419 halDMADesc_t *ch;
420 #endif
421
422 // Set P2 priority - USART0 over USART1 if both are defined.
423 P2DIR &= ~P2DIR_PRIPO;
\ 000000 53FF3F ANL 0xff,#0x3f
\ 000003 E5FF MOV A,0xff
424 P2DIR |= HAL_UART_PRIPO;
\ 000005 43FF40 ORL 0xff,#0x40
425
426 #if HAL_UART_0_ENABLE
427 // Set UART0 I/O location to P0.
428 PERCFG &= ~HAL_UART_0_PERCFG_BIT;
429
430 /* Enable Tx and Rx on P0 */
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;
446
447 /* Enable Tx and Rx on P1 */
448 P1SEL |= HAL_UART_1_P1_RX_TX;
449
450 /* Make sure ADC doesnt use this */
451 ADCCFG &= ~HAL_UART_1_P1_RX_TX;
452
453 /* Mode is UART Mode */
454 U1CSR = CSR_MODE;
455
456 /* Flush it */
457 U1UCR = UCR_FLUSH;
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 }
\ 000008 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 74F4 MOV A,#-0xc
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 12
\ 000005 ; Auto size: 0
\ 000005 8A.. MOV ?V0 + 0,R2
\ 000007 8B.. MOV ?V0 + 1,R3
543 uartCfg_t **cfgPP = NULL;
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 )
555 {
556 cfgPP = &cfg1;
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 ) );
\ 000009 ; Setup parameters for call to function osal_mem_alloc
\ 000009 7A13 MOV R2,#0x13
\ 00000B 7B00 MOV R3,#0x0
\ 00000D 90.... MOV DPTR,#(osal_mem_alloc & 0xffff)
\ 000010 74.. MOV A,#((osal_mem_alloc >> 16) & 0xff)
\ 000012 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 000015 900000 MOV DPTR,#0x0
\ 000018 EA MOV A,R2
\ 000019 F0 MOVX @DPTR,A
\ 00001A A3 INC DPTR
\ 00001B EB MOV A,R3
\ 00001C F0 MOVX @DPTR,A
576 cfg = *cfgPP;
\ 00001D 900000 MOV DPTR,#0x0
\ 000020 E0 MOVX A,@DPTR
\ 000021 FE MOV R6,A
\ 000022 A3 INC DPTR
\ 000023 E0 MOVX A,@DPTR
\ 000024 FF MOV R7,A
577 HAL_UART_ASSERT( cfg );
578
579 cfg->rxMax = config->rx.maxBufSize;
\ 000025 E5.. MOV A,?V0 + 0
\ 000027 240A ADD A,#0xa
\ 000029 F5.. MOV ?V0 + 2,A
\ 00002B E5.. MOV A,?V0 + 1
\ 00002D 3400 ADDC A,#0x0
\ 00002F F5.. MOV ?V0 + 3,A
\ 000031 85..82 MOV DPL,?V0 + 2
\ 000034 F583 MOV DPH,A
\ 000036 E0 MOVX A,@DPTR
\ 000037 8E82 MOV DPL,R6
\ 000039 8F83 MOV DPH,R7
\ 00003B A3 INC DPTR
\ 00003C A3 INC DPTR
\ 00003D A3 INC DPTR
\ 00003E A3 INC DPTR
\ 00003F 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;
\ 000040 EE MOV A,R6
\ 000041 240C ADD A,#0xc
\ 000043 F8 MOV R0,A
\ 000044 EF MOV A,R7
\ 000045 3400 ADDC A,#0x0
\ 000047 F9 MOV R1,A
\ 000048 E5.. MOV A,?V0 + 0
\ 00004A 2412 ADD A,#0x12
\ 00004C F582 MOV DPL,A
\ 00004E E5.. MOV A,?V0 + 1
\ 000050 3400 ADDC A,#0x0
\ 000052 F583 MOV DPH,A
\ 000054 E0 MOVX A,@DPTR
\ 000055 8882 MOV DPL,R0
\ 000057 8983 MOV DPH,R1
\ 000059 F0 MOVX @DPTR,A
585 cfg->txBuf = osal_mem_alloc( cfg->txMax+1 );
\ 00005A ; Setup parameters for call to function osal_mem_alloc
\ 00005A F8 MOV R0,A
\ 00005B 7401 MOV A,#0x1
\ 00005D 28 ADD A,R0
\ 00005E FA MOV R2,A
\ 00005F E4 CLR A
\ 000060 3400 ADDC A,#0x0
\ 000062 FB MOV R3,A
\ 000063 90.... MOV DPTR,#(osal_mem_alloc & 0xffff)
\ 000066 74.. MOV A,#((osal_mem_alloc >> 16) & 0xff)
\ 000068 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 00006B 8E82 MOV DPL,R6
\ 00006D 8F83 MOV DPH,R7
\ 00006F A3 INC DPTR
\ 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 EA MOV A,R2
\ 000078 F0 MOVX @DPTR,A
\ 000079 A3 INC DPTR
\ 00007A EB MOV A,R3
\ 00007B F0 MOVX @DPTR,A
586
587 cfg->rxHead = cfg->rxTail = 0;
\ 00007C E4 CLR A
\ 00007D 8E82 MOV DPL,R6
\ 00007F 8F83 MOV DPH,R7
\ 000081 A3 INC DPTR
\ 000082 A3 INC DPTR
\ 000083 A3 INC DPTR
\ 000084 F0 MOVX @DPTR,A
\ 000085 8E82 MOV DPL,R6
\ 000087 8F83 MOV DPH,R7
\ 000089 A3 INC DPTR
\ 00008A A3 INC DPTR
\ 00008B F0 MOVX @DPTR,A
588 cfg->txHead = cfg->txTail = 0;
\ 00008C EE MOV A,R6
\ 00008D 240B ADD A,#0xb
\ 00008F F582 MOV DPL,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -