ARM时钟管理

一: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();
}

转载于:https://www.cnblogs.com/cjjnjust/archive/2010/03/21/1691245.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值