您好,我这边在调试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 中回复
TI中文支持网


