一:CPU时钟、总线时钟、外部时钟。

根据OM[3:2]设置时钟来源,外部晶振还是外部时钟。

根据rMPLLCON计算FCLK HCLK PCLK。

二:PWM时钟

在rCLKCON设置传递时钟给PWM生成CLK。

设置prescaler和divider,

设置TCNTBi,TCMPBi。注意这里设置TCMPi有点意思。比如你想1分钟1000个节拍,那么可以设置其为PCLK/prescaler/divider/1000也就是想设置多少个节拍就除于多少就可以。

设置rTCON模式,最后开起timer。

三:中断编写

1.设置中断向量:

ENTRY

b    ColdReset
b    Enter_UNDEF    ;UndefinedInstruction
b    Enter_SWI    ;syscall_handler or SWI
b    Enter_PABORT    ;PrefetchAbort
b    Enter_DABORT    ;DataAbort
b    .        ;ReservedHandler
b    IRQ_Handler    ;IRQHandler
b    Enter_FIQ    ;FIQHandler

;deal with IRQ interrupt
    EXPORT   IRQ_Handler
IRQ_Handler
    IMPORT    ISR_IrqHandler
    STMFD    sp!, {r0-r12, lr}
    BL   ISR_IrqHandler
    LDMFD    sp!, {r0-r12, lr}
    SUBS    pc, lr,    #4

 

//下面的程序就是为IRQ寻找起中断服务函数。

void ISR_IrqHandler(void) 
{  
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
    #endif
    unsigned int irq=GetISROffsetClr();    //得到中断向量的偏移地址

    irq=fixup_irq(irq);

    if(irq>=NR_IRQS)
        return;
    if(InterruptFunc[irq].InterruptHandlers==NULL){
        InterruptFunc[irq].ack_irq(irq);    //clear pending
        return;
    }

    OS_ENTER_CRITICAL();
    OSIntEnter();
     // Call interrupt service routine
    InterruptFunc[irq].InterruptHandlers(irq, InterruptFunc[irq].data);
    InterruptFunc[irq].ack_irq(irq);    //clear pending
    OSIntExit();
    OS_EXIT_CRITICAL();
}

2.添加中断服务函数:

SetISR_Interrupt(IRQ_TIMER4, TimerTickHandle, NULL);

void TimerTickHandle(int vector, void* data)
{
    OSTimeTick();
}

posted on 2010-03-21 23:04  灰太狼大王  阅读(1780)  评论(0编辑  收藏  举报