您好:
我在重复信号通道模式下使用ADC12,ADC12SHSx为0,时钟源为SMCLK,为8MHz,ADC时钟分频器为1MHz。
我使用DMA传输ADC结果,低功耗模式是LPM3。
大多数时候MCU工作正常,但有时会停止。
在调试模式下,我发现ADC12停止转换具有ADC12SC Keep 1 (数据表显示ADC12SC自动重置),ADC12BUSY Keep 1,
DMA不传输任何数据。
有人能帮我解决这个问题吗? 非常感谢!
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.
您好:
我在重复信号通道模式下使用ADC12,ADC12SHSx为0,时钟源为SMCLK,为8MHz,ADC时钟分频器为1MHz。
我使用DMA传输ADC结果,低功耗模式是LPM3。
大多数时候MCU工作正常,但有时会停止。
在调试模式下,我发现ADC12停止转换具有ADC12SC Keep 1 (数据表显示ADC12SC自动重置),ADC12BUSY Keep 1,
DMA不传输任何数据。
有人能帮我解决这个问题吗? 非常感谢!
我正在使用手动触发模式,我已经看到了错误表,但我不认为它是ADC42勘误表,
因为每次ADC转换完成后 ,我都会重置ADC12ENC, 然后轮询ADC12BUSY直到它重置,之后我会禁用ADC12。
下次使用ADC时,我会重新启用ADC模块并重新启用转换。
ADC12_B_DisableConversions (ADC12_B_BASE,ADC12_B_COMPLETECONVERSION); While (ADC12_B_isBusy (ADC12_B_B_B_B_BASE) ){ vTaskDelay (1); } ADC12_B_DISABLE (ADC12_B_base);
您好,
有一个好消息,自从将低功耗模式从LPM3更改为LPM2后,该设备在2.5 天内工作正常。
但我不确定问题是否完全解决了,我会继续测试。
下面是我的初始化代码:
common_initADC (通道,refSource); common_initDMA (); ADC12_B_startConversion (ADC12_B_BASE,ADC12_B_START_AT_ADC12MEM0, ADC12_B_REALITED_SINGLECHANNEL);
函数common_initADC:
静态 void common_initADC (uint8_t channel,uint16_t refSource) {ADC12_B_initParam_initParam_b_configureParam参数 ; initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSURCE_SC;initParam.B_initParam_SourceSelect_ADC12_CD_CAMP12 initParam.internalChannelMap = ADC12 ADC12_B_CYCLEHOLD_384_CYC12_B_CYCLEHOLD_384_CYCLES , ADC12_B_MULTIPLESAMPLESENABLE); configParam.memoryBufferControlIndex = ADC12_B_MEMORY_0; configParam.inputSourceSelect =通道; configParam.refVoltageSourceSelect = refSource; configParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCER; configParam.windowComparatorSelect = ADC12_B_window_Comporer_disable; configParam.DifferalModeSelect = ADC12_B_Different_mode_disable; ADC12_B_configureMemory (ADC12_B_BASE,B_B_B_B_DISAB_DIBLE) &configParam); }
函数common_initDMA:
静态 void common_initDMA (void) { DMA_initParam dmaParam; dmaParam.channelSelect = DMA_channel_2; dmaParam.transferModeSelect = DMA_transfer_single; dmaParam.transferSize = oversample_buffer_size; dmaParam.trigerSourceSelect = DMA_IGGERSOURCE_26; // ADC12转换结束 dmaParam.transferUnitSelect = dma_size_SRCWORD_DSTWORD; dmaParam.triggerTypeSelect = dma_trigger_high; dma_init (&dmaParam); dma_setSrcAddress (dma_channel_2,ADC12_B_getMemoryAddressForDMA (ADC12_B_BASE, ADC12_B_MEMORY_0),DMA_DIRECT_NACHANGED); DMA_setDstAddress (DMA_CHANGE_2,(UINT32_t)&测量OversampleBuffer[0],DMA_DIRECT_INCREMENT); DMA_clearInterrupt (DMA_channel_2); DMA_enableInterrupt (DMA_channel_2); ADC12_B_getResults (ADC12_B_base, ADC12_B_memory_0); DMA_enableTransfers (DMA_channel_2); }
您好:
我只是发现我正在使用DCOCLK而不是HFXTCLK作为时钟源,但我应该使用HFXTCLK,这是一个错误。
尽管这是ADC停止的原因吗?
/* 时钟系统初始化 */ void Clock_init(void) { FRAMCtl_configureWaitStateControl (FRAMCTL_ACCESS_Time_Cycles_0); //将DCO频率设置为默认值8MHz CS_setDCOFreq (CS_DCORSEL_0,CS_DCOFSEL_6); cs_setExternalClockSource (3.2768万,8000000L); #IF 0 CS_TRENONHFXT (HFXTDRIVE_3); // 将MCLK配置为8 MHz,将SMCLK配置为8 MHz cs_initClockSignal (CS_MCLK,CS_HFXTCLK_SELECT,CS_Clock_diver_1); cs_initClockSignal (CS_SMCLK,CS_HFXTCLK_SELECT,CS_Clock_diver_1); #else //将MCLK配置为8 MHz,将SMCLK配置为8 MHz cs_initClockSignal (CS_MCLK,CS_DCOCLK_SELECT,CS_Clock_diver_1); cs_initClockSignal (CS_SMCLK,CS_DCOCLK_SELECT,CS_Clock_diver_1); #endif //初始化XT1晶体振荡器 cs_turnOnLFXT (CS_LFXT_DRIVE_3); cs_initClockSignal (CS_ACLK,CS_LFxTCLK_SELECT,CS_Clock_diver_1); }