VID_20250903_090400
ADC两个通道采集电压,一路AIN0采集外部电位器,一路采集内部温度,并使用DMAC转运

添加 stack ADC-DMAC

配置扫描通道

设置ADC转换完成为DMAC触发源
设置中断回调函数
volatile int dmac_complete_flag = 0;
uint16_t adc_buffer[2];
void ADC_DMA_Init(void)
{
fsp_err_t err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(err == FSP_SUCCESS);
err = R_ADC_ScanCfg(&g_adc0_ctrl,&g_adc0_channel_cfg);
assert(err == FSP_SUCCESS);
g_transfer1_cfg.p_info->p_dest = adc_buffer;
err = R_DMAC_Open(&g_transfer1_ctrl,&g_transfer1_cfg);
assert(err == FSP_SUCCESS);
err = R_DMAC_Enable(&g_transfer1_ctrl);
assert(err == FSP_SUCCESS);
}
void g_transfer1_callback(transfer_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
dmac_complete_flag = 1;
}
测试代码
void ADC_DMA_Test(void)
{
fsp_err_t err;
adc_info_t adc_info;
err = R_ADC_ScanStart(&g_adc0_ctrl);
assert(err == FSP_SUCCESS);
while(!dmac_complete_flag);
dmac_complete_flag = 0;
err = R_DMAC_Reconfigure(&g_transfer1_ctrl,g_transfer1_cfg.p_info);
assert(err == FSP_SUCCESS);
err = R_ADC_InfoGet(&g_adc0_ctrl, &adc_info);
assert(err == FSP_SUCCESS);
float V = (3.3 * (float)adc_buffer[0]) / 4096 ;
printf("电位器采集电压:%.2f\n\r",V);
float V1 = (3.3 * (float)adc_info.calibration_data) / 4096 ;
float Vs = (3.3 * (float)adc_buffer[1] ) / 4096 ;
float temperature = ( Vs - V1 ) / ( 4.0/1000 ) + 127.0f;
printf("芯片内部温度%.2f\n\r",temperature);
}
|