参考教材
https://blog.csdn.net/qq153471503/article/details/108123019
里面有轮询的代码
cube配置
使用DMA还要设置
相关代码
ADC-DMA方式
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);//ADC1的精度校准函数
//主函数主循环前要先校准
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC1_DMA_buff,8);
fval_adc1[0] = (float)(ADC1_DMA_buff[0])*3.3f/4096.0f;//ADC1的多通道数据转化
fval_adc1[1] = (float)(ADC1_DMA_buff[1])*3.3f/4096.0f;
fval_adc1[2] = (float)(ADC1_DMA_buff[2])*3.3f/4096.0f;
fval_adc1[3] = (float)(ADC1_DMA_buff[3])*3.3f/4096.0f;
fval_adc1[4] = (float)(ADC1_DMA_buff[4])*3.3f/4096.0f;
fval_adc1[5] = (float)(ADC1_DMA_buff[5])*3.3f/4096.0f;
fval_adc1[6] = (float)(ADC1_DMA_buff[6])*3.3f/4096.0f;
fval_adc1[7] = (float)(ADC1_DMA_buff[7])*3.3f/4096.0f;
len=sprintf(str,"adc1 = PA0:%4.2f, PA1:%4.2f, PA3:%4.2f, PB14:%4.2f, PC0:%4.2f, PC1:%4.2f, PC2:%4.2f, PC3:%4.2f\r\n",fval_adc1[0],fval_adc1[1],fval_adc1[2],fval_adc1[3],fval_adc1[4],fval_adc1[5],fval_adc1[6],fval_adc1[7]);
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)str, len);//多个DMA发送时,由于每个DMA发送搬运数据很快,若使用同一个数组存发送数据,就会出现还没发送完,下一个发送数据把正在发送的数据覆盖 要么延时 要么多个DMA发送分开数据存储
轮询方式
uint8_t read_adc_PD10(float *data){
// float ADC3_Value[2] ;
// uint16_t buf_out;
// for(int i=0 ; i<2 ; i++ )
// {
// buf_out = ADC_Read_adc3(ADC_CHANNEL_1);//ADC1的多个通道采集函数,需循环读取函数
// ADC3_Value[i] = (float)buf_out *3.3f/4096.0f;
// }
// *data = ADC3_Value[0];
float _fbuf[2];
HAL_ADC_Start_DMA(&hadc3,(uint32_t *)_ADC3_DMA_buff,2);
_fbuf[0] = (float)(_ADC3_DMA_buff[0])*3.3f/4096.0f;//ADC3的多通道数据转化 AD3-7
_fbuf[1] = (float)(_ADC3_DMA_buff[1])*3.3f/4096.0f;
*data = _fbuf[0];
return 0 ;
}
ADC中断产生采集完成标志
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
if(hadc == &hadc1)
{
adc1_flg=1;
}
if(hadc == &hadc2)
{
adc2_flg=1;
}
if(hadc == &hadc3)
{
adc3_flg=1;
}
if(hadc == &hadc4)
{
adc4_flg=1;
}
if(hadc == &hadc5)
{
adc5_flg=1;
}
}
ADC-UART普通发送方式看UART篇