如果 BLE 射频接口未睡眠、则不会出现例外情况。 只需在 BLE RF 中设置睡眠、然后使用15.4协议栈将 CPU 置于"Main_excHandler"。中
SDK 版本为4.40.4.04。
BLE 射频代码:
void ble_nc_adv_tx(void)
{
static uint16_t ble_tx_seq = 0;
static RF_Object rfObject;
static RF_Handle rfHandle = 0;
RF_InfoVal val;
uint8_t chan = 1;
RF_Params rfParams;
RF_Params_init(&rfParams);
ble_adv_aoa_t *p_ble_aoa = (ble_adv_aoa_t *)ble_aoa_buf;
p_ble_aoa->user_header = 0x9527;
p_ble_aoa->tag_id = product_sn.card_id;
p_ble_aoa->seq = ble_tx_seq++;
p_ble_aoa->ble_period_10ms = ble_period_ms / 10;
p_ble_aoa->activity_flag = 0;
// 求和
uint8_t sum = 0;
for (uint8_t i = 0; i < sizeof(ble_adv_aoa_t) - 20 - 1; i++)
{
sum += ble_aoa_buf[i];
}
p_ble_aoa->sum_check = sum;
memcpy(p_ble_aoa->tone, tone_dat[chan], 20);
/* Request access to the radio */
if(rfHandle == 0)
{
//rfParams.nInactivityTimeout = 100;
rfHandle = RF_open(&rfObject, &RF_prop_bt5le1madvnc_0, (RF_RadioSetup*)&RF_cmdBle5RadioSetup_bt5le1madvnc_0, &rfParams);
RF_ScheduleCmdParams_init(&schParams_ble);
//schParams_ble.priority = RF_PriorityNormal;
schParams_ble.endTime = 0;
schParams_ble.allowDelay = RF_AllowDelayAny;
}
/* Set the frequency */
RF_cmdFs_bt5le1madvnc_0.frequency = RFfrequencyTable_ble[chan].frequency;
RF_cmdFs_bt5le1madvnc_0.fractFreq = RFfrequencyTable_ble[chan].fractFreq;
RF_runCmd(rfHandle, (RF_Op*)&RF_cmdFs_bt5le1madvnc_0, RF_PriorityNormal, NULL, 0);
//RF_scheduleCmd(rfHandle, (RF_Op*)&RF_cmdFs_bt5le1madvnc_0, &schParams_ble, NULL,0);
RF_getInfo(rfHandle,RF_GET_RADIO_STATE,&val);
debug_printf("++++RF_GET_RADIO_STATE:%d\r\n",val.bRadioState);
RF_cmdBleAdvNc_bt5le1madvnc_0.pParams->advLen = sizeof(ble_adv_aoa_t);
RF_cmdBleAdvNc_bt5le1madvnc_0.pParams->pAdvData = ble_aoa_buf;
RF_cmdBleAdvNc_bt5le1madvnc_0.startTrigger.triggerType = 0;
RF_cmdBleAdvNc_bt5le1madvnc_0.startTrigger.pastTrig = 1;
RF_cmdBleAdvNc_bt5le1madvnc_0.channel = 0xff;
RF_cmdBleAdvNc_bt5le1madvnc_0.whitening.bOverride = 1;
RF_cmdBleAdvNc_bt5le1madvnc_0.whitening.init = RFfrequencyTable_ble[chan].whitening;
RF_cmdBleAdvNc_bt5le1madvnc_0.startTime = 0;
RF_runCmd(rfHandle, (RF_Op*)&RF_cmdBleAdvNc_bt5le1madvnc_0, RF_PriorityNormal, NULL, 0);
//RF_scheduleCmd(rfHandle, (RF_Op*)&RF_cmdBleAdvNc_bt5le1madvnc_0, &schParams_ble, NULL,0);
// RF_close(rfHandle);
uint8_t abortGraceful = 0;
RF_flushCmd(rfHandle, RF_CMDHANDLE_FLUSH_ALL, abortGraceful);
RF_yield(rfHandle);
RF_getInfo(rfHandle,RF_GET_RADIO_STATE,&val);
debug_printf("++++RF_GET_RADIO_STATE:%d\r\n",val.bRadioState);
}