⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal_uart.lst

📁 用IAR开发的ZIGBEE网络路由例子
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -