在线时间69 小时
UID3399501
注册时间2020-7-31
NXP金币0
TA的每日心情 | 无聊 2021-1-15 10:56 |
---|
签到天数: 39 天 [LV.5]常住居民I
中级会员
- 积分
- 436
- 最后登录
- 2021-10-9
|
楼主 |
发表于 2020-11-13 13:12:35
|
显示全部楼层
小恩GG 发表于 2020-11-13 08:51
https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=614978&highlight=%E5%B7%AE%E5%88% ...
借鉴了链接的代码。和我的没啥区别,但是没有效果。咋回事
#include "ADC.h"
/***********************************************************************************************************************
* BOARD_InitPeripherals functional group
**********************************************************************************************************************/
#define ADC16_RESULT_REG_ADDR 0x4003b010U
#define DEMO_ADC16_SAMPLE_COUNT 16U /* The ADC16 sample count. */
volatile bool g_Transfer_Done = false; /* DMA transfer completion flag. */
edma_transfer_config_t g_transferConfig;
uint32_t g_adc16SampleDataArray[DEMO_ADC16_SAMPLE_COUNT];
/***********************************************************************************************************************
* DMA initialization code
**********************************************************************************************************************/
static void Edma_Callback(edma_handle_t *handle, void *userData, bool transferDone, uint32_t tcds)
{
/* Clear Edma interrupt flag. */
EDMA_ClearChannelStatusFlags(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, kEDMA_InterruptFlag);
/* Setup transfer */
EDMA_PrepareTransfer(&g_transferConfig, (void *)ADC16_RESULT_REG_ADDR, sizeof(uint32_t),
(void *)g_adc16SampleDataArray, sizeof(uint32_t), sizeof(uint32_t),
sizeof(g_adc16SampleDataArray), kEDMA_PeripheralToMemory);
EDMA_SetTransferConfig(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, &g_transferConfig, NULL);
/* Enable transfer. */
EDMA_StartTransfer(&DMA_CH1_Handle);
g_Transfer_Done = true;
}
const edma_config_t DMA_config = {
.enableContinuousLinkMode = false,
.enableHaltOnError = false,
.enableRoundRobinArbitration = false,
.enableDebugMode = false
};
edma_handle_t DMA_CH1_Handle;
edma_handle_t DMA_CH2_Handle;
void ADC_DMA_init(void) {
/* Channel CH1 initialization */
/* Set the source kDmaRequestMux0ADC0 request in the DMAMUX */
DMAMUX_SetSource(DMA_DMAMUX_BASEADDR, DMA_CH1_DMA_CHANNEL, DMA_CH1_DMA_REQUEST);
/* Enable the channel 1 in the DMAMUX */
DMAMUX_EnableChannel(DMA_DMAMUX_BASEADDR, DMA_CH1_DMA_CHANNEL);
/* Create the eDMA DMA_CH1_Handle handle */
EDMA_CreateHandle(&DMA_CH1_Handle, DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL);
/* Channel CH2 initialization */
/* Set the source kDmaRequestMux0ADC1 request in the DMAMUX */
DMAMUX_SetSource(DMA_DMAMUX_BASEADDR, DMA_CH2_DMA_CHANNEL, DMA_CH2_DMA_REQUEST);
/* Enable the channel 2 in the DMAMUX */
DMAMUX_EnableChannel(DMA_DMAMUX_BASEADDR, DMA_CH2_DMA_CHANNEL);
/* Create the eDMA DMA_CH2_Handle handle */
EDMA_CreateHandle(&DMA_CH2_Handle, DMA_DMA_BASEADDR, DMA_CH2_DMA_CHANNEL);
}
void EDMA_Configuration(void)
{
edma_config_t userConfig;
EDMA_GetDefaultConfig(&userConfig);
EDMA_Init(DMA_DMA_BASEADDR, &DMA_config);
EDMA_CreateHandle(&DMA_CH1_Handle, DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL);
EDMA_SetCallback(&DMA_CH1_Handle, Edma_Callback, NULL);
EDMA_PrepareTransfer(&g_transferConfig, (void *)ADC16_RESULT_REG_ADDR, sizeof(uint32_t),
(void *)g_adc16SampleDataArray, sizeof(uint32_t), sizeof(uint32_t),
sizeof(g_adc16SampleDataArray), kEDMA_PeripheralToMemory);
EDMA_SubmitTransfer(&DMA_CH1_Handle, &g_transferConfig);
/* Enable interrupt when transfer is done. */
EDMA_EnableChannelInterrupts(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, kEDMA_MajorInterruptEnable);
#if defined(FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT) && FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT
/* Enable async DMA request. */
EDMA_EnableAsyncRequest(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, true);
#endif /* FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT */
/* Enable transfer. */
EDMA_StartTransfer(&DMA_CH1_Handle);
}
/***********************************************************************************************************************
* ADC0 initialization code
**********************************************************************************************************************/
adc16_channel_config_t ADC0_channelsConfig[1] = {
{
.channelNumber = 1U,
.enableDifferentialConversion = false,
.enableInterruptOnConversionCompleted = false,
}
};
const adc16_config_t ADC0_config = {
.referenceVoltageSource = kADC16_ReferenceVoltageSourceVref,
.clockSource = kADC16_ClockSourceAsynchronousClock,
.enableAsynchronousClock = true,
.clockDivider = kADC16_ClockDivider8,
.resolution = kADC16_ResolutionSE16Bit,
.longSampleMode = kADC16_LongSampleDisabled,
.enableHighSpeed = false,
.enableLowPower = false,
.enableContinuousConversion = true
};
const adc16_channel_mux_mode_t ADC0_muxMode = kADC16_ChannelMuxA;
const adc16_hardware_average_mode_t ADC0_hardwareAverageMode = kADC16_HardwareAverageCount8;
void ADC0_init(void) {
/* Initialize ADC16 converter */
ADC16_Init(ADC0_PERIPHERAL, &ADC0_config);
/* Make sure, that software trigger is used */
ADC16_EnableHardwareTrigger(ADC0_PERIPHERAL, false);
/* Configure hardware average mode */
ADC16_SetHardwareAverage(ADC0_PERIPHERAL, ADC0_hardwareAverageMode);
/* Configure channel multiplexing mode */
ADC16_SetChannelMuxMode(ADC0_PERIPHERAL, ADC0_muxMode);
/* Initialize channel */
ADC16_SetChannelConfig(ADC0_PERIPHERAL, 0U, &ADC0_channelsConfig[0]);
/* Enable DMA. */
ADC16_EnableDMA(ADC0_PERIPHERAL, true);
}
/***********************************************************************************************************************
* ADC1 initialization code
**********************************************************************************************************************/
adc16_channel_config_t ADC1_channelsConfig[1] = {
{
.channelNumber = 1U,
.enableDifferentialConversion = true,
.enableInterruptOnConversionCompleted = false,
}
};
const adc16_config_t ADC1_config = {
.referenceVoltageSource = kADC16_ReferenceVoltageSourceVref,
.clockSource = kADC16_ClockSourceAsynchronousClock,
.enableAsynchronousClock = true,
.clockDivider = kADC16_ClockDivider8,
.resolution = kADC16_ResolutionSE16Bit,
.longSampleMode = kADC16_LongSampleDisabled,
.enableHighSpeed = false,
.enableLowPower = false,
.enableContinuousConversion = false
};
const adc16_channel_mux_mode_t ADC1_muxMode = kADC16_ChannelMuxA;
const adc16_hardware_average_mode_t ADC1_hardwareAverageMode = kADC16_HardwareAverageDisabled;
void ADC1_init(void) {
/* Initialize ADC16 converter */
ADC16_Init(ADC1_PERIPHERAL, &ADC1_config);
/* Make sure, that software trigger is used */
ADC16_EnableHardwareTrigger(ADC1_PERIPHERAL, false);
/* Configure hardware average mode */
ADC16_SetHardwareAverage(ADC1_PERIPHERAL, ADC1_hardwareAverageMode);
/* Configure channel multiplexing mode */
ADC16_SetChannelMuxMode(ADC1_PERIPHERAL, ADC1_muxMode);
/* Initialize channel */
ADC16_SetChannelConfig(ADC1_PERIPHERAL, 0U, &ADC1_channelsConfig[0]);
/* Enable DMA. */
ADC16_EnableDMA(ADC1_PERIPHERAL, true);
}
uint32_t ADC_Value = 0;
void DifferentialSample_DC(void)
{
while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(ADC0, 0)))
{
}
ADC_Value = ADC16_GetChannelConversionValue(ADC0, 0);
ADC_Value = ADC_Value*3000/4095;
}
/***********************************************************************************************************************
* Initialization functions
**********************************************************************************************************************/
void ADC_InitPeripherals(void)
{
/* Global initialization */
DMAMUX_Init(DMAMUX);
EDMA_Init(DMA_DMA_BASEADDR, &DMA_config);
EDMA_Configuration();
/* Initialize components */
ADC_DMA_init();
ADC0_init();
ADC1_init();
DifferentialSample_DC();
}
/***********************************************************************************************************************
* BOARD_InitBootPeripherals function
**********************************************************************************************************************/
void ADC_InitBootPeripherals(void)
{
ADC_InitPeripherals();
}
|
|