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