编辑:删除了 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);
}