一、简介:
v3s的timer定时器有timer0、timer1、timer2,共三个。功能也很单一,有计数,有单周期与重复,有中断。
二、使用:
1、blockDelay:
int main(){
SystemInit();
init_uart();
delay();
a_leda_init();
a_ledb_init();
GicInit();
x_InitSystemTick();
while (1){
a_leda_on();
x_BlockDelayMs(500);
a_leda_off();
x_BlockDelayMs(500);
}
return 0;
}
void a_BlockDelay1Ms(){
TIMER->TMR_IRQ_EN_REG.bits.TMR0_IRQ_EN |= 1;
TIMER->TMR_IRQ_STA_REG.bits.TMR0_IRQ_PEND |= 1;
TIMER->TMR0_CTRL_REG.bits.TMR0_MODE = V3S_TIMER_MODE_SINGLE;
//20230921: casdfxx use V3S_TIMER_CLR_PRES_64 ocur runtime error
TIMER->TMR0_CTRL_REG.bits.TMR0_CLK_PRES = V3S_TIMER_CLR_PRES_64;
TIMER->TMR0_CTRL_REG.bits.TMR0_CLK_SRC = V3S_TIMER_CLK_SRC_OSC24M;
TIMER->TMR0_CTRL_REG.bits.TMR0_RELOAD = 1;
TIMER->TMR0_INTV_VALUE_REG.all = 375;
TIMER->TMR0_CTRL_REG.bits.TMR0_EN = 1;
while(TIMER->TMR_IRQ_STA_REG.bits.TMR0_IRQ_PEND == 0);
}
void x_BlockDelayMs(uint16_t ms){
uint32_t* status = (uint32_t*)0x1c20c04;
while(ms--){
a_BlockDelay1Ms();
//while(0 ==TIMER->TMR_IRQ_STA_REG.bits.TMR0_IRQ_PEND);
//TIMER->TMR_IRQ_STA_REG.bits.TMR0_IRQ_PEND = 1;
}
}
void a_InitSystemTick(){
TIMER->TMR_IRQ_EN_REG.bits.TMR1_IRQ_EN |= 1;
TIMER->TMR_IRQ_STA_REG.bits.TMR1_IRQ_PEND |= 1;
TIMER->TMR1_CTRL_REG.bits.TMR1_MODE = V3S_TIMER_MODE_CONTINUE;
TIMER->TMR1_CTRL_REG.bits.TMR1_CLK_SRC = V3S_TIMER_CLK_SRC_OSC24M;
TIMER->TMR1_CTRL_REG.bits.TMR1_CLK_PRES = V3S_TIMER_CLR_PRES_64;
TIMER->TMR1_CTRL_REG.bits.TMR1_RELOAD = 1;
TIMER->TMR1_INTV_VALUE_REG.all = 375 * 100; //5ms
GIC->D_IPRIORITYR.byte.d51 = PRIORITY_TIMER1;
GIC->D_ITARGETSR.byte.d51 = 0XFF;
GIC->D_ISENABLER.bit.d51 = 1;
TIMER->TMR1_CTRL_REG.bits.TMR1_EN = 1;
}
2、timer中断
timer.c
void x_RegisteTimer1Handler(timer1_handler_def func, void* param){
timer2_handler = func;
timer1_param = param;
}
void n_Timer1_Handler(){
static uint16_t flag = 1;
TIMER->TMR_IRQ_STA_REG.bits.TMR1_IRQ_PEND = 1;
if(NULL != timer1_handler){
// timer1_handler(timer1_param);
}
if(1==flag){
a_ledb_on();
flag = 0;
}else{
a_ledb_off();
flag = 1;
}
}
SystemInit.c
void GicInit(){
unsigned int u32t_Temp;
//GIC_Struce* gic = (GIC_Struce*)GIC_BASE;
GIC->D_CTLR.EnableGrp0 = 0;
GIC->C_CTLR.EnableGrp1 = 0;
for(u32t_Temp=0; u32t_Temp<8; u32t_Temp++){
GIC->D_ICPENDR.all[u32t_Temp] = 0xffffffff;
}
GIC->C_BPR = 2;
GIC->C_PMR = 0xff << 3;
//gic->D_IPRIORITYR.byte.d47 = 8;//5 << (2U);
//gic->D_ITARGETSR.byte.d47 = 0xff;//1 << (0U);
//gic->D_ISENABLER.bit.d47 = 1;
GIC->D_IPRIORITYR.byte.d51 = 10;
GIC->D_ITARGETSR.byte.d51 = 0XFF;
GIC->D_ISENABLER.bit.d51 = 1;
GIC->D_CTLR.EnableGrp0 = 1;
GIC->C_CTLR.EnableGrp1 = 1;
}
extern void n_Timer1_Handler();
void system_irqhandler(){
n_Timer1_Handler();
}
三、后记
由于本篇程序中使用了大量自定义结构体,下一篇将提供其相应制作流程。