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.
您好,我尝试使用RTC+GPIO中断来实现数据采集,您看下我下面使用的rtc时钟对吗?另外就是我想问一下AONRTCCaptureValueCh1Get()函数单位是秒吗?低16位代表的是毫秒(即1s均分为655535)?
//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_NEGEDGE);//����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;
}
}
您好,我在使用过程中发现:将断点打在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_NEGEDGE);//����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;
.....
}