编辑:删除了 SLEE(),因为它与问题无关。
编辑:包含相关的预处理器定义并清理了代码表示。
编辑:修复了 SysTick 初始化问题、不影响该问题。
我正在尝试以240kHz 的频率通过 ADC 收集数据、不确定我是否正在正确设置时钟和计时器... 我一直在输入10kHz 正弦波、并获取 看起来频率高得多的数据(大约100kHz)。 有人能否验证下面的配置代码、或者准确解释 SysCtlClockSet()和 TimerLoadSet()的工作原理(如中所示,输入到它们的数字如何转换为时钟和计时器频率)?
当我运行 SysCtlClockGet ()时、我得到80 MHz、最大时钟频率。 为了查看输入、我一直将样本放入全局 uint32_t dataBuffer 并绘制它的图形。
#include #include #include #include #include #include "driverlib/adc.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/SysTick .h" #include "driverlib/timer.h" #include "inc/hw_adc.h"#include "hw_map_inc/inc/h // //预处理器定义 //在此处调整##个参数!! ##// //********* //编程器设计的参数(请勿触摸) #define SAMPLE_RATE 240000 // Hz #define ADC_SEQUENCER3 #define debug //#undef debug //********* // //全局变量 // //********* //调试变量 #ifdef debug int gBufferIndex; static uint32_t gDataBuffer[400]; #endif //********* // //初始化/配置函数 // //********* //初始化全局变量。 // 空 InitGVariables() {#ifdef 调试 //初始化调试变量。 gBufferIndex = 0; #endif } //初始化时钟和计时器。 // 空 InitTiming() { //初始化时钟。 SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN); //配置和启用计时器。 SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0); while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER0)); TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE); TimerLoadSet (TIMER0_BASE、TIMER_A、SysCtlClockGet ()/SAMPLE_RATE); TimerEnable (TIMER0_BASE、TIMER_A); TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE); #ifdef 调试 //初始化 SysTick。 SysTickPeriodSet (10000000); SysTickEnable(); #endif } //初始化 GPIO 引脚。 // void InitGPIO() { //配置模拟输入引脚。 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE)); GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);//引脚3对应于通道0 。} //初始化 ADC。 // void InitADC() { //配置 ADC 序列发生器。 SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)); ADCSequenceConfigure (ADC0_BASE、ADC_SEQUENCER, ADC_TRIGGER_TIMER、0); ADCSequenceStepConfigure (ADC0_BASE、ADC_SEQUENCER、0、ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END); //启用 ADC 中断。 IntEnable (INT_ADC0SS3); ADCIntEnable (ADC0_BASE、ADC_SEQUENCER]); IntMasterEnable(); //启用 ADC 序列发生器。 ADCSequenceEnable (ADC0_BASE、ADC_SEQUENCER); } //********* // //中断处理程序 // //********* //处理 ADC 中断。 // void ADC0Seq3IntHandler() {#ifdef debug uint32_t numCycles = SysTickValueGet (); #endif //清除中断并获取样本 ADCIntClear (ADC0_BASE、ADC_SEQUENCER]); uint32_t 采样; ADCSequenceDataGet (ADC0_BASE、ADC_SEQUENCER,采样); //处理数据样本。 #ifdef 调试 gBufferIndex =(gBufferIndex + 1)% 400; gDataBuffer[gBufferIndex]=采样; numCycles = SysTickValueGet ()- numCycles; uint32_t 时钟速率= SysCtlClockGet (); #endif } //************* // //主函数。 //// ***************** int main (void) { //初始化所有内容。 InitGVariables(); InitTiming(); InitGPIO(); InitADC(); while (1); }