This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2640R2F无法使用RTC和GPIO中断来进行输入捕获

Other Parts Discussed in Thread: CC2640R2F, CC2650

您好,目前我在使用CC2640R2F读取传感器数据。传感器数据由于没有起始位,这导致我只能通过两个上升沿之间的脉冲间隔来判断数据是否为同一包数据。但是由于要使用低功耗设计,这就导致我无法使用定时器来实现这个功能。目前我的方案是使用RTC来进行计时,从而能够正确读取传感器的数据。我在使用过程中遇到如下问题:

将断点打在if(ClkNum >= 28){}代码里面的ClkNum = 0位置,程序是进不去的,一直进if(edgeTimingCurrectValue > 0x1000){}这个函数。进一步调试,将断点打在if(edgeTimingCurrectValue > 0x1000)处,edgeTimingCurrectValue的值很小,但是如果将断点打在if(edgeTimingCurrectValue > 0x1000)()函数里面的 ClkNum = 0处,edgeTimingCurrectValue值又会很大。请问是怎么回事?下面是中断处理函数的部分代码,具体整个文件的配置代码和传感器协议见文件

0525.gpio.c
//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;
    }
}
8357.量表通讯口协议.doc

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;

    .....

}