STM32基于LL库——DMA传输双路ADC数据
STM32基于LL库——DMA传输双路ADC数据(ch3-ch4两通道)
·
STM32CubeMX配置(CH3-CH4)
- ADC配置

- DMA配置

添加代码
- 存放ADC输出的数组
uint16_t ADC_ConvertedValue[2]={0,0};
- ADC开始转换
void ADC_DMA_Config_Start(void)
{
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 2);
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
LL_ADC_Enable(ADC1);
LL_ADC_StartCalibration(ADC1);
while(LL_ADC_IsCalibrationOnGoing(ADC1));
LL_ADC_REG_StartConversionSWStart(ADC1);
LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);
}
- 主函数
(串口自己配置)
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("STM32CubeMX Test...\r\n");
ADC_DMA_Config_Start();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("ADC->CH1 Value:%lf\r\n",(float)ADC_ConvertedValue[0]*3.3/4095);
printf("ADC->CH2 Value:%lf\r\n",(float)ADC_ConvertedValue[1]*3.3/4095);
LL_mDelay(500);
}
标准库
void adc(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1,ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_239Cycles5);//通道一转换结果保存到ADCConvertedValue[0~10][0]
ADC_RegularChannelConfig(ADC1,ADC_Channel_9,2,ADC_SampleTime_239Cycles5);//通道二转换结果保存到ADCConvertedValue[0~10][1]
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
void dma(void)
{
DMA_InitTypeDef DMA_InitTypeStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1); //将通道一寄存器设为默认值
DMA_InitTypeStruct.DMA_DIR=DMA_DIR_PeripheralSRC;//ADC寄存器到数据
DMA_InitTypeStruct.DMA_BufferSize=2;
DMA_InitTypeStruct.DMA_M2M=DMA_M2M_Disable;
DMA_InitTypeStruct.DMA_MemoryBaseAddr=(uint32_t)&ADCConvertedValue;
DMA_InitTypeStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitTypeStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitTypeStruct.DMA_Mode=DMA_Mode_Circular;
DMA_InitTypeStruct.DMA_PeripheralBaseAddr=(uint32_t)&(ADC1->DR);//0x4001244C;
DMA_InitTypeStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
DMA_InitTypeStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitTypeStruct.DMA_Priority=DMA_Priority_Medium;
DMA_Init(DMA1_Channel1, &DMA_InitTypeStruct);
DMA_Cmd(DMA1_Channel1, ENABLE);
}
void ADC_Config(void)
{
dma();
adc();
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)