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

📄 hal_uart.lst

📁 cc2430应用实例
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -