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

📄 ta_uart.s43

📁 MSP 430 timer_uart,tmA3的片子可直接使用模块
💻 S43
字号:
;*******************************************************************************
;   Code for application report - "Timer_A UART Library"
;*******************************************************************************
; THIS PROGRAM IS PROVIDED "AS IS". TI MAKES NO WARRANTIES OR
; REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
; INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
; FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
; COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE.
; TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET
; POSSESSION, AND NON-INFRINGEMENT OF ANY THIRD PARTY
; INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR
; YOUR USE OF THE PROGRAM.
;
; IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
; CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY
; THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED
; OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT
; OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM.
; EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF
; REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS
; OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF
; USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI'S
; AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF
; YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS
; (U.S.$500).
;
; Unless otherwise stated, the Program written and copyrighted
; by Texas Instruments is distributed as "freeware".  You may,
; only under TI's copyright in the Program, use and modify the
; Program without any charge or restriction.  You may
; distribute to third parties, provided that you transfer a
; copy of this license to the third party and the third party
; agrees to these terms by its first use of the Program. You
; must reproduce the copyright notice and any other legend of
; ownership on each copy or partial copy, of the Program.
;
; You acknowledge and agree that the Program contains
; copyrighted material, trade secrets and other TI proprietary
; information and is protected by copyright laws,
; international copyright treaties, and trade secret laws, as
; well as other intellectual property laws.  To protect TI's
; rights in the Program, you agree not to decompile, reverse
; engineer, disassemble or otherwise translate any object code
; versions of the Program to a human-readable form.  You agree
; that in no event will you alter, remove or destroy any
; copyright notice included in the Program.  TI reserves all
; rights not specifically granted under this license. Except
; as specifically provided herein, nothing in this agreement
; shall be construed as conferring by implication, estoppel,
; or otherwise, upon you, any license or other right under any
; TI patents, copyrights or trade secrets.
;
; You may not use the Program in non-TI devices.
;
;*******************************************************************************
;   TA UART Library
;
;   Description; Allows Timer_A to communicate through UART
;
;   Typical Cycle Count per function:
;   TI_initTimer                59
;   TI_setCallbackFunction      13
;   TI_TX_Byte                  64
;
;   Memory Usage:               <296 bytes
;
;   L. Westlund
;   Version    1.1
;   Texas Instruments, Inc
;   July 2007
;   Built with IAR Embedded Workbench Version: 3.42A
;*******************************************************************************
;Change log
;
;1.0 - Inital version - L.Westlund
;1.1 - Misc. updates - A.Dannenberg
;      * Code now preserves registers used in callback function
;      * Fixed issue with possible SR corruption
;      * Included RTMODEL statement to flag potential incompatible calling
;        conventions
;      * Removed TACCR0_UNUSED feature
;*******************************************************************************
;*******************************************************************************
;   Timer_A UART Library - does not assume 32Khz xtal
;
;
;                   MSP430
;             -----------------
;         /|\|              XIN|-
;          | |                 | 32kHz (optional)
;          --|RST          XOUT|-
;            |                 |
;            |         P1.2/TA1|<----------
;            |                 |
;            |         P1.3/TA2|---------->
;
;*******************************************************************************
#include  <msp430x11x1.h>

; The USE_C_CONTEXT_SAVE macro is used when C functions are called from the
; library. The macro preserves registers R13 - R15 which may be destroyed
; during a C function call. If the calling function is in assembler the
; macro need not be used.
#define USE_C_CONTEXT_SAVE

RXD                  EQU     004h           ; RXD on P1.2
TXD                  EQU     008h           ; TXD on P1.3

#define TACLK_MCLK_SYNC     1

#define TI_TA_TX_READY      0x01
#define TI_TA_RX_RECEIVED   0x02

            MODULE    ta_uartx
            RTMODEL   "__rt_version", "2"   ; Ensure correct runtime model
            RTMODEL   "__core", "64kb"

            PUBLIC    TI_RXData
            PUBLIC    TI_FuncPtr
            PUBLIC    TI_TA_UART_StatusFlags
            ;Functions
            PUBLIC    TI_initTimer
            PUBLIC    TI_setCallbackFunction
            PUBLIC    TI_TX_Byte

            RSEG      DATA16_N
TI_FuncPtr            DS 2
TI_Bitime             DS 2
TI_Bitime_5           DS 2
TI_TXData             DS 2
OLD_LPM               DS 1
TI_RXData             DS 1
TI_TXBitCnt           DS 1
TI_RXBitCnt           DS 1
TI_TA_UART_StatusFlags      DS 1

            RSEG    CODE                    ; Code is relocatable
            EVEN
;============================================================================
; TI_initTimer (func ptr, bitime, bitime_2, clock_source)
;============================================================================
TI_initTimer
            mov.w   #MC_2,&TACTL            ; Continuous mode
            mov.w   #OUT,&TACCTL2           ; TXD Idle as Mark
SetupP1_2   bis.b   #TXD+RXD,&P1SEL         ; P1.2/3 Timer func
            bis.b   #TXD,&P1DIR             ; TXD output on P1
            bic.b   #RXD,&P1DIR             ; RXD input on P1
            mov.w   r14,  &TI_Bitime        ; Bitime, 2nd param
            clrc
            rrc.w   r14                     ; get half bit time
            mov.w   r14,  &TI_Bitime_5      ; set Bitime/2
            bis.w   2(SP),&TACTL            ; Select Clock Source, 3th param
            mov.b   #TI_TA_TX_READY, &TI_TA_UART_StatusFlags
;-------------------------------FALL-THROUGH----------------------------------
TI_setCallbackFunction;    Subroutine that sets function to be called after RX
;-----------------------------------------------------------------------------
            mov.w   r12, &TI_FuncPtr        ; move function ptr, 1st param
;-------------------------------FALL-THROUGH----------------------------------
RX_Ready    ; Subroutine that Readies UART to RX Byte into RXData Buffer
;-----------------------------------------------------------------------------
            mov.b   #08,&TI_RXBitCnt        ; Load Bit Counter, 8 data bits
            mov.w   #CM1+CAP+CCIE,&TACCTL1  ; Sync, Neg Edge, Capture, Int
            ret                             ; Return from subroutine

;-----------------------------------------------------------------------------
TI_TX_Byte     ; Subroutine that Transmit One Byte from TXData Buffer
;-----------------------------------------------------------------------------
            bit.b   #TI_TA_TX_READY, &TI_TA_UART_StatusFlags
            jz      TX_Return
            bic.b   #TI_TA_TX_READY, &TI_TA_UART_StatusFlags
#ifndef TACLK_MCLK_SYNC
            mov.w   #CM_1+CCIS_2+CAP+SCS+OUT, &TACCTL2;
            bic.w   #CCIFG, &TACCTL2
            bis.w   #CCIS0, &TACCTL2
Test_Cap    bit.w   #CCIFG, &TACCTL2
            jz      Test_Cap
#else
            mov.w   &TAR, &TACCR2
#endif
            add.w   &TI_Bitime,&TACCR2      ; Some time till first bit
            mov.w   r12, &TI_TXData         ; put character into TXData
            bis.w   #0100h, &TI_TXData      ; Add mark stop bit to TX Data
            rla.w   &TI_TXData              ; Add space start bit
            mov.b   #10,&TI_TXBitCnt        ; Load Bit Counter, 8data + ST/SP
            mov.w   #OUTMOD0+CCIE,&TACCTL2  ; TXD = mark = idle
TX_Return   ret                             ;

;------------------------------------------------------------------------------
TA1_ISR     ;  RXTXData Buffer holds UART Data for RX, R12 for TX
;------------------------------------------------------------------------------
            add.w   &TAIV, PC
            nop                             ; only here as a filler
            jmp     RX_byte                 ; TAIV case 2: RX byte
            jmp     TX_byte                 ; TAIV case 4: TX byte
            nop                             ; filler
            reti                            ; TAIV case 10: overflow
TX_byte     add.w   &TI_Bitime, &TACCR2
            cmp.b   #00h,&TI_TXBitCnt       ;
            jne     TX_Next                 ; Next bit?
            bic.w   #CCIE,&TACCTL2          ; All Bits TX or RX, Disable Int.
            bis.b   #TI_TA_TX_READY, &TI_TA_UART_StatusFlags; All bits TX'ed set flag
            reti                            ;
TX_Next     bic.w   #OUTMOD2,&TACCTL2       ; TX Mark
            rra.w   &TI_TXData              ; LSB is shifted to carry
            jc      TX_Test                 ; Jump --> bit = 1
TX_Spac     bis.w   #OUTMOD2,&TACCTL2       ; TX Space
TX_Test     dec.b   &TI_TXBitCnt            ; All bits sent (or received)?
            reti                            ;
RX_byte
            add.w   &TI_Bitime, &TACCR1
            bit.w   #CAP,&TACCTL1           ; Capture mode = start bit edge
            jz      RX_Bit
            bit.b   #TI_TA_RX_RECEIVED, &TI_TA_UART_StatusFlags
            jnz     RX_Next
            bic.w   #CAP, &TACCTL1
            add.w   &TI_Bitime_5, &TACCR1
            mov.b   @SP, &OLD_LPM           ; make copy of LPMx bits
            bic.w   #SCG0+SCG1, 0(SP)       ; ensure device is atleast LPM0
            reti                            ;
RX_Bit      bit.w   #SCCI,&TACCTL1          ; Get bit waiting in receive latch
            rrc.b   &TI_RXData              ; Store received bit
RX_Test     dec.b   &TI_RXBitCnt            ; All bits sent (or received)?
            jnz     RX_Next                 ; Next bit?
                                            ; Decode of Received Byte Here
RX_Comp     bis.b   #TI_TA_RX_RECEIVED, &TI_TA_UART_StatusFlags
            call    #RX_Ready
            push.w  R12
#ifdef USE_C_CONTEXT_SAVE                   ; Full context save?
            push.w  R13                     ; (needed as a C-callback function
            push.w  R14                     ; can be used. May be optimized
            push.w  R15                     ; in case of an ASM callback fn.)
            mov.b   &OLD_LPM, R12           ; Retrieve original LPMx...
            and.b   #SCG0+SCG1,R12          ; ...isolate modified bits...
            bis.w   R12,8(SP)               ; and return original LPMx to stack
#else
            mov.b   &OLD_LPM,R12            ; Retrieve original LPMx...
            and.b   #SCG0+SCG1,R12          ; ...isolate modified bits...
            bis.w   R12,2(SP)               ; and return original LPMx to stack
#endif
            mov.b   &TI_RXData, R12         ; Pass value to callback func
            call    &TI_FuncPtr
            tst.w   R12                     ; Exit LPMx?
            jz      RX_Comp2
#ifdef USE_C_CONTEXT_SAVE
            bic.w   #LPM4, 8(SP)            ; Exit LPMx
RX_Comp2    pop.w   R15                     ; Full context restore
            pop.w   R14
            pop.w   R13
#else
            bic.w   #LPM4, 2(SP)            ; Exit LPMx
RX_Comp2
#endif
            pop.w   R12
RX_Next     reti

;------------------------------------------------------------------------------
            COMMON  INTVEC                  ; Interrupt Vectors
;------------------------------------------------------------------------------
            ORG     TIMERA1_VECTOR          ; Timer_A1 Vector
            DW      TA1_ISR                 ;

            END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -