首页|嵌入式系统|显示技术|模拟IC/电源|元件与制造|其他IC/制程|消费类电子|无线/通信|汽车电子|工业控制|医疗电子|测试测量
首页 > 分享下载 > 无线/通信 > MSP430F5438ucosII系统,个人修改过的,TICK采用timerB0

MSP430F5438ucosII系统,个人修改过的,TICK采用timerB0

资料介绍

原作者:34071417

自己按照自己的习惯修改的,原有工程使用看门狗定时器作为tick,
自己改为Timer0――B0,留出看门狗用。
定时器定时采用ACLK,外部32Khz晶振,约5ms中断定时,采用比较定时实现。这样B1就可以留出来共其他模块使用,但是时钟源还是XT1.
这样也利于低功耗应用。

tick操作
;********************************************************************************************************
; TICK ISR
;
; Description: This ISR handles tick interrupts. This ISR uses the Watchdog timer as the tick source.
;
; Notes : 1) The following C pseudo-code describes the operations being performed in the code below.
;
; Save all the CPU registers
; if (OSIntNesting == 0) {
; OSTCBCur->OSTCBStkPtr = SP;
; SP = OSISRStkPtr; /* Use the ISR stack from now on */
; }
; OSIntNesting++;
; Enable interrupt nesting; /* Allow nesting of interrupts (if needed) */
; Clear the interrupt source;
; OSTimeTick(); /* Call uC/OS-II's tick handler */
; DISABLE general interrupts; /* Must DI before calling OSIntExit() */
; OSIntExit();
; if (OSIntNesting == 0) {
; SP = OSTCBHighRdy->OSTCBStkPtr; /* Restore the current task's stack */
; }
; Restore the CPU registers
; Return from interrupt.
;
; 2) ALL ISRs should be written like this!
;
; 3) You MUST disable general interrupts BEFORE you call OSIntExit() because an interrupt
; COULD occur just as OSIntExit() returns and thus, the new ISR would save the SP of
; the ISR stack and NOT the SP of the task stack. This of course will most likely cause
; the code to crash. By disabling interrupts BEFORE OSIntExit(), interrupts would be
; disabled when OSIntExit() would return. This assumes that you are using OS_CRITICAL_METHOD
; #3 (which is the prefered method).
;
; 4) If you DON'T use a separate ISR stack then you don't need to disable general interrupts
; just before calling OSIntExit(). The pseudo-code for an ISR would thus look like this:
;
; Save all the CPU registers
; if (OSIntNesting == 0) {
; OSTCBCur->OSTCBStkPtr = SP;
; }
; OSIntNesting++;
; Enable interrupt nesting; /* Allow nesting of interrupts (if needed) */
; Clear the interrupt source;
; OSTimeTick(); /* Call uC/OS-II's tick handler */
; OSIntExit();
; Restore the CPU registers
; Return from interrupt.
;********************************************************************************************************

TIMER0_B0_ISR;WDT_ISR ; wd timer ISR
PUSHM.A #12, R15
add.w #164,TBCCR0 ; Add offset to CCR0
BIC.W #CCIE, TBCCTL0 ; disable wd timer interrupt

CMP.B #0, OSIntNesting ; if (OSIntNesting == 0)
JNE TIMER0_B0_ISR_1

MOVX.A OSTCBCur, R13 ; save task stack
MOVX.A SP, 0(R13)

MOVX.A OSISRStkPtr, SP ; load interrupt stack

TIMER0_B0_ISR_1
INC.B OSIntNesting ; increase OSIntNesting

BIS.W #CCIE, TBCCTL0 ; enable wd timer interrupt

EINT ; enable general interrupt to allow for interrupt nesting

CALLA #OSTimeTick ; call ticks routine

DINT ; IMPORTANT: disable general interrupt BEFORE calling OSIntExit()

CALLA #OSIntExit

CMP.B #0, OSIntNesting ; if (OSIntNesting == 0)
JNE TIMER0_B0_ISR_2

MOVX.A OSTCBHighRdy, R13 ; restore task stack SP
MOVX.A @R13, SP

TIMER0_B0_ISR_2
POPM.A #12, R15

RETI ; return from interrupt

;********************************************************************************************************
; WD TIMER INTERRUPT VECTOR ENTRY
;
; Interrupt vectors
;********************************************************************************************************
COMMON INTVEC

; ORG WDT_VECTOR
;WDT_VEC DW WDT_ISR ; interrupt vector. Watchdog/Timer, Timer mode
ORG TIMER0_B0_VECTOR
DW TIMER0_B0_ISR ; interrupt vector. Watchdog/Timer, Timer mode

END

标签:TI资源MSP430
MSP430F5438ucosII系统,个人修改过的,TICK采用timerB0
本地下载

评论