您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 【已解决】[求助]关于BF51x的core timer使用... 
本帖共有852个阅读者
发表帖子 发表投票 回复主题
【已解决】[求助]关于BF51x的core timer使用问题
webom2008(论坛新手)
webom2008
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:287
积分:29
注册时间:2013/9/9
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
【已解决】[求助]关于BF51x的core timer使用问题
如何使用core timer产生system tick呢?我只看到操作手册里面有汇编示例,请问有没有C语言的?
例如:CCLK=300M,通过core timer产生1ms的system tick,如何实现?

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/9/25 10:32:55
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/9/25 17:06:24
webom2008(论坛新手)
webom2008
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:287
积分:29
注册时间:2013/9/9
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
/*******************************************************************
*   Function:    SysTick_TimeCfg
*   Description: This function configure the core timer cycle (N * 10us)=10us~2550us
*   Note:   N10us must larger than 1
*******************************************************************/
static void SysTick_TimeCfg(const unsigned char N10us)
{
#if !defined (_USED_SSL_CORETIMER_)
    unsigned long ulPeriod = 0;

    ulPeriod = getCodeCLK() / 100000;

    /* active state, auto reload, generate interrupt */
    *pTCNTL = TMPWR | TAUTORLD | TINT;
    *pTPERIOD = ulPeriod;
    if (N10us < 1)
    {
        *pTSCALE = 0;   //default, system tick = 10us
    }
    else
    {
        *pTSCALE = N10us-1;//TSCALE = 0~255
        g_u8TickN10us = N10us;
    }

    /* TCOUNT decrements once every TSCALE + 1 clock cycles.
     * When the value of TCOUNT reaches 0, an interrupt is generated and the
     * TINT bit of the TCNTL register is set.
     * Values written to the TPERIOD register are automatically copied to the TCOUNT register.
     */
    *pTCOUNT = ulPeriod;
#else
    ADI_TMR_RESULT Result;
    unsigned long ulPeriod = getCodeCLK() / 100000;
    u32 count, period, scale;
    
    Result = adi_tmr_Open(ADI_TMR_CORE_TIMER);
    u32InitStatus += Result;
    if (ADI_TMR_RESULT_SUCCESS != Result)
        AIO_printf("\r\n[CT] Error >>1");
    /* active state, auto reload, generate interrupt */
    *pTCNTL = TMPWR | TAUTORLD | TINT;
    period = ulPeriod;
    if (N10us < 1)
    {
        scale = 0;   //default, system tick = 10us
    }
    else
    {
        scale = N10us-1;//TSCALE = 0~255
        g_u8TickN10us = N10us;
    }

    /* TCOUNT decrements once every TSCALE + 1 clock cycles.
     * When the value of TCOUNT reaches 0, an interrupt is generated and the
     * TINT bit of the TCNTL register is set.
     * Values written to the TPERIOD register are automatically copied to the TCOUNT register.
     */
    count = ulPeriod;

    ADI_TMR_CORE_CMD_VALUE_PAIR CoreTable [] = {
          { ADI_TMR_CORE_CMD_SET_AUTO_RELOAD,  (void *)TRUE },
          { ADI_TMR_CORE_CMD_SET_COUNT,        (void *)&count },
          { ADI_TMR_CORE_CMD_SET_PERIOD,       (void *)&period },
          { ADI_TMR_CORE_CMD_SET_SCALE,        (void *)&scale },
          { ADI_TMR_CORE_CMD_SET_ACTIVE_MODE,  (void *)TRUE },
          { ADI_TMR_CORE_CMD_RESET_INTERRUPT_OCCURRED, (void *)TRUE},
          { ADI_TMR_CORE_CMD_ENABLE_TIMER,     (void *)FALSE },
          { ADI_TMR_CORE_CMD_END,              NULL },
    };
    Result = adi_tmr_CoreControl(ADI_TMR_CORE_CMD_TABLE, CoreTable);
    
    u32InitStatus += Result;
    if (ADI_TMR_RESULT_SUCCESS != Result)
        AIO_printf("\r\n[CT] Error >>2");

#endif
}

void SysTick_Start(void)
{
#if !defined (_USED_SSL_CORETIMER_)
    /* enable the timer */
    *pTCNTL |= TMREN;
#else
    ADI_TMR_RESULT Result;

    Result = adi_tmr_CoreControl(ADI_TMR_CORE_CMD_ENABLE_TIMER, (void *)TRUE);

    u32InitStatus += Result;

    if (ADI_TMR_RESULT_SUCCESS != Result)
        AIO_printf("\r\n[CT] Error >>3");
    AIO_printf("\r\n[CT] S...%d",u32InitStatus);

#endif
}
void SysTick_Stop(void)
{
#if !defined (_USED_SSL_CORETIMER_)
    /* enable the timer */
    *pTCNTL &= (unsigned long)~TMREN;
#else
    adi_tmr_CoreControl(ADI_TMR_CORE_CMD_ENABLE_TIMER, (void *)FALSE);
#endif
}


/*******************************************************************
*   Function:    Init_Timer_Interrupts
*   Description: This function initialises the interrupts for core timer
*******************************************************************/
static void Init_Timer_Interrupts(void)
{
#if !defined (_USED_SSL_CORETIMER_)
    register_handler(ik_timer, CoreTimer_ISR);
#else
    ADI_TMR_RESULT Result;

    Result = adi_tmr_InstallCallback
      (ADI_TMR_CORE_TIMER, TRUE, (void *)0x22222222, NULL, CoreTimerCallback);

    u32InitStatus += Result;

    if (ADI_TMR_RESULT_SUCCESS != Result)
        AIO_printf("\r\n[CT] Error >>4");

#endif
}

void SysTick_Init(void)
{
    g_ulTickCount = 0;
    SysTick_TimeCfg(10);//system tick configure as 10*10us = 100us
    Init_Timer_Interrupts();
}


中断处理:

static void CoreTimerCallback(void *ClientHandle, u32 Event, void *pArg)
{
    // Event = ADI_TMR_EVENT_TIMER_EXPIRED
    if (ADI_TMR_CORE_TIMER != (u32)pArg)
    {
        AIO_printf("1");
        return;
    }
        AIO_printf("2");
    
    // do processing when core timer expires
    // ClientHandle = 0x22222222
    unsigned int n;
    
    //unsigned int uiTIMASK = cli();
    g_ulTickCount++;
    
    /* decrement each counter if it is non-zero */  
    for( n = 0; n < MAX_NUM_COUNTDOWN_TIMERS; n++ )
    {      
        if( 0 != sCountDownTimer[n].m_ulTimeoutCounter )      
        {          
            sCountDownTimer[n].m_ulTimeoutCounter--;
        }
    }
}


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/11/20 21:28:25
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159340 Call, 1 Queries, Processed in 0.015625 second(s),