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.
工具/软件:Code Composer Studio
我在 CCS 中将 MSP430F5359与 MSP-TS430PZ100C 开发工具搭配使用、并将 ADC12模块与 MSP 驱动程序库搭配使用。
我想 使用 TimerA 每4ms 触发一次 ADC12采样、并在该周期内抓取32个样本。
下面是我到目前为止所取得的成就、并希望获得一些指导来进一步推动这一目标。
#include "driverlib.h" #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 //---pilots void setupADC (void); //--globals volatile uint16_t data; //---main void main (void) { //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); // ADC 设置 setupADC(); while (1) { //开始单次转换,无重复或序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_SINGLECHANNEL); //等待中断标志生效 while (!(ADC12_A_getInterruptStatus (ADC12_A_base、ADC12IFG0))); //获取值 数据= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //清除中断标志并启动另一个转换 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IFG0); } } //--setup ADC void setupADC (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 MODOSC 5MHZ 数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init (ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_SC、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1); //将采样计时器设置为采样保持32个时钟周期 ADC12_A_setupSamplingTimer (ADC12_A_base、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= AVCC (内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex = ADC12_a_memory_0; param.inputSourceSelect = ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect = ADC12_A_VREFNEG_AVSS; param.endOfSequence = ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //打开 ADC12 ADC12_A_ENABLE (ADC12_A_base); //启用存储器缓冲器0中断 ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); }
您好、Pulin、
配置 SMCLK 的第一个起点是查看 用户指南 第5节统一时钟系统(UCS)。 请查看您将使用什么源以16MHz 的频率为 SMCLK 提供源。 在 MSP430驱动程序库中、我们提供了不同 的 UCS 配置示例、这些示例可能有助于您入门、尽管我们没有针对您所需设置的确切示例、因此需要进行一些自适应。
正确设置时钟系统后、您可以将 SMCLK 用作 Timer_A 时钟。
希望这能帮助您向前迈进。
此致、
Britta
您好、Britta、
我已经按照以下方式修改了我的代码、以实现 SMCLK 的16MHz。
这就是我得到的。 我希望您能在下面确认一切正常。
现在、我已经开始为计时器 A 进行编码、但需要有关其与 ADC12及其中断例程的用法的进一步指导。 希望您能提供提示。
#include "driverlib.h" //--#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主机时钟(CPU) REGLE 16MHz #define FLLREF_kHz /Reference FREQUENCY (void )(void MCLMCL12_kHz)/MCLCLUST_LMCLK);设置为32.nvoid (void /MCLMCLMCLK)/TIVACLK (void (void)/MCLMCL12_kHz);设置为32.LMCLK (void (void (void)/MCLMCLMCL12_kHz)/MCLK);t/ // ADC 数据 uint32_t MCLK = 0;//MCLK uint32_t smclk = 0;//SMCLK uint32_t aclk = 0;//ACLK //--main void main (void) { //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //设置时钟 initClocks(); //计时器设置 setupTimer(); //ADC 设置 setupADC(); while (1) { //开始单次转换,无重复或序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_SINGLECHANNEL); //等待中断标志生效 while (!(ADC12_A_getInterruptStatus (ADC12_A_base、ADC12IFG0))); //获取值 数据= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //清除中断标志并启动另一个转换 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IFG0); } }//--setup timer void setupTimer(void){ Timer_A_initContinuousModeParam ={0}; param.clockSource |= TIMER_A_CLOCKSOURCE_SMCLK; param.clockSourceDivider |= TIMER_A_CLOCKSOURCE_divider; param.startTimer |= false; } //-setup 系统时钟 void initClocks(void){ //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //设置比率和所需的 MCLK 频率并初始化 DCO UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); } //--setup ADC void setupADC (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init (ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1); //将采样计时器设置为采样保持64个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer (ADC12_A_base、 ADC12_A_CYCLEHOLD_64_CYCLES、 ADC12_A_CYCLEHOLD_64_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //打开 ADC12 ADC12_A_ENABLE (ADC12_A_base); //启用存储器缓冲器0中断 // ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); }
您好、Britta、
如果您参考数据表中的 ADC12SHSx、我可以看到计时器 A0链接到 ADC12_A_SAMPLEHOLDSOURCE_1
那么我的 ADC init 语句 :
ADC12_A_init (
ADC12_A_base、
ADC12_A_SAMPLEHOLDSOURCE_1、
ADC12_A_CLOCKSOURCE_ADC12OSC、
ADC12_A_CLOCKDIVIDER_1
);
但代码似乎不起作用。
#include "driverlib.h" //- -#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_of _Samples 32 //喜欢抓取32个样本 #define COMPARE_VALUE 50000 //相关时钟 #define MCLK_REFOD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz #define COMPARE_LLRLL_CALCFFEFFT / FREE_FREE/ FREE/ FREE= 32.768kHz ( FLL_FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE= 32.768kHz) -void void setupADC (void);void initTimer (void);void initClocks (void);//--globals volatile uint16_t DATA[No_for_Samples];// ADC Data uint32_t MCLK = 0;//MCLK uint32_t smclk = 0;//SMCLK uint32_t 状态 = 0;/t intruint32;/uintuat_t uintma-void = 0 //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 setupADC(); //启用全局中断 _bis_SR_register (GIE); __no_operation();//对于调试 器} //设置以 SMCLK void initTimer(void){为源的连续模式计时器 Timer_A_initContinuousModeParam ={0}; param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; param.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; param.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; param.timerClear = timer_a_do _clear; param.startTimer = false; Timer_A_initContinuousMode (timer_A0_BASE、¶m); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (timer_A1_base、timer_A_CAPTURECOMPARE 寄存器_0); Timer_A_initCompareModeinitCompParam ={0}; initCompParam.compareRegister initCompParam.compareValue = TIMER_A_CAPTURMPARE 寄存器0;initCompParam.compareInterruptEnable = TIMER_A_URECOMPE_= initCompParam.compareOutputMode;TIMER_OUTAULT_INTERRUT_TALT_TAMOUNT = Timer_A_initCompareMode (timer_A1_base、&initCompParam); Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks (void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void setupADC (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持64个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_64_CYCLES、 ADC12_A_CYCLEHOLD_4_CYCLES、 ADC12_A_MULTIPLESAMPLESENABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL); } #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; switch (__evo_in_range (ADC12IV、34)){ 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } } #pragma vector=Timer1_A0_vector __interrupt void Timer1_A0_ISR (void) { uint16_t compVal = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_CAPTURECMOLE_REGISTER_0)+ COMPARE_VALUE; //Toggle P1.0 //上面有绿色 LED GPIO_toggleOutputOnPin ( GPIO_PORT_P1、 GPIO_PIN0 ); //将偏移添加到 CCR0 Timer_A_setCompareValue (timer_A1_base、 Timer_A_CAPTURECMPARE 寄存器0、 COMPVal ); } #pragma vector=UNMI_VECTOR __INTERRUPT void NMI_ISR (void) { 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
您好、Bruce、
我根据您的建议进行了更改、但也将 ADC12_A_startConversion 移到了计时器 ISR 中。 这是正确的方法吗?
因此、如果计时器溢出频率为250Hz、SMCLK 为16MHz、则4ms 由64000表示为 CCR1的计数值
此外, 当 ADC12_A_SAMPLEHOLDSOURCE_1被更改为 ADC12_A_SAMPLEHOLDSOURCE_SC 时,它的运行方式似乎是正常的。 否则它不起作用
ADC12_A_init (
ADC12_A_base、
ADC12_A_SAMPLEHOLDSOURCE_1、 <--当这个值更改为 ADC12_A_SAMPLEHOLDSOURCE_SC 时,它看起来会起作用。
ADC12_A_CLOCKSOURCE_ADC12OSC、
ADC12_A_CLOCKDIVIDER_1
);
#include "driverlib.h" //- -#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_of _Samples 32 //喜欢抓取32个样本 #define COMPARE_VALUE 64000 //时钟相关 #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz #define COMPARE_LLRL_BREF_RATION 32.768kHz / FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY (FLL_IN)/ FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY FREE_FREE_FREE_L/ FRE void void initADC (void);void initTimers (void);void initClocks (void);void initGPIO (void);//--globals volatile uint16_t data[No_for_Samples];// ADC Data volatile uint16_t comparevalue;uint32_t MCLK = 0;//mctruint32 = uint/uint32;/uintuintuint32 u/uintuintuintuintu/t uintuintuintk = uint32;/uintuintuint32 uintuintuintuintuintuintu.uintma-u/uint //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); //启用全局中断 _bis_SR_register (GIE); } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-以 SMCLK void initTimers (void)为源的连续模式设置计时器 { Timer_A_initContinuousModeParam ={0}; param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; param.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; param.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; param.timerClear = timer_a_do _clear; param.startTimer = false; Timer_A_initContinuousMode (timer_A1_base、¶m); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A1_base、&initCompParam); Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks(void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_SC、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持64个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_64_CYCLES、 ADC12_A_CYCLEHOLD_4_CYCLES、 ADC12_A_MULTIPLESAMPLESENABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 // ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL); } #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; switch (__evo_in_range (ADC12IV、34)){ 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } } #pragma vector=Timer1_A1_vector __interrupt void Timer1_A1_ISR (void) { comparevalue = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_CAPTURECMPare_register_1); //切换绿色 LED GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0); //开始 ADC 转换。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL); Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1); } #pragma vector=UNMI_Vector __interrupt void NMI_ISR (void) { 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
"不起作用"是指 ADC 根本不运行、还是运行过快? 我对该代码的读取表明第二个代码。
> ADC12_A_MULTIPLESAMPLESENABLE
结合 CONSEQ=2 (ADC12_A_REPEDIATE_SNGLECHANNEL)、这将以最快的速度运行 ADC、我认为这不是目标。 我建议您将其替换为:
>ADC12_A_REPLEASE_SINGLECHANNELDISABLE // MSC=0
这将重复单个通道、但由计时器起搏。 那么我想您可以后退
>ADC12_A_SAMPLEHOLDSOURCE_1、// SHS=1
并将 ADC12_A_startConversion 调用移回 main。
[编辑:这里的关键是 startConversion 将设置 ENC=1、这将允许计时器触发 ADC。 它还将设置 SC、但这将被忽略、因为 SHS!= 0。]
[编辑:用户指南(SLAU208Q)中的图表图 28-9对于跟踪 CONSEQ=2、MSC 和 SHS ("触发器")之间的交互非常有用。]
----------
由于您在连续模式下运行计时器、因此周期将为65536个周期(~244Hz)。 您在周期中触发64000个周期这一事实不会改变周期。
在之前的版本中、您是通过每次将 CCR0前移一个周期来实现这一点的、而做同样的事情(使用 CCR1)将在这里正常工作。
您还可以切换到向上计数模式、对周期(CCR0)使用 cycle_count、对 CCR1比较使用 cycle_count/2。
第一个(向前移动 CCR1)可能是最小的变化--只需调整您之前代码的行:
> Timer_A_setCompareValue (timer_A1_base、timer_A_CAPTURECOMPARE 寄存器_1、compVal+cycle_count);
ADC12_A_REPEDIATE_SINGLECHANNELDISABLE 作为一个选项不存在(查看 ADC12_a.h)、因此选择 ADC12_A_SINGLECHANNEL (ADC12CONSEQ_0)
根据您的建议、将其保留在连续模式和其他更改。 我可以看到、ADC 没有触发。 是否确定计时器的实例应为 Timer1_A3?
#include "driverlib.h" //- -#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_of _Samples 32 //喜欢抓取32个样本 #define COMPARE_VALUE 64000 //时钟相关 #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz #define COMPARE_LLRL_BREF_RATION 32.768kHz / FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY (FLL_IN)/ FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY FREE_FREE_FREE_L/ FRE void void initADC (void);void initTimers (void);void initClocks (void);void initGPIO (void);//--globals volatile uint16_t data[No_for_Samples];// ADC Data uint32_t MCLK = 0;//MCLK uint32_t smclk = 0;/t intruint32;/uintu/uintuintu/t status/t inuint32;/uintuintu/uintmain_t_uintmain_t_uintk = 0 //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); //启用全局中断 _bis_SR_register (GIE); } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-setup 计时 器 void initTimers (void) { //以 SMCLK 为源的连续模式中的启动定时器 Timer_A_initContinuousModeParam initContParam ={0}; initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; initContParam.timerClear = timer_a_do _clear; initContParam.startTimer = false; Timer_A_initContinuousMode (timer_A1_base、&initContParam); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A1_base、&initCompParam); Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks (void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持64个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_SINGLECHANNEL); } #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; switch (__evo_in_range (ADC12IV、34)){ 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } } #pragma vector=Timer1_A1_vector __interrupt void Timer1_A1_ISR (void) { uint16_t compVal = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_Value URECOMPare_register_1)+ COMPARE_VALUE; //将偏移添加到 CCR1 Timer_A Compare_A (timer_A Compare_register) + COMPARE_UCCR1_COMPARE_1 (timer_COMPARE_COMPARE_INTRY_ER_COMPARE_COUNT_COMPARE_INTRIVATE)+ COMPARE_COMPARE_COMPARE_ER_COMPARE_ER_COMPARE_COUNTLET_COUNTLER_COUNTLE 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
您好、Bruce、
ADC 根本不会被触发。
以下快照单步进入代码。
initTimer()之后的寄存器视图(在 main 中):
寄存器视图(如下所示)、因为它首次达到 Timer1_A1_ISR ()。
计时器 ISR 末尾的寄存器视图
#include "driverlib.h" //- -#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_of _Samples 32 //喜欢抓取32个样本 #define COMPARE_VALUE 64000 //时钟相关 #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz #define COMPARE_LLRL_BREF_RATION 32.768kHz / FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY (FLL_IN)/ FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY FREE_FREE_FREE_L/ FRE void void initADC (void);void initTimers (void);void initClocks (void);void initGPIO (void);//--globals volatile uint16_t data[No_of_samples];// ADC Data volatile uint16_t compintVal=0;uint32_t MCLK = 0;//mctruint32;/uintuint32_t status/uintuintuint32;/uintuintuintuint32 u/uintuintma-status/t uintuintuintu/uintuintuint32;/uintuintuintuintuintuint //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); //启用全局中断 _bis_SR_register (GIE); } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-setup 计时 器 void initTimers (void) { //以 SMCLK 为源的连续模式中的启动定时器 Timer_A_initContinuousModeParam initContParam ={0}; initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; initContParam.timerClear = timer_a_do _clear; initContParam.startTimer = false; Timer_A_initContinuousMode (timer_A1_base、&initContParam); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A1_base、&initCompParam); Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks (void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持64个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2 } #pragma vector = ADC12_vector _ interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; switch (__evo_in_range (ADC12IV、34)){ 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } } #CAPTMA pragma vector=Timer1_A1_Vector __interrupt void Timer1_A1_ISR (void) { compVal = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_CAPTUREECMPARE 寄存器_1)+ COMPARE_VALUE; //向 CCR1 Timer_A_setCompareVal 添加偏移量(timer_A + COMPARE_RATION_1 、Timer_COMPARE_COUNTIMER_COMPARE_COMPARE_COUNT_COUNT_REGENT) + COMPARE_COMPARE_COMPARE_COUNTIMER_COMPARE_COMPARE_COUNT_COUNT_COUNT_COUNTRISTER_COMPARE_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNTRISR (COMPARE_COMPARE_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_TR 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
您好、Bruce、
我在之前的帖子中提到了这一点(显示了 TA0连接的表格)。
无论如何、我已恢复使用 TIMER_A0、并且 ADC 似乎正在触发。
每4ms 间隔、我希望 ADC ISR 收集32个样本。 如何实现这一点?
我知道在连续模式下、溢出将在65536个周期后发生。 因此、如果我将 CCR1设置为64000 (4ms)、这时 ADC ISR 将会触发。
我对这一点的理解是否正确?
此致
脉冲
#include "driverlib.h" //- -#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_of _Samples 32 //喜欢抓取32个样本 #define COMPARE_VALUE 64000 //时钟相关 #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz #define COMPARE_LLRL_BREF_RATION 32.768kHz / FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY (FLL_IN)/ FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY FREE_FREE_FREE_L/ FRE void void initADC (void);void initTimers (void);void initClocks (void);void initGPIO (void);//--globals volatile uint16_t data[No_of_samples];// ADC Data volatile uint16_t compintVal=0;uint32_t MCLK = 0;//mctruint32;/uintuint32_t status/uintuintuint32;/uintuintuintuint32 u/uintuintma-status/t uintuintuintu/uintuintuint32;/uintuintuintuintuintuint //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); //启用全局中断 _bis_SR_register (GIE); while (1) { } } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-setup 计时 器 void initTimers (void) { //以 SMCLK 为源的连续模式中的启动定时器 Timer_A_initContinuousModeParam initContParam ={0}; initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; initContParam.timerClear = timer_a_do _clear; initContParam.startTimer = false; Timer_A_initContinuousMode (timer_A0_BASE、&initContParam); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A0_BASE、&initCompParam); Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks (void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持64个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2 } #pragma vector = ADC12_vector _ interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; switch (__evo_in_range (ADC12IV、34)){ 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } } #pragma vector=TIMER0_A1_Vector __interrupt void TIMER0_A1_ISR (void) { compVal = Timer_A_getCaptureCompareCount (timer_A0_BASE、timer_A_CAPTUREECMPARE 寄存器_1)+ COMPARE_VALUE; //将偏移添加到 CCR1 Timer_A_setCompareCount (timer_A1_COMPARE_AM_COMPARE_1 )、Timer_COMPARE_AMT_COUNT_REGIST_COUNTMPARE (timer_COMPARE_COMPARE_AM_COMPARE_AM_COMPARE_1)+ COMPARE_COMPARE_COUNTIMER_COMPARE_COUNT_COUNTRIST_COUNT_COUNT_COUNTRIST_COUNT_COUNTRY_ER_TRIGGER_TRIGGER_TRIGGER_ER_ER 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
您好、Bruce、
我在下面找到了一个示例、想知道它是否与我想要的类似。 它通过计时器启用 ADC。
/*-版权所有-、BSD_EX *版权所有(c) 2012、德州仪器(TI)公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 * *** * * MSP430代码示例免责声明 * * MSP430代码示例是自包含的低级程序 ,通常*以 高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认 值*寄存器值和时钟配置等设置、 并且在组合多个示例中的代码时必须*小心以避免潜在的副作用 *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware *了解外设配置的 API 函数库方法。 * *--/版权--* //********* // MSP430G2x33/G2x53演示- ADC10、采样 A7、1.5V、TA1 Trig、超低功耗 // //说明:A7以1.5V 为基准以1024秒(32xACLK)采样。 所有 //活动由正确使用 MSP430低功耗模式的中断驱动、 //演示了 ADC10和 Vref。 Timer_A 在向上计数模式下同时使用 TA1/TA0来 //驱动 ADC10转换(也可以使用连续模式)。 TA0_ISR 软件的//内部将启用 ADC10和内部基准、 //允许 Vref 在采样开始之前稳定超过30us 的延迟。 每 32个 ACLK 周期 TA1自动触发一次采样//开始。 ADC10_ISR //将禁用 ADC10和 Vref 并比较 ADC10转换代码。 内部 //振荡器乘以采样(16x)和转换(13x)。 如果 A7 > 0.2Vcc、 // P1.0被置位、否则复位。 正常模式为 LPM3。 ////////* ACLK 需要一个 XOUT 上的外部手表晶振*// //// +--- (0.9766us)---- -------------------------------------------------------- >+ // TA0_ISR TA1 ADC10_ISR TA0_ISR TA1 //--- ---------------- ---------------- +--- \---- ---------------- +--- >// 启用 ADC 触发 ADC 禁用 ADC //和 Vref 比较 // +-(>30US-->+////// // MSP430G2x33/G2x53 // -------- // /|\| XIN|- // || | 32kHz // -|RST XOUT|- // | | // --|P1.7/A7 P1.0 |--> LED // D. Dang // Texas Instruments Inc. // 2010年12月 //使用 CCS 版本4.2.0和 IAR 嵌入式工作平台版本构建:5.10 //********* #include int main (void) { WDTCTL = WDTPW + WDTHOLD; //停止 WDT ADC10CTL1 = INCH_7 + SHS_1; // P1.7、TA1触发采样启动 ADC10AE0 = 0x80; // P1.7 ADC10选项选择 P1DIR |= 0x01; //将 P1.0设置为输出方向 TACCTL0 = CCIE; //启用中断 TACCR0 = 32-1; // PWM 周期 TACCTL1 = OUTMOD_3; // TACCR1设置/复位 TACCR1 = 2; // TACCR1 PWM 占空比 TACTL = tassel_1 + MC_1; // ACLK、向上计数模式 __bis_SR_register (LPM3_bits + GIE); //输入 LPM3、启用中断 } // ADC10中断服务例程 #pragma vector=ADC10_vector __interrupt void ADC10_ISR (void) { ADC10CTL0 &=~ENC; // ADC10禁用 ADC10CTL0 = 0; // ADC10、如果 (ADC10MEM < 0x88)、Vref 完全禁用 // ADC10MEM = A7 > 0.2V? P1OUT &=~0x01; //清除 P1.0 LED, 否则 P1OUT |= 0x01; //将 P1.0 LED 设置为打开 } //计时器 A0中断服务例程 #pragma vector=TIMER0_A1_VECTOR __interrupt void Timer_A (void) { ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE; ADC10CTL0 || ENC; // ADC10使能集 }
您好、Bruce、
回到昨天的讨论、我仍然对计时器及其 ISR 感到困惑。
如果您希望在4ms 内获得32个样本--每125usec 生成1个样本--定时器需要每125usec 生成一个边沿,将其频率从250Hz 更改为8kHz。
>>我将 COMPARE_VALUE 设置为2000 (16MHz/8kHz) 、因此我的 TA0CCR1设置为2000。 那么需要将什么设置为4000? TACCR0?
我的以下代码已损坏:
#include "driverlib.h" //--#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_for_Samples 32 //喜欢抓取32个样本 //如果您希望在4ms 内获得32个样本,即每125usec 1个样本 //计时器需要每125usec 生成一个边沿=8kHz/t = 8kHz (1个) //比较值= SMCLK/8kHz =(16MHz/8kHz)= 2000 #define COMPARE_VALUE 2000 //与时钟相关 的#define MCLK_NEXD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU) REVED = 16MHz #define FLLREF_kHz //参考频率(FLL) #define MCLMK_INTEFAULT/ void (void);void / INCEFLEVACT-kHz)/TIVACT-TIVACK-FREE (void (void) 32.768 ;void (f_LMCLK);void / void (void / void (void) -globals volatile uint16_t data[No_of_samples];// ADC Data volatile uint16_t compVal=0; uint32_t MCLK = 0;//MCLK uint32_t smclk = 0;//SMCLK uint32_t aclk = 0;//ACLK uint16- void (void -main) //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); //启用全局中断 _bis_SR_register (GIE); } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-setup 计时 器 void initTimers (void) { //以 SMCLK 为源的连续模式中的启动定时器 Timer_A_initContinuousModeParam initContParam ={0}; initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; initContParam.timerClear = timer_a_do _clear; initContParam.startTimer = false; Timer_A_initContinuousMode (timer_A0_BASE、&initContParam); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A0_BASE、&initCompParam); Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode); TA0CCR0 = 4000;//ADC 触发 器} //-setup 系统时钟 void initClocks(void){ //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持32个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 // ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL);// conseq = 2 } #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; 开关(__evo_in_range (ADC12IV、34)) { 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } ADC12_A_disableConversions (ADC12_A_base、ADC12_A_COMPLETECONVERSITION);//禁用转换 } #pragma vector=TIMER0_A1_vector __interrupt void TIMER0_A1_ISR (void) { compal = Timer_A_getCaptureCompareCompareTimer = Timer_A + CORAME_A CORE_A CORET_AMT_PRECT_AMORT_PRISTER (COUNTRIET_AM_AM_COMPARE + COUNTRIEL)、COUNT_COMPARE_RATION_TRIET_COUNTRIEL (COUNT_COMPLET_RATION_TRISTER_COMPAL)+ COMPAREST_COMPALL_COMPALL_COMPALL_COMPAREST_RATE + COMPAREST_RATE + COMPAREST_COUNT_COUNT_RATE + COMPALL_COMPAREST_COUNT_COUNT_COUNT_RATE + COMPAREST_COUNT_RATE COMPAL ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2 } #pragma vector=UNMI_vector __interrupt void NMI_ISR (void) { 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
#include "driverlib.h" //--#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_for_Samples 32 //喜欢抓取32个样本 //如果您希望在4ms 内获得32个样本,即每125usec 1个样本 //计时器需要每125usec 生成一个边沿=8kHz/t = 8kHz (1个) //比较值= SMCLK/8kHz =(16MHz/8kHz)= 2000 #define COMPARE_VALUE 2000 #define PULSE_WIDTH 10 //任意:小、>(16MHz/4.2MHz) //时钟相关 #define MCLK_REFOD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz、>(16MHz)/FLL_REF_REF_RA比 /FAIL_REF_REF_REF_kHz (32.768kHz) void initTimers (void); void initClocks (void); void initGPIO (void); //--globals volatile uint16_t data[No_of_samples];// ADC Data volatile uint16_t compVal=0; uint32_t MCLK = 0;//MCLK UCL32_t smclk = 0;/uintuint32;/t intruint/uintuintu/t status= 0;/t inuint32;/uintuintuintuintuintuint32;/t inuintuint-uintuintuintuintuint //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); //启用全局中断 _bis_SR_register (GIE); } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-setup 计时 器 void initTimers (void) { //以 SMCLK 为源的连续模式中的启动定时器 Timer_A_initContinuousModeParam initContParam ={0}; initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; initContParam.timerClear = timer_a_do _clear; initContParam.startTimer = false; Timer_A_initContinuousMode (timer_A0_BASE、&initContParam); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A0_BASE、&initCompParam); Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks (void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持32个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 // ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL);// conseq = 2 } #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; 开关(__evo_in_range (ADC12IV、34)) { 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } ADC12_A_disableConversions (ADC12_A_base、ADC12_A_COMPLETECONVERSITION);//禁用转换 } #pragma vector=TIMER0_A1_vector __interrupt void TIMER0_A1_ISR (void) { compVal = Timer_A_getCaptureCompareCompareCompareCompareCompareTimer=TIMER0_A + COMPARE_RATE (COMPARE_COMPARE_1) + COMPARE_COMPARE_COUNTER_RATE (COMPARE_COMPARE_RATE)+ COMPARE_COMPARE_COUNTER_RATE (COMPARE_COMPARE_RATE)+ COMPARE_COUNTER_RATION_COMPARE_RATE (COMP //新 CCR1 Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTUREMPARE 寄存器_0、compVal + PULSE_width);//新 CCR0 Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、timer_A_CAPTURECOMPARE 寄存器_1); //开始单次转换或无重复序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2 } #pragma vector=UNMI_vector __interrupt void NMI_ISR (void) { 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
您好、Bruce、
好的、我也做了这些更改。 似乎我得到一个 ADC 计数、然后在 ADC ISR 禁用后转换被禁用。
您好、Bruce、
我得到一个转换。 暂停执行时、它在 ADC12_A_disableConversions 内。
到目前为止我的代码:
#include "driverlib.h" //--#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_for_Samples 32 //喜欢抓取32个样本 //如果您希望在4ms 内获得32个样本,即每125usec 1个样本 //计时器需要每125usec 生成一个边沿=8kHz/t = 8kHz (1个) //比较值= SMCLK/8kHz =(16MHz/8kHz)= 2000 #define COMPARE_VALUE 2000 #define PULSE_WIDTH 10 //任意:小、>(16MHz/4.2MHz) //时钟相关 #define MCLK_REFOD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz、>(16MHz)/FLL_REF_REF_RA比 /FAIL_REF_REF_REF_kHz (32.768kHz) void initTimers (void); void initClocks (void); void initGPIO (void); //--globals volatile uint16_t data[No_of_samples];// ADC Data volatile uint16_t compVal=0; uint32_t MCLK = 0;//MCLK UCL32_t smclk = 0;/uintuint32;/t intruint/uintuintu/t status= 0;/t inuint32;/uintuintuintuintuintuint32;/t inuintuint-uintuintuintuintuint //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); //启用全局中断 _bis_SR_register (GIE); } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-setup 计时 器 void initTimers (void) { //以 SMCLK 为源的连续模式中的启动定时器 Timer_A_initContinuousModeParam initContParam ={0}; initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; initContParam.timerClear = timer_a_do _clear; initContParam.startTimer = false; Timer_A_initContinuousMode (timer_A0_BASE、&initContParam); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A0_BASE、&initCompParam); Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks (void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持32个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 // ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL);// conseq = 2 } #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; 开关(__evo_in_range (ADC12IV、34)) { 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } ADC12_A_disableConversions (ADC12_A_base、ADC12_A_COMPLETECONVERSITION);//禁用转换 } #pragma vector=TIMER0_A1_vector __interrupt void TIMER0_A1_ISR (void) { compVal = Timer_A_getCaptureCompareCompareCompareCompareCompareTimer=TIMER0_A + COMPARE_RATE (COMPARE_COMPARE_1) + COMPARE_COMPARE_COUNTER_RATE (COMPARE_COMPARE_RATE)+ COMPARE_COMPARE_COUNTER_RATE (COMPARE_COMPARE_RATE)+ COMPARE_COUNTER_RATION_COMPARE_RATE (COMP //新 CCR1 Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTUREMPARE 寄存器_0、compVal + PULSE_width);//新 CCR0 Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、timer_A_CAPTURECOMPARE 寄存器_1); //开始单次转换或无重复序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2 } #pragma vector=UNMI_vector __interrupt void NMI_ISR (void) { 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
您好、Bruce、
ADC12ENC 位的寄存器级切换不再挂起、因此将继续保持挂起。
当我在计时器 ISR 内的开始转换时设置断点时,我会看到以下内容:
开始:TA0CCR0 = 4010,TA0CCR1 = 4000,TA0R=2110
第一次转换:TA0CCR1 = 10000、TA0CCR0 = 10010、TA0R = 8110
第二次转换:TA0CCR1 = 12000、TA0CCR0 = 12010、TA0R = 10110
等等。
我的代码如下:
#include "driverlib.h" //--#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_for_Samples 32 //喜欢抓取32个样本 //如果您希望在4ms 内获得32个样本,即每125usec 1个样本 //计时器需要每125usec 生成一个边沿=8kHz/t = 8kHz (1个) //比较值= SMCLK/8kHz =(16MHz/8kHz)= 2000 #define COMPARE_VALUE 2000 #define PULSE_WIDTH 10 //任意:小、>(16MHz/4.2MHz) //时钟相关 #define MCLK_REFOD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz、>(16MHz)/FLL_REF_REF_RA比 /FAIL_REF_REF_REF_kHz (32.768kHz) void initTimers (void); void initClocks (void); void initGPIO (void); //--globals volatile uint16_t data[No_of_samples];// ADC Data volatile uint16_t compVal=0; uint32_t MCLK = 0;//MCLK UCL32_t smclk = 0;/uintuint32;/t intruint/uintuintu/t status= 0;/t inuint32;/uintuintuintuintuintuint32;/t inuintuint-uintuintuintuintuint //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); while (1) { //启用全局中断 _bis_SR_register (GIE); } } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-setup 计时 器 void initTimers (void) { //以 SMCLK 为源的连续模式中的启动定时器 Timer_A_initContinuousModeParam initContParam ={0}; initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; initContParam.timerClear = timer_a_do _clear; initContParam.startTimer = false; Timer_A_initContinuousMode (timer_A0_BASE、&initContParam); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A0_BASE、&initCompParam); Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks (void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_1、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持32个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_CYCLEHOLD_32_CYCLES、 ADC12_A_MULTIPLESAMPLESDISABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、¶m); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 //ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL);// conseq = 2 } #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; 开关(__evo_in_range (ADC12IV、34)) { 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; // ADC12_A_disableConversions (ADC12_A_base、ADC12_A_PREEMPTCONVERSITION);//禁用转换 ADC12CTL0 &=~ADC12ENC; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } } #pragma vector=TIMER0_A1_Vector __interrupt void TIMER0_A1_ISR (void) { compVal = Timer_A_getCaptureCompareCount (timer_A0_BASE、timer_A_CAPTURECOMPARE 寄存器_1)+ COMPARE_VALUE; Timer_A_setCompareVal (timer_A0_BASE、COMPARE_1);COMPARE_COMPARE_COMPARE_COMPARE_1;Timer_COMPARE_COMPARE_COMPARE_COMPARE_1;COMPARE_COMPARE_COMPAR //新 CCR1 Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTUREMPARE 寄存器_0、compVal + PULSE_width);//新 CCR0 Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、timer_A_CAPTURECOMPARE 寄存器_1); //开始单次转换或无重复序列。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2 // ADC12CTL0 |= ADC12ENC; } #pragma vector=UNMI_Vector _ interrupt (nid) 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }
您好、Bruce、
我之后的所有样本都是在4ms 周期内32个均匀间隔的样本。
当系统时钟为16MHz 和8kHz 采样率时、我们已将 ADC 触发速率设置为每125us 一次(TA0CCR1 = 2000)。 我一直理解到这里、但我不确定我们将使用64位计数 器的方法是什么。
Pulin Shah、您好!
我认为 Bruce 的建议帮助您得出了有关此主题的结论、因为您已经不再回复此话题了。
请注意、我将关闭此主题。 请验证帮助您推进项目的给定答案、以便其他用户也能从中受益。
如果您需要有关此主题的进一步帮助、请随时回复。 对于新问题或相关问题、请考虑按下页面顶部的"提出新问题"或"提出相关问题"按钮。
此致、
Britta
您好、Britta、
由于其他项目 优先事项、我没有机会尝试他的最新建议 、否则我会发布我的回复。
如果您决定 锁定该主题, 我是否 单击“提出相关问题”? 要重新激活对话框?
此致
脉冲