v3s的timer中断

一、简介:

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

三、后记

由于本篇程序中使用了大量自定义结构体,下一篇将提供其相应制作流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值