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.

[参考译文] CCS/MSP-EXP430FR5994:故障计时器A1 CCR1触发器ADC12转换使用DRIVERLIB帮助

Guru**** 2387830 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/637515/ccs-msp-exp430fr5994-trouble-making-timer-a1-ccr1-triger-adc12-convertion-using-driverlib-help

部件号:MSP-EXP430FR5994

工具/软件:Code Composer Studio

大家好,我需要一些代码方面的帮助,我已经配置了ADC和TA1模块,以便ADC转换由TA1触发,但这似乎是错误的,TA1中断工作正常,但ADC未被触发。

对于ADC:

//Configuro引脚para ADC
GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO端口P1,GPIO PIN2,GPIO三元模块功能);
//参数配置
ADC12_B_initParam initParam ={0};
initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_4;//dediso POR计时器A1 CCR1
initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
initParam.clockSourcePrediver= ADC12_B_CLOCKPREDIER__1;
initParam.internalChannelMap = ADC12_B_NOINTCH;
ADC12_B_INIT (ADC12_B_BASE,&initParam);
//Activo ADC_12 para iniciizacion
ADC12_B_ENABLE (ADC12_B_BASE);
ADC12_B_setupSamplingTimer (ADC12_B_BASE,ADC12_B_CYCLEHOLD_16_CYCLES,ADC12_B_CYCLEHOLD_4_CYCLES,ADC12_B_MULTIPLESAMPLESDISABLE);
//配置ADCMEM
ADC12_B_configureMemoryParam配置MemoryParam ={0};
configureMemoryParam.memoryBufferControlIndex = ADC12_B_memory_0;
configureMemoryParam.inputSourceSelect = ADC12_B_Input_A2;
配置内存Param.refVoltageSourceSelect = ADC12_B_VREFPOS_AVCC_VREFNEG_VSS;
configureMemoryParam.endOfSequence = ADC12_B_NOTENDOFENCE;
配置内存Param.windowComparatorSelect = ADC12_B_window_Comparer_disable;
配置内存Param.DifferalModeSelect = ADC12_B_Different_mode_disable;
ADC12_B_configureMemory (ADC12_B_BASE,&configureMemoryParam);
ADC12_B_clearInterrupt (ADC12_B_B_BASE,0,ADC12_B_IFG0);
//Interrupcion para ADC
//ADC12_B_enableInterrupe(ADC12_B_base, ADC12_B_IE0,0);//Configuro
DMA para ADC
dma_initParam参数={0};
param.channelSelect = dma_channel_0;
para.transferModeSelect = dma_transfer_single;
Param.transferSize =10;
PARAM.TriggerSourceSelect = DMA_TRIGGERSOURCE_26;//ADC
Param.transferUnitSelect = DMA_Size_SRCWORD_DSTWORD;
Param.triggerTypeSelect = DMA_TRIGG_RISINGEDGE;
dma_init(&param);
MemADC=ADC12_B_getMemoryAddressForDMA (ADC12_B_base, ADC12_B_memory_0);
DMA_setSrcAddress(DMA_CHANGE_0,MemADC, DMA_Direction_unchange);
dma_setDstAddress(dma_channel_0,&ADCval,dma_direction increment);
dma_enableTransfers(DMA_channel_0); 

用于计时器A1和CCR1

//Configuro timer A0 para que DISPARE MUESTREO
timer_a_initContinuousModeParam initContParam ={0};
initContParam.clockSource = timer_a_CLOCKSOURCE_ACLK;//CLK=32.745Khz
initContParam.clockSourceDivider = timer_a_CLOCKSOURCE_diver_1;
initContParam.timerInterruptEnable_TAIE = timer_a_TAIE_interrupt_disable;
initContParam.timerClear = timer_a_do清除;
initContParam.startTimer = false;
timer_a_initContinuousMode(timer A1_base,&initContParam);
//初始比较模式
Timer_a_clearCaptureCompareInterrupt (timer_a1_base,timer_a_CAPTURECOMPare_register_1);

timer_a_initCompareModeParam initCompParam ={0};
initCompParam.compareRegister = TIME_A_CAPTURECOMPARE_REGISTER_1;
initCompParam.compareInterruptEnable = timer_a_CAPTURECOMPare_interrupt_enable;
initCompParam.compareOutputMode = TIME_A_OUTPUTMODE_OUTBITVALUE;
initCompParam.compareValue = 64;
timer_a_initCompareMode(timer A1_base,&initCompParam);
timer_a_startCounter( timer_a1_base, timer_a_continuous_mode);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    您的问题可能与行15和16或计时器初始化代码有关。 首先,您使用的是定时器ISR,因此在ADC看到中断标志之前,您可以先清除中断标志,这将解释为什么ADC没有被触发。 第二,在第16行中,您将比较输出模式设置为TIME_A_OUTPUTMODE_OUTBITVALUE。 应将其设置为其它值,例如切换输出值,以触发ADC。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    您的问题是否已解决? 如果是,请将其标记为"已回答"。 如果没有响应,此线程将很快关闭。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,很抱歉耽误您的时间,问题没有解决,我尝试为CCR0充电,值为64,CCR1充电,使用设置重置模式并禁用TA中断,但它不能正常喷射。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    您不一定要禁用TA中断。 这取决于您使用ISR的方式。 您只想确保在等待另一个模块查找要设置的中断标志时不清除该标志。 如果您在此处包括ISR,我可以看到您的中断处理逻辑是否存在任何问题。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,我对延迟表示抱歉,我不使用TA ISR,我只是使用它来确保TA正常工作,我使用ADC的DMA,因此,当采集100个样本时,应该会发生中断,只需进一步说明, TA只会触发ADC,我不会将其用于其他任何事情。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    我看不到有什么地方你在使用定时器作为ADC的触发器。 您的DMA配置代码未执行此操作。 如果您已经获得了生成中断的计时器,那么为什么不使用ISR来启用ADC (并在启用之前禁用它)?

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,感谢您的快速响应。 是的,我将CCR1溢出定义为ADC的触发器,您可以在 ADC代码的第5行看到这一点,我尝试使用TA1的ISR来触发ADC,它工作正常, 但我不想使用ISR来触发ADC,因为我可以使用CCR1溢出

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试在ADC设置后插入此参数:
    > ADC12CTL0 |= ADC12ENC;//启用(注:锁定大多数ADC12CTLx字段)

    通过我所拥有的ADC12_b.c的源代码(我想是2.70 .01.01),我还不能通过driverlib来了解如何做到这一点。 但这应该能让你继续前进。

    未经请求:我怀疑您使用CONSEQ=2比CONSEQ=0更好,因为您不必每次都摆动ADC12ENC (另请参见SLAU367N图34-10与图34-8)。 我也不确定你应该如何设置(使用driverlib),但你可以在我上面建议的行之前插入此行:

    > ADC12CTL1 || ADC12CONSEQ_2;//每个触发器重复一次单通道(MSC=0)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我实际上是这样做的,在进行配置之前禁用ADC,并在完成配置之后使用命令ADC12_B_ENable(ADC12_B_base)启用它;

    我正在执行此操作(ADC配置,而不是DMA或TA1的使用) ,就像资源管理器中驱动程序库的示例一样。

    一切正常,但问题在于TA1的触发

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >一切正常,但问题在于TA1的触发

    您是否进行了我建议的更改? 当我进行该更改时,TA1触发了罚款(一次)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我看来,可能的用途是调用ADC12_B_startConversion(),它同时设置CONSEQ和ENC (根据上面的)。

    它还设置了ADC12SC,但可能(? 我从未尝试过)如果SHS !=0则SC被忽略。

    我仍然怀疑您想要CONSEQ=2。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    此问题是否已解决? 如果是,请将其标记为"已回答"。

    此致,
    Nathan