信号发生器产生一个个正弦波,峰峰值3.3V,幅度在0-3V,频率50Hz,用ADC采样500个数据。
使用DMA每次读取10个数据,产生一次请求,打印出来,总共循环50次
1、 首先将PTB2配置为模拟输入(其实可以不用PORT_SetPinMux配置,ptb2默认功能就是adc) PORT_SetPinMux(PORTB, 2U,kPORT_PinDisabledOrAnalog); 2、 配置dmamux,设置源为40,即ADC0,使能ADC DMAMUX_Init(DMAMUX0); DMAMUX_SetSource(DMAMUX0,DMAMUXCHANNEL,DMAMUXSOURCE); DMAMUX_EnableChannel(DMAMUX0,DMAMUXCHANNEL); 3、 edma配置 EDMA_GetDefaultConfig(&edma_config); EDMA_Init(DMA0,&edma_config); EDMA_CreateHandle(&edma_handle,DMA0,DMAMUXCHANNEL); EDMA_SetCallback(&edma_handle,edma0_callback,NULL); EDMA_PrepareTransfer(&transfer_config, (void*)ADC16_RESULT_REG_ADDR,sizeof(uint32_t), (void*)adc_array,sizeof(uint32_t),sizeof(uint32_t), sizeof(adc_array),kEDMA_PeripheralToMemory); EDMA_SubmitTransfer(&edma_handle,&transfer_config); EDMA_EnableChannelInterrupts(DMA0,0U,kEDMA_MajorInterruptEnable); EDMA_StartTransfer(&edma_handle); 获取默认配置,分局配置初始化edma,为通道0创建一个edma句柄,设置回调函数。 设置传输配置,从ADC16_RESULT_REG_ADDR处读取数据,数据宽度uint32_t,传输到adc_array这个位置,数据宽度uint32_t,每次请求发送sizeof(uint32_t)字节,总共发送sizeof(adc_array)这么多字节。发送类型为从外设到内存。使能通道,开始传输。 定义回调函数 static void edma0_callback(edma_handle_t*handle, void *userData, bool transferDone, uint32_t tcds) { EDMA_ClearChannelStatusFlags(DMA0,0U,kEDMA_InterruptFlag); EDMA_PrepareTransfer(&transfer_config, (void*)ADC16_RESULT_REG_ADDR,sizeof(uint32_t), (void*)adc_array,sizeof(uint32_t),sizeof(uint32_t), sizeof(adc_array),kEDMA_PeripheralToMemory); EDMA_SetTransferConfig(DMA0, DMAMUXCHANNEL, &transfer_config, NULL); /* Enable transfer. */ EDMA_StartTransfer(&edma_handle); g_Transfer_Done= true; } 将dma中断标志清除,然后开始准备下一次传输。 4、 adc配置 ADC16_GetDefaultConfig(config1); config1->enableContinuousConversion= true; ADC16_Init(ADC_DEMO,config1); ADC16_EnableHardwareTrigger(ADC_DEMO,false); if(ADC16_DoAutoCalibration(ADC_DEMO) ==kStatus_Success) { PRINTF("calibrationsuccessful\r\n"); } ADC16_EnableDMA(ADC0,true); 获取adc默认配置,adc精度12bit,初始化,硬件触发禁用。做校准后,使能ADC dma通道。 配置adc通道 channel_config.channelNumber = 12U; channel_config.enableDifferentialConversion = false; channel_config.enableInterruptOnConversionCompleted = false; ADC16_SetChannelConfig(ADC0, ADC_DEMO_GROUP, &channel_config); PTB2是adc0的通道12。禁用差分转换,禁用通道转换完成中断。 结果如下图
excel点图
|