您好,目前我在使用CC2640R2F读取传感器数据。传感器数据由于没有起始位,这导致我只能通过两个上升沿之间的脉冲间隔来判断数据是否为同一包数据。但是由于要使用低功耗设计,这就导致我无法使用定时器来实现这个功能。目前我的方案是使用RTC来进行计时,从而能够正确读取传感器的数据。我在使用过程中遇到如下问题:
将断点打在if(ClkNum >= 28){}代码里面的ClkNum = 0位置,程序是进不去的,一直进if(edgeTimingCurrectValue > 0x1000){}这个函数。进一步调试,将断点打在if(edgeTimingCurrectValue > 0x1000)处,edgeTimingCurrectValue的值很小,但是如果将断点打在if(edgeTimingCurrectValue > 0x1000)()函数里面的 ClkNum = 0处,edgeTimingCurrectValue值又会很大。请问是怎么回事?下面是中断处理函数的部分代码,具体整个文件的配置代码和传感器协议见文件
//GPIO�궨�� #define DATA_GPIO IOID_26 #define CLK_GPIO IOID_27 //GPIO���ù��� PIN_Config GPIOConfig[] = { DATA_GPIO | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLDOWN, CLK_GPIO | PIN_GPIO_OUTPUT_DIS| PIN_INPUT_EN | PIN_PULLUP, PIN_TERMINATE }; //�������� static PIN_State GPIOPinState; static PIN_Handle hGPIOPinsHandle; static u8 ClkNum = 0; //CLK�жϼ����� //�ڲ����ú��� static void CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId); //------------------------------------------------------------------------------ //���� ���� void GPIO_Init(void) //���� ���� λ�Ƽ�GPIO��RTCʱ�ӳ�ʼ�� //����ڲ����� �� //�����ز����� �� //��˵ ���� �� //------------------------------------------------------------------------------ void GPIO_Init(void) { BleSDKManagerInfo_t err; // ״̬���� err = DriverIOOpen(&hGPIOPinsHandle,&GPIOPinState,(const PIN_Config *)GPIOConfig); //����IO���� if(err != MANAGER_INFO_REQUEST_IO_SUCCESS){ //һ��IO��ɹ� �����������û��IO return; } err = DriverIORegisterIntCallBack(&hGPIOPinsHandle,CLK_GPIOIsrCallback); //ע��һ��io�жϻص����� if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){ return; } err = DriverIOSetConfig(&hGPIOPinsHandle,PIN_BM_IRQ,CLK_GPIO | PIN_IRQ_POSEDGE);//����CLK_GPIO���жϹ��� if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){ return; } #ifdef POWER_SAVING //���ϵͳ������ʡ�繦�� ����ҪΪ��io���û��ѹ���(��ʹ��߱���˯��״̬ͨ���жϻ���mcu�Ĺ���) err = DriverIOSetConfig(&hGPIOPinsHandle,PINCC26XX_BM_WAKEUP,CLK_GPIO | PINCC26XX_WAKEUP_NEGEDGE);//����CLK_GPIO���жϻ��ѹ��� if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){ return; } #endif AONRTCChannelDisable(AON_RTC_CH1); AONRTCModeCh1Set(AON_RTC_MODE_CH1_CAPTURE); AONEventRtcSet(AON_EVENT_IO); AONRTCChannelEnable(AON_RTC_CH1); } //------------------------------------------------------------------------------ //���� ���� CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId) //���� ���� io�жϻص����� //����ڲ����� �� //�����ز����� �� //��˵ ���� �� //------------------------------------------------------------------------------ static void CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId) { static u32 uiDataTemp = 0; static u32 CLKedgeTimingCurrectValue[2] = {0}; u32 edgeTimingCurrectValue = 0; g_uiShutDownClk = 0; //shutdownģʽ��ʱ������ if(ClkNum == 0){ // CLKedgeTimingCurrectValue[0] = AONRTCCurrentCompareValueGet(); CLKedgeTimingCurrectValue[0] = AONRTCCaptureValueCh1Get(); AONRTCEventClear(AON_RTC_CH1); } else{ // CLKedgeTimingCurrectValue[1] = AONRTCCurrentCompareValueGet(); CLKedgeTimingCurrectValue[1] = AONRTCCaptureValueCh1Get(); AONRTCEventClear(AON_RTC_CH1); if(CLKedgeTimingCurrectValue[1] >= CLKedgeTimingCurrectValue[0]) edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] - CLKedgeTimingCurrectValue[0]; else edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] + (0xFFFFFFFF - CLKedgeTimingCurrectValue[0]); CLKedgeTimingCurrectValue[0] = CLKedgeTimingCurrectValue[1]; if(edgeTimingCurrectValue > 328){ //����5ms��5ms *(1000 / 65535) ClkNum = 0; uiDataTemp = 0; } } if(1 == DriverIOGetInputValue(DATA_GPIO)) //��ȡIO��ƽ uiDataTemp = uiDataTemp + (1 << ClkNum); ClkNum += 1; if(ClkNum >= 28){ //���ݶ�ȡ��� ClkNum = 0; g_uiData = uiDataTemp; g_cDataFinsh = 1; } }
CLKedgeTimingCurrCLKedgeTimingCurrectValue[1] = AONRTCCaptureValueCh1Get();
AONRTCEventClear(AON_RTC_CH1);
if(CLKedgeTimingCurrectValue[1] >= CLKedgeTimingCurrectValue[0])
edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] - CLKedgeTimingCurrectValue[0];
else
edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] +(0xFFFFFFFF - CLKedgeTimingCurrectValue[0]);
if(edgeTimingCurrectValue > 0x1000){ //大约62ms
ClkNum = 0;
uiDataTemp = 0;
}
CLKedgeTimingCurrectValue[0] - CLKedgeTimingCurrectValue[1];
ClkNum += 1;
if(ClkNum >= 28){
ClkNum = 0;
.....
}