主题中讨论的其他器件:SysConfig
工具与软件:
您好、根据该表、当使用具有4个通道、1个 DMA 和1个 FIFO 的 ADC 并在每次DL_ADC12_IIDX_DMA_DONE
设置标志时切换 LED 时、这是否意味着在采样值加载到MEMRES11
而不是加载到时将设置该标志MEMRES3
?
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.
工具与软件:
您好、根据该表、当使用具有4个通道、1个 DMA 和1个 FIFO 的 ADC 并在每次DL_ADC12_IIDX_DMA_DONE
设置标志时切换 LED 时、这是否意味着在采样值加载到MEMRES11
而不是加载到时将设置该标志MEMRES3
?
尊敬的 Ali:
在 DMA 乒乓自述文件中、由于 DMA 触发条件的设置已设置为最后一个寄存器、因此突出显示的语句是正确的。
您可以将 DMA 设置为在最后一个寄存器之前触发、因为 ADC 和 DMA 将同时运行、因此您可以在 DMA 传输 MEM10和 MEM11之前安排 ADC 完成时间。 您可以选择的 DMA 触发值取决于 ADC 的采样速度。
或者(或其他)您可以设置 DMA 的早期通道中断位、以便在 DMA 完全完成之前触发其 DMA 完成。 这对于总体应用程序速度很有帮助、因为 DMA 将最终完成其所有传输、但您可以允许 CPU 处理 IRQ。 请参阅技术参考手册中的第4.2.11节。
此致、
Luke
尊敬的 Luke:
我的问题是我有4个 ADC 通道、并且我已经启用了 DMA 和 FIFO。 我能否配置 ADC 以便 ADC 在结果加载到 MEM3时触发 DMA、或者我是否由于 FIFO 而被迫等待、直到 MEM11加载完毕、然后 ADC 触发 DMA 工作? 我注意到、如果我每次设置 DL_ADC12_IIDX_DMA_DONE 时切换 LED、那么(启用 DMA 触发) MEM5重载中断、MEM11重载中断或 MEM3重载中断没有区别、为什么?
此致、
Ali
尊敬的 Luke:
当按 DMA 和 ADC 顺序使用多个通道但不使用 FIFO 时、代码会是什么样的。 尤其是对于 DL_DMA_setSrcAddr 函数。 对于 DMA、地址模式以及传输模式、我应该使用什么模式?
SYSCFG_DL_init ();
DL_DMA_setSrcAddr (DMA、DMA_CH0_CHAN_ID
(uint32_t) DL_ADC12_getMemResultAddress (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
DL_DMA_setDestAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t)&gADCResult[0]);
DL_DMA_setTransferSize (DMA、DMA_CH0_CHAN_ID、2);
DL_DMA_enableChannel (DMA、DMA_CH0_CHAN_ID);
NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);
此致、
Ali
如果不使用 FIFO、我会将 DMA 与您拥有的通道数对齐。 请记住、DMA 将会拉取 2. 一次 MEMRES (如果您有4个通道、那么您需要2个 DMA 事务)。
可以使用 DMA 乒乓或 ADC12_max_freq_dma 中使用的相同设置。 Address 模式是固定地址到块地址(ADC 寄存器到您的缓冲区/阵列)。 传输模式取决于您的处理流程、块传输只需通过一次触发即可传输整个传输大小。 单个触发将要求每次传输有一个触发。
我不知道您的完整应用以及发生该 ADC 过程的频率、但听起来您好像是在每 X 个时间后定期采样。 如果您计划一次准备好所有数据、则可以使用块传输、通过单个 DMA 触发将所有数据从 MEMRES 寄存器传输到缓冲区。
此致
Luke
尊敬的 Luke:
如果我想使用多个 ADC 通道、 src
DMA 的功能应该是什么样的?
DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) DL_ADC12_getMemResultAddress(ADC12_0_INST, DL_ADC12_MEM_IDX_0));
我不想使用 FIFO、我想使用多个通道。 这是可行的吗?
此致
Ali
尊敬的 Luke:
我曾尝试在没有 FIFO 的情况下仅使用两个通道、但没能正常工作。 我只从 DL_ADC12_MEM_IDX_0获得结果、尽管我将 DMA 配置为递增源。
这是我的代码:
#include "ti_msp_dl_config.h"
bool gCheckADC;
uint16_t gADCResult[2];
uint32_t 地址;
uint32_t 地址 WO;
int main (void)
{
SYSCFG_DL_init ();
DL_DMA_setSrcAddr (DMA、DMA_CH0_CHAN_ID
(uint32_t) DL_ADC12_getMemResultAddress (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
DL_DMA_setDestAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t)&gADCResult[0]);
DL_DMA_setTransferSize (DMA、DMA_CH0_CHAN_ID、2);
DL_DMA_enableChannel (DMA、DMA_CH0_CHAN_ID);
NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);
DL_TimerG_startCounter (TIMER_0_INST);
gCheckADC = false;
while (gCheckADC = false)
{
__ WFE ();
}
__BKPT (0);
地址1 = DL_ADC12_getMemResultAddress (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
addresswo = DL_ADC12_getMemResultAddress (ADC12_0_INST、DL_ADC12_MEM_IDX_1);
while (1){
}
}
void ADC12_0_INST_IRQHandler (void)
{
开关(DL_ADC12_getPendingInterrupt (ADC12_0_INST)){
案例 DL_ADC12_IIDX_DMA_DONE:
gCheckADC = true;
//gADCResult[0]= DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
// gADCResult[1]= DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_1);
// DL_ADC12_enableConversions (ADC12_0_INST);
// DL_GPIO_togglePins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
休息;
默认值:
休息;
}
}
/*
*====== ti_msp_dl_config.c ===
*已配置的 MSPM0 DriverLib 模块定义
*
*请勿编辑-此文件是为 MSPM0G350X 生成的
*由 SysConfig 工具提供。
*/
#include "ti_msp_dl_config.h"
/*
*==== SYSCFG_DL_init ===
*在使用任何板级 API 之前执行所需的任何初始化
*/
sysconfig_weak void SYSCFG_DL_init (void)
{
SYSCFG_DL_initPower();
SYSCFG_DL_GPIO_init ();
/*特定于模块的初始化*/
SYSCFG_DL_SYSCTL_init ();
SYSCFG_DL_TIMER_0_init ();
SYSCFG_DL_ADC12_0_init ();
SYSCFG_DL_DMA_init ();
}
SysConfig_weak void SYSCFG_DL_initPower (void)
{
DL_GPIO_RESET (GPIOA);
DL_GPIO_RESET (GPIOB);
DL_TimerG_RESET (TIMER_0_INST)
DL_ADC12_RESET (ADC12_0_INST);
DL_GPIO_enablePower (GPIOA);
DL_GPIO_enablePower (GPIOB);
DL_TimerG_enablePower (TIMER_0_INST);
DL_ADC12_enablePower (ADC12_0_INST);
delay_cycles (power_startup_delay);
}
SysConfig_weak void SYSCFG_DL_GPIO_init (void)
{
DL_GPIO_initDigitalOutput (GPIO_LEDS_USER_LED_1_IOMUX);
DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
DL_GPIO_enableOutput (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
}
SysConfig_weak void SYSCFG_DL_SYSCTL_init (void)
{
//低功耗模式配置为 SLEEP0
DL_SYSCTL_setBORThreshold (DL_SYSCTL_BOR_THR_LEVEL_0);
DL_SYSCTL_setSYSOSCFreq (DL_SYSCTL_SYSOSC_FREQ_BASE);
/*设置默认配置*/
DL_SYSCTL_disableHFXT ();
DL_SYSCTL_disableSYSPLL ();
DL_SYSCTL_setULPCLKDivider (DL_SYSCTL_ULPCLK_DIV_1);
DL_SYSCTL_setMCLKDivider (DL_SYSCTL_MCLK_DIVIDER_DISABLE);
}
/*
*计时器时钟配置、以 BUSCLK 为源/(32000000 Hz)
* timerClkFreq =(timerClkSrc/(timerClkDivRatio *(timerClkPrescale + 1)))
* 32000000 Hz = 32000000 Hz /(1 *(0 + 1))
*/
静态 const DL_TimerG_ClockConfig gTIMER_0ClockConfig ={
clockSel = DL_TIMER_CLOCK_BUSCLK
divideRatio = DL_TIMER_CLOCK_Divid_1
.prescale = 0u、
};
/*
*计时器加载值(计数器从此处开始)的计算公式为(timerPeriod * timerClockFreq)- 1
* TIMER_0_INST_LOAD_VALUE =(2ms * 32000000 Hz)- 1
*/
静态常量 DL_TimerG_TimerConfig gTIMER_0TimerConfig ={
.period = TIMER_0_INST_LOAD_VALUE
timerMode = DL_TIMER_MODE_PERIODICENT
.startTimer = DL_TIMER_STOP、
};
sysconfig_weak void SYSCFG_DL_TIMER_0_init (void){
DL_TimerG_setClockConfig (TIMER_0_INST、
(DL_TimerG_ClockConfig *)&gTIME_0ClockConfig);
DL_TimerG_initTimerMode (TIMER_0_INST、
(DL_TimerG_TimerConfig *)&gTIMER_0TimerConfig);
DL_TimerG_enableClock (TIMER_0_INST);
DL_TimerG_enableEvent (TIMER_0_INST、DL_TIMERG_EVENT_ROY_1、(DL_TIMERG_EVENT_ZERO_EVENT));
DL_TimerG_setPublisherChanID (TIMER_0_INST、DL_TIMERG_Publisher _INDEX_0、TIMER_0_INST_PUB_0_CH);
}
/* ADC12_0初始化*/
静态 const DL_ADC12_ClockConfig gADC12_0ClockConfig ={
clockSel = DL_ADC12_CLOCK_SYSOSC、
divideRatio = DL_ADC12_clock_divide_1
.freqRange = DL_ADC12_CLOCK_FREQ_RANGE_24_TO_32、
};
SysConfig_weak void SYSCFG_DL_ADC12_0_init (void)
{
DL_ADC12_setClockConfig (ADC12_0_INST、(DL_ADC12_ClockConfig *)&gADC12_0ClockConfig);
DL_ADC12_initSeqSample (ADC12_0_INST、
DL_ADC12_REPEAT_MODE_DISABLED、DL_ADC12_SAMPLING_SOURCE_AUTO、DL_ADC12_TRIG_SRC_EVENT
DL_ADC12_SEQ_START_ADDR_00、DL_ADC12_SEQ_END_ADDR_01、DL_ADC12_SAMP_CONV_RES_12_BIT、
DL_ADC12_SAMP_CONV_DATA_FORMAT_UNsigned);
DL_ADC12_configConversionMem (ADC12_0_INST、ADC12_0_ADCMEM_0、
DL_ADC12_INPUT_CHAN_0、DL_ADC12_REFERY_VOLTAGE_VDDA、DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0、DL_ADC12_AVERAGE_MODE_DISABLED
DL_ADC12_BURN_OUT_SOURCE_DISABLED、DL_ADC12_TRIGGER_MODE_AUTO_NEXT、DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
DL_ADC12_configConversionMem (ADC12_0_INST、ADC12_0_ADCMEM_1、
DL_ADC12_INPUT_CHAN_1、DL_ADC12_REFERY_VOLTAGE_VDDA、DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0、DL_ADC12_AVERAGE_MODE_DISABLED
DL_ADC12_BURN_OUT_SOURCE_DISABLED、DL_ADC12_TRIGGER_MODE_TRIGGER_NEXT、DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
DL_ADC12_enableFIFO (ADC12_0_INST);
DL_ADC12_setPowerDownMode (ADC12_0_INST、DL_ADC12_POWER_DOWN_MODE_MANUAL);
DL_ADC12_setSampleTime0 (ADC12_0_INST、480);
DL_ADC12_enableDMA (ADC12_0_INST);
DL_ADC12_setDMASamplesCnt (ADC12_0_INST、2);
DL_ADC12_enableDMATrigger (ADC12_0_INST、(DL_ADC12_DMA_MEM1_RESULT_LOADED));
DL_ADC12_setSubscribeChanID (ADC12_0_INST、ADC12_0_INST_SUB_CH);
/*启用 ADC12中断*/
DL_ADC12_clearInterruptStatus (ADC12_0_INST、(DL_ADC12_INTERRUPT_MEM1_RESULT_LOADED));
DL_ADC12_enableInterrupt (ADC12_0_INST、(DL_ADC12_INTERRUPT_MEM1_RESULT_LOADED));
DL_ADC12_enableConversions (ADC12_0_INST);
}
静态 const DL_DMA_Config gDMA_CH0Config ={
.transferMode = DL_DMA_SINGLE_BLOCK_TRANSFER_MODE、
.extendedMode = DL_DMA_NORMAL_MODE
.destIncrement = DL_DMA_ADDR_INCREMENT、
.srcIncrement = DL_DMA_ADDR_INCREMENT、
.destWidth = DL_DMA_WIDTH_WORD
.srcWidth = DL_DMA_WIDTH_WORD、
.trigger = ADC12_0_INST_DMA_TRIGGER、
triggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL
};
sysconfig_weak void SYSCFG_DL_DMA_CH0_init (void)
{
DL_DMA_initChannel (DMA、DMA_CH0_CHAN_ID、(DL_DMA_Config *)&gDMA_CH0Config);
}
SysConfig_weak void SYSCFG_DL_DMA_init (void){
SYSCFG_DL_DMA_CH0_init ();
}
此致、
Ali