一、用DMA进行ADC数据传输,每采集1k个点后进行转换处理
时钟部分采用默认设置,勾选Enable Repeat Mode (连续采集1k个点)
Power Down Mode 选用 Manual
使能DMA
由于是单通道ADC,则一个通道每测一次传一个,DMA Sample Count 为1。
利用中断触发DMA,则不开启ADC的中断,在DMA Config下选用中断
如果使用FIFO模式,则DMA配置改变:
二、定时器+ADC+DMA
实现可控采样率
通过定时器触发ADC采样,并实现1MHz采样率。
周期设置保持默认即可
这里的Trigger Source与“一”处不同
之前是software软件触发,在代码中通过DL_ADC12_startConversion() 语句触发,这里需要定时器定时产生事件Event触发。
这里没用FIFO
添加定时器Timer,采用周期性倒数模式Periodic Down Counting,由于采样率是1MHz,则定时时间设置为1us。
在Event Config 中选择一个通道(此处选择CH1),选择零事件。
结合Periodic Down Counting,则每次倒数到0时,定时器都会发送一次零事件。
在ADC12中进行Event Config
在定时器中是Publisher Channel,这里ADC中是Subscriber Channel。
即定时器每1us就会产生一次零事件,而ADC为事件驱动,则每1us都会实现一次ADC转换。
在ADC Memory Config中改变Trigger Mode,这样就不会因为设置了Repeate Mode而自动给自己Start标志位置位,从而自动触发。会等待外部事件到来。
#include "ti_msp_dl_config.h"
uint16_t gADCSamples[1000];
int main(void)
{
SYSCFG_DL_init();
DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) 0x40556280);
DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gADCSamples[0]);
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
DL_ADC12_startConversion(ADC12_0_INST);
while (1) {
}
}
void ADC12_0_INST_IRQHandler(void)
{
switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST))
{
case DL_ADC12_IIDX_DMA_DONE:
//DL_TimerA_stopCounter(TIMER_0_INST);
//数据处理部分,此处无
SYSCFG_DL_ADC12_0_init();
SYSCFG_DL_DMA_init();
DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) 0x40556280);
DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gADCSamples[0]);
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
DL_ADC12_startConversion(ADC12_0_INST);
//DL_TimerA_stopCounter(TIMER_0_INST);
break;
default:
break;
}
}
采集成功哈哈