中级会员
- 积分
- 479
- 金钱
- 479
- 注册时间
- 2019-12-6
- 在线时间
- 149 小时
|
10金钱
我想用HAL库配置ADC三个通道采集 +DMA方式 转换后的结果保存到自己定义的一个数组里 可是读出去的数据全是0 我把ADC的三个通道引脚分别连到3.3 V 0V 2.5V电源管脚上 是不是哪里配置错 百度也没有HAL库配置ADC多通道采集的教程 弄了几天了还是没数据收到 求指教一下 以下是代码 main很简单就是 输出三个数组单元的值
#include "adc.h"
#include "sys.h"
#include "dma.h"
extern u32 ADC1ConvertedVoltage[3]; //dma传输的数据保存到该数组里
ADC_HandleTypeDef ADC_Handler;
DMA_HandleTypeDef DMA_Handler; //DMA句柄 //DMA2时钟使能
void MY_ADC_Init(void)
{
ADC_Handler.Instance=ADC1;
ADC_Handler.Init.BoostMode=ENABLE;
ADC_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //AHB时钟四分频 200m/4=50m(已超频 h743不影响实验)
ADC_Handler.Init.ContinuousConvMode=ENABLE; //开启连续模式
ADC_Handler.Init.ConversionDataManagement=ADC_CONVERSIONDATA_DR; //数据存放到DR寄存器里
ADC_Handler.Init.EOCSelection=ADC_EOC_SINGLE_CONV;
ADC_Handler.Init.ExternalTrigConv=ADC_EXTERNALTRIG_T1_CC1; //外部触发方式 ADC_EXTERNALTRIG_T1_CC1
ADC_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE; //外部触发边沿
ADC_Handler.Init.LeftBitShift=DISABLE; //偏移量关闭
ADC_Handler.Init.LowPowerAutoWait=DISABLE; //低功耗模式关闭
ADC_Handler.Init.NbrOfConversion=3; //规则序列中有多少个转换 3
ADC_Handler.Init.DiscontinuousConvMode=DISABLE; ////不连续采样模式 DISABLE
ADC_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数 0
ADC_Handler.Init.Overrun=ADC_OVR_DATA_OVERWRITTEN;
ADC_Handler.Init.OversamplingMode=DISABLE;
ADC_Handler.Init.Resolution=ADC_RESOLUTION_16B; //分辨率 12/10/8/6 位
ADC_Handler.Init.ScanConvMode=ENABLE; //开启扫描模式
HAL_ADC_Init(&ADC_Handler);
ADC_RegularChannelConfig(&ADC_Handler, ADC_CHANNEL_3, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_64CYCLES_5); //pa6 ADC12通道3
ADC_RegularChannelConfig(&ADC_Handler, ADC_CHANNEL_7, ADC_REGULAR_RANK_2, ADC_SAMPLETIME_64CYCLES_5); //pa7 ADC12通道7
ADC_RegularChannelConfig(&ADC_Handler, ADC_CHANNEL_14, ADC_REGULAR_RANK_3, ADC_SAMPLETIME_64CYCLES_5); //pa2 ADC12通道14
my_dma_Init(); //调用dma初始化
HAL_ADC_Start_DMA(&ADC_Handler, (u32*)&ADC1ConvertedVoltage, 3); //开始传输 传输的数据保存到ADC1ConvertedVoltage数组中
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_ADC12_CLK_ENABLE(); //开启ADC12时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP); //ADC外设时钟选择
GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_2; //PA2,PA6,PA7 ()
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟输入
GPIO_Initure.Pull=GPIO_NOPULL; //无上下拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
HAL_ADCEx_Calibration_Start(&ADC_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC 校准
}
//规则通道组设置
void ADC_RegularChannelConfig(ADC_HandleTypeDef *AdcHandle, uint32_t Channel, uint32_t Rank, uint32_t SamplingTime)
{
ADC_ChannelConfTypeDef ADC_ChannelConfig;
ADC_ChannelConfig.Channel=Channel; //通道选择
ADC_ChannelConfig.Offset=0; //注入通道
ADC_ChannelConfig.SamplingTime=SamplingTime; //采样时间
ADC_ChannelConfig.Rank=Rank; //序列号选择
ADC_ChannelConfig.SingleDiff=ADC_SINGLE_ENDED;
ADC_ChannelConfig.OffsetSignedSaturation=DISABLE;
ADC_ChannelConfig.OffsetNumber=0;
ADC_ChannelConfig.OffsetRightShift= DISABLE;
HAL_ADC_ConfigChannel(&ADC_Handler, &ADC_ChannelConfig); //adc通道配置
HAL_ADC_Start(&ADC_Handler); //开始转换
HAL_ADC_PollForConversion(&ADC_Handler, 10); //等待转换结束
}
//下面是DMA的设置
//DMAx的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
void my_dma_Init(void)
{
__HAL_RCC_DMA2_CLK_ENABLE(); //DMA2时钟使能
__HAL_LINKDMA(&ADC_Handler,DMA_Handle,DMA_Handler); //将DMA与ADC联系起来(发送DMA)
DMA_Handler.Instance=DMA2_Stream1; //DMA2_Stream1对应ADC1
DMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY; //外设到存储器
DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
DMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
DMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
DMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
DMA_Handler.Init.Mode=DMA_NORMAL; //普通模式
DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
DMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
DMA_Handler.Init.Request=DMA_REQUEST_ADC1; //ADC1发送DMA
HAL_DMA_DeInit(&DMA_Handler);
HAL_DMA_Init(&DMA_Handler);
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); //使能DMA2_Stream7_IRQn中断通道
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn,0,0); //抢占优先级0,子优先级0
}
//中断通用处理函数
void DMA2_Stream7_IRQHandler(void)
{
HAL_DMA_GetState(&DMA_Handler);
HAL_DMA_IRQHandler(&DMA_Handler);
}
|
|