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.
1:第一种实现方式,当某一个引脚电平大于某一个值时进入Event Handler A Code代码中,在进入时添加Timer 和ADC配合,采集一个50Hz的交流波形,一个周期,然后唤醒大核进行计算等别的操作,这样是可以实现的么?
2:第二种实现方式,当某一个引脚电平大于某一个值时进入Event Handler A Code代码时,立刻运行Execution Code里面的代码(Timer 和ADC配合,采集一个50Hz的交流波形,一个周期,然后唤醒大核进行计算等别的操作,),这样的功能应该通过
您好,
已经收到了您的案例,调查需要些时间,感谢您的耐心等待。
您好
根据您的说明,总的来说均可以实现,从系统优化等上,建议第一种,能避免直接在Event Handler中执行完整采集流程(如20ms持续采样)会严重阻塞其他中断,导致系统响应延迟或看门狗超时。
您好
方案一唤醒可以通过中断优化,以及确认DMA完成中断后通过Semaphore来实现。
方案二 在ISR中直接执行20ms采样会阻塞系统,导致其他中断无法响应,如果您坚持要用方案二的话吗, 确保Swi能及时抢占低优先级任务,但不会阻塞硬件中断。
综上关于代码没有相对应的,只有相关建议。
第二种我遇到的问题是,满足不了我得实时性,但是整个运行是没有问题的,但是不能自动来了即可就采集,请问有解决方案么
您好
感谢您的回复!
第一种方案我遇到的问题是,sensor唤醒主MCU异常,导致整个程序运行不正常;
如果无法直接唤醒,那么定义标识位,当数据采集完成后。检测标识位后叫用相关函数进行唤醒,而不是直接进入。这样既保证您的转换过程的稳定,同事通过之后对于标识位的处理避免被中断打断而无法唤醒,同时也需要做中断优先级优化来进一步避免这种事情的发生。
第二种我遇到的问题是,满足不了我得实时性,但是整个运行是没有问题的,但是不能自动来了即可就采集,
需要做中断优化使得唤醒和采集处于伪同步的状态来实现,但这这样如果出现中断冲突会导致功能处理有问题。
关于有没有具体的解决方案官方没有详细的支持资料,您可以尝试以上建议。
如果无法直接唤醒,那么定义标识位,当数据采集完成后。检测标识位后叫用相关函数进行唤醒,而不是直接进入。这样既保证您的转换过程的稳定,同事通过之后对于标识位的处理避免被中断打断而无法唤醒,同时也需要做中断优先级优化来进一步避免这种事情的发生。
您说的设置标志位唤醒没有完全理解,我目前使用的是COMPB中断来了之后程序会立刻运行Event Handler A Code 中的代码,将ADC周期采样放在这里面,然后使用fwGenAlertInterrupt();唤醒主MCU进行其他的操作,这样唤醒很不理想,您说的只用标志位唤醒,如果把标志位置位放在Event Handler A Code 代码中么?这样谁来识别唤醒主MCU呢?
根据您那边的建议,我尝试了各种方法,依然和我之前的问题是一样的,或许我对您那边的建议没有完全理解:
以下是传感器控制器(sensor)中Exent Handler A Code中代码
// The first execution (triggered by the timer) must initialize the trigger level
if (state.initDone == 0) {
compbGetOutput(state.currTriggerLevel);
gpioClearOutput(AUXIO_O_LED_POW);
state.initDone = 1;
}else{
state.SendFlag=0;
}
////ADC采集部分程序////
timer1Start(TIMER1_MODE_PERIODICAL, 1250,0);
// Select ADC input
// Enable the ADC (fixed reference, 2.7 us sample time, manual trigger)
adcEnableSync(ADC_REF_FIXED, ADC_SAMPLE_TIME_2P7_US, ADC_TRIGGER_MANUAL);
for(U16 n = 0; n < 32; n ++){
adcSelectGpioInput(AUXIO_A_ADC_PIN);
adcGenManualTrigger();
adcReadFifo(output.adcValue[n]);
// Disable the ADC
adcDisable();
timer1Wait();
}
timer1Stop();
// If the COMPB output is low...
if (state.currTriggerLevel == 0) {
//... Do something here ...
gpioClearOutput(AUXIO_O_LED_POW);
// Setup COMPB output high as next trigger
evhSetupCompbTrigger(0, 1, EVH_COMPB_TRIG_ON_MATCH);
state.currTriggerLevel = 1;
// Otherwise (the COMPB output is high)...
} else {
//... Do something here ...
gpioSetOutput(AUXIO_O_LED_POW);
// Setup COMPB output low as next trigger
evhSetupCompbTrigger(0, 0, EVH_COMPB_TRIG_ON_MATCH);
state.currTriggerLevel = 0;
}
output.adcFlag=1;
fwGenAlertInterrupt();
该程序的结果就是无法正常唤醒主MCU
您好
针对于您的设计问题,官方给您理论上可以尝试的可行方案,但是由于官方没有针对性的代码。所以无法针对于您提供的代码提供针对性修改和提供相关针对性的资料。