TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2640R2F

您好,我这边在调试CC2564R2F的时候遇到一个问题,主要表现在MCU运行的代码似乎会周期性地被底层的运行的代码抢占掉300ms的运行时间,导致我们的代码暂定运行。具体的反馈如下:

(1)目前关闭蓝牙,关闭power saving,硬件定时器定时20us中断一次,中断函数翻转一次io口电平,一段时间后,芯片会有300多毫秒的假死现象。

(2)请问如何在打开power saving的情况下,依然能使用硬件定时器定时中断,来翻转io口电平?

详细过程如下:

 

使用cc2640r2f硬件定时器的问题

(1)

关闭power saving,关闭蓝牙广播。使用cc2640r2f的硬件定时器设置定时中断,定时中断函数对io口电平进行翻转,电平翻转的最小单位为20us。一组数据进行30次左右的电平翻转。大概每10ms进行发送一组数据。大概类似于下面

 

最小数据单位20us左右,10ms发送一次数据

 

正常情况下每隔8.8ms就会有一组数据,但是程序运行一段时间之后,每次通信中间间隔时间会变成349.57毫秒左右。情况如下

 

 

目前已经试过添加如下两个类似于cc2541的函数

HCI_EXT_HaltDuringRfCmd(HCI_EXT_HALT_DURING_RF_DISABLE);

HCI_EXT_ClkDivOnHaltCmd(HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT);

依然出现这个现象,请问一下怎么样才可以防止出现这个问题。并且开启蓝牙广播,或者将蓝牙广播广播间隔增加,会导致出现这个问题的频率和速度增加。

 

 

使用以下配置初始化io口

static PIN_Config gfx_50s_send_out_config[] =

{

IOID_21 | PIN_GPIO_OUTPUT_EN | PIN_INPUT_DIS | PIN_DRVSTR_MAX | PIN_PUSHPULL,

PIN_TERMINATE

};  将io配置为推挽输出。

 

使用以下函数初始化硬件定时器

void gfx_50s_send_out_time_init(void) //该函数每10毫秒被调用一次进行初始化

{   

    CAPTimerCC26XX_Object        *object  = gfx_50s_Capture_Handle->object;

    uint32_t key = HwiP_disable();

    if (object->isOpen)

    {

        HwiP_restore(key);

                return;

    }

    object->isOpen = 1;

    HwiP_restore(key);

 

   

    GPTimerCC26XX_Params timerParams;

    GPTimerCC26XX_Params_init(&timerParams);

    timerParams.width          = GPT_CONFIG_16BIT;

    timerParams.mode           = GPT_MODE_PERIODIC_UP;

    timerParams.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;

    GPTimerCC26XX_Handle hTimer = GPTimerCC26XX_open(1, &timerParams);

object->hTimer = hTimer;

 

gfx_50s_b2c_st.data_point = 0;

gfx_50s_c2b_st.data_point = 0;

GPTimerCC26XX_setLoadValue(object->hTimer, 1000);

GPTimerCC26XX_registerInterrupt(hTimer, gfx_50s_send_out_data,  GPT_INT_TIMEOUT);

GPTimerCC26XX_start(object->hTimer);

}

 

 

硬件定时器的中断函数为

void gfx_50s_send_out_data(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)

{

static uint8_t b = 0;

 /* Clear isOpen flag */

if(gfx_50s_b2c_st.data_point < 30 ) //每组数据发送30个翻转电平

{

if(b)

{

gfx_50s_send_out_one(gfx_50s_send_out_hPins, gfx_50s_send_out_io);    //发送高电平

b = 0;

else

{

gfx_50s_send_out_zero(gfx_50s_send_out_hPins, gfx_50s_send_out_io); //发送低电平

b = 1;

}

GPTimerCC26XX_setLoadValue(handle, 48*(12+gfx_50s_b2c_comd_ttl[gfx_50s_comd_st.comd_num][gfx_50s_b2c_st.data_point++])); /设置下一次翻转电平的时间

}

else

{

gfx_50s_send_out_time_stop();

gfx_50s_send_out_one(gfx_50s_send_out_hPins, gfx_50s_send_out_io);

b = 0;

gfx_50s_b2c_st.data_point = 0;

}

}

 

 

(2)打开power saving之后,使用硬件定时器发送数据,会发现无法发送数据的现象,原因可能是低功耗模式下,定时器没有工作,cc2541出现过这个问题,但是可以强制使用寄存器配置退出低功耗模式,cc2640r2f貌似控制不了寄存器。

请问如何在打开power saving之后,依然能使用硬件定时器中断,并且最小的定时器周期打到20us左右。

Viki Shi:

已在e2echina.ti.com/…/505244 中回复

赞(0)
未经允许不得转载:TI中文支持网 » CC2640R2F
分享到: 更多 (0)