|
这是ADC.c的源码,看看有没有配置错误,定时器3触发ADC采样,我想用3MHz采样率采集信号,可是上不去。
#include "adc.h"
#include "dma.h"
ALIGN_32BYTES (__attribute__ ((at(0x24000000))) __IO uint16_t ADC_ConvertedValue = 0);
extern float ADC_vol;
ADC_HandleTypeDef ADC1_Handle;
ADC_HandleTypeDef ADC2_Handle;
DMA_HandleTypeDef hdma_adc;
ADC_MultiModeTypeDef ADC_multimode;
static void ADC_GPIO_Mode_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__GPIOB_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = GPIO_PIN_1;
/* 配置为模拟输入,不需要上拉电阻 */
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
static void ADC_Mode_Config(void)
{
ADC_ChannelConfTypeDef ADC_Config;
// RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
// /* 配置ADC3时钟源 */
// /* HSE Frequency(Hz) = 25000000 */
// /* PLL_M = 5 */
// /* PLL_N = 160 */
// /* PLL_P = 25 */
// /* PLL_Q = 2 */
// /* PLL_R = 2 */
// /* ADC_ker_clk = 32000000 */
// RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
// RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;
// RCC_PeriphClkInit.PLL2.PLL2M = 5;
// RCC_PeriphClkInit.PLL2.PLL2N = 180;
// RCC_PeriphClkInit.PLL2.PLL2P = 8;
// RCC_PeriphClkInit.PLL2.PLL2Q = 2;
// RCC_PeriphClkInit.PLL2.PLL2R = 2;
// RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
// RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
// RCC_PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
// HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
//
__HAL_RCC_ADC12_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
//选择DMA1的Stream1
hdma_adc.Instance = DMA1_Stream0;
//ADC1的DMA请求
hdma_adc.Init.Request = DMA_REQUEST_ADC1;
//传输方向:外设-》内存
hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
//外设地址不自增
hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
//内存地址不自增
hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
//外设数据宽度:半字
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
//内存数据宽度:半字
hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
//DMA循环传输
hdma_adc.Init.Mode = DMA_CIRCULAR;
//DMA的软件优先级:低
hdma_adc.Init.Priority = DMA_PRIORITY_LOW;
//FIFO模式关闭
hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
//DMA初始化
HAL_DMA_Init(&hdma_adc);
//hdma_adc和ADC_Handle.DMA_Handle链接
__HAL_LINKDMA(&ADC1_Handle,DMA_Handle,hdma_adc);
ADC1_Handle.Instance = ADC1;
//使能Boost模式
ADC1_Handle.Init.BoostMode = ENABLE;
//ADC时钟1分频
// ADC1_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
ADC1_Handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
//使能连续转换模式
ADC1_Handle.Init.ContinuousConvMode = DISABLE;
//数据存放在数据寄存器中
ADC1_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
//关闭不连续转换模式
ADC1_Handle.Init.DiscontinuousConvMode = DISABLE;
ADC1_Handle.Init.NbrOfConversion = 1; /* 使用了1个转换通道 */
//单次转换
ADC1_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
ADC1_Handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;
ADC1_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
// ADC1_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
// ADC1_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
//关闭低功耗自动等待
ADC1_Handle.Init.LowPowerAutoWait = DISABLE;
//数据溢出时,覆盖写入
ADC1_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
//不使能过采样模式
ADC1_Handle.Init.OversamplingMode = DISABLE;
//分辨率为:12bit
ADC1_Handle.Init.Resolution = ADC_RESOLUTION_12B;
//不使能多通道扫描
ADC1_Handle.Init.ScanConvMode = DISABLE;
//初始化 ADC_MASTER
HAL_ADC_Init(&ADC1_Handle);
/* 校准ADC,采用偏移校准 */
HAL_ADCEx_Calibration_Start(&ADC1_Handle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
ADC_Config.Channel = ADC_CHANNEL_5;
//转换顺序为1
ADC_Config.Rank = ADC_REGULAR_RANK_1;
ADC_Config.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
//不使用差分输入的功能
ADC_Config.SingleDiff = ADC_SINGLE_ENDED ;
ADC_Config.OffsetNumber = ADC_OFFSET_NONE; /* 无偏移 */
ADC_Config.Offset = 0; /* 无偏移的情况下,此参数忽略 */
HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config);
//使能ADC1
ADC_Enable(&ADC1_Handle);
//使能DMA,此函数会开启DMA中断,需要用户自行配置DMA中断优先级
HAL_ADC_Start_DMA(&ADC1_Handle, (uint32_t*)&ADC_ConvertedValue, 1);
}
void Rheostat_DMA_NVIC_Config(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
}
void ADC_Init(void)
{
ADC_GPIO_Mode_Config();
ADC_Mode_Config();
Rheostat_DMA_NVIC_Config();
HAL_ADC_Start(&ADC1_Handle);
}
|
|