|
本帖最后由 sofia 于 2024-9-9 20:22 编辑
用定时器3 TIM_TRGO_UPDATE触发ADC1转换,DMA转存,无赖小弟搞了一个星期还是不通进不去DMA中断服务函数,求大神点拨下,谢谢。初始代码如下:
void TIM3_Config(void)
{
__HAL_RCC_TIM3_CLK_ENABLE(); /* 使能TIMx时钟 */
g_timx_handle.Instance = TIM3; /* 通用定时器x */
g_timx_handle.Init.Prescaler = 23999; /* 预分频系数 */
g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_timx_handle.Init.Period = 0; /* 自动装载值 */
g_timx_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
g_timx_handle.Init.ClockDivision = TIM_CLOCKPRESCALER_DIV1;
HAL_TIM_Base_Init(&g_timx_handle);
g_timx_master_config.MasterOutputTrigger = TIM_TRGO_UPDATE;
g_timx_master_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&g_timx_handle, &g_timx_master_config);
__HAL_TIM_ENABLE(&g_timx_handle);
HAL_TIM_Base_Start(&g_timx_handle);
}
void adc_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
ADC_ChannelConfTypeDef adc_ch_conf = {0};
ADC_HandleTypeDef g_adc_handle;
DMA_HandleTypeDef g_dma_adc_handle;
ADC_HandleTypeDef g_adc_dma_handle;
//ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* ????ADC???IO??????? */
ADC_ADC1_CH3_GPIO_CLK_ENABLE();
__HAL_RCC_ADC12_CLK_ENABLE(); /* ???ADC1/2??? */
__HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1?????? */
__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP); /* ADC?????????? */
gpio_init_struct.Pin = GPIO_PIN_7|GPIO_PIN_6; /* ADC???IO???? */
//gpio_init_struct.Pin = ADC_ADC1_CH3P_GPIO;
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* ??? */
gpio_init_struct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
#if 1
gpio_init_struct.Pin = ADC_ADC2_CH4N_GPIO|ADC_ADC2_CH4P_GPIO; /* ADC???IO???? */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* ??? */
gpio_init_struct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ADC_ADC2_CH4_GPIO_PORT, &gpio_init_struct);
#endif
/* ?????DMA */
g_dma_adc_handle.Instance = DMA1_Stream7; /* ???DMA1 Stream7 */
g_dma_adc_handle.Init.Request = DMA_REQUEST_ADC1; /* ???????DMA_REQUEST_ADC1 */
g_dma_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* ?????赽?洢???? */
g_dma_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* ??????????? */
g_dma_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* ?洢???????? */
g_dma_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* ???????????:16λ */
g_dma_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* ?洢?????????:16λ */
g_dma_adc_handle.Init.Mode = DMA_CIRCULAR;// | DMA_SxCR_DBM; /* ????????????????????? */
//g_dma_adc_handle.Init.Mode = DMA_NORMAL;
g_dma_adc_handle.Init.Priority = DMA_PRIORITY_HIGH; /* ?е?????? */
g_dma_adc_handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* ???FIFO*/
g_dma_adc_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
g_dma_adc_handle.Init.MemBurst = DMA_MBURST_SINGLE;
g_dma_adc_handle.Init.PeriphBurst = DMA_PBURST_SINGLE;
HAL_DMA_Init(&g_dma_adc_handle); /* ?????DMA */
HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 1, 1);
HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn);
__HAL_LINKDMA(&g_adc_dma_handle, DMA_Handle, g_dma_adc_handle); /* ??DMA?????ADC??????????? */
/* ?????ADC1 */
g_adc_dma_handle.Instance = ADC1; /* ??????ADC */
g_adc_dma_handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; /* ???????2???,??adc_ker_ck=per_ck/2=32Mhz */
g_adc_dma_handle.Init.Resolution = ADC_RESOLUTION_16B; /* 16λ?? */
g_adc_dma_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* ???????????????????? */
// g_adc_dma_handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* ???EOC?ж? */
g_adc_dma_handle.Init.EOCSelection = DISABLE;
g_adc_dma_handle.Init.LowPowerAutoWait = DISABLE; /* ?????????? */
g_adc_dma_handle.Init.ContinuousConvMode = DISABLE; /* ???????????? */
g_adc_dma_handle.Init.NbrOfConversion = 1; /* ?????Χ??1~16??????????1????? */
g_adc_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* ???????????鲻?????????? */
g_adc_dma_handle.Init.NbrOfDiscConversion = 1; /* ???ò???????????????????????????????鲻????????????????????? */
g_adc_dma_handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;//
g_adc_dma_handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;//
g_adc_dma_handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; /* DMA???δ???ADC???? */
g_adc_dma_handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* ???μ?????????????????? */
g_adc_dma_handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; /* ????ADC????????????λ?? */
g_adc_dma_handle.Init.OversamplingMode = DISABLE; /* ????????? */
HAL_ADC_Init(&g_adc_dma_handle); /* ????? */
HAL_ADCEx_Calibration_Start(&g_adc_dma_handle, ADC_CALIB_OFFSET, ADC_DIFFERENTIAL_ENDED); /* ADCУ? */
adc_ch_conf.Channel = ADC_CHANNEL_3; /* ????????ADC??? */
adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* ????????????1?? */
adc_ch_conf.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; /* ?????????810.5????????? */
adc_ch_conf.SingleDiff = ADC_DIFFERENTIAL_ENDED;//??????? ADC_SINGLE_ENDED ;/* ???????? */
adc_ch_conf.OffsetNumber = ADC_OFFSET_NONE; /* ????? */
adc_ch_conf.Offset = 0; /* ??????????£?????????? */
adc_ch_conf.OffsetRightShift = DISABLE; /* ??????? */
adc_ch_conf.OffsetSignedSaturation = DISABLE; /* ????з?????? */
HAL_ADC_ConfigChannel(&g_adc_dma_handle, &adc_ch_conf); /* ????ADC??? */
TIM3_Config();
HAL_ADC_Start_DMA(&g_adc_dma_handle, &ADCxValues, 128); /* ????ADC?????DMA?????? */
}
void DMA1_Stream7_IRQHandler(void)
{
if((DMA1->HISR & DMA_FLAG_TCIF3_7) != RESET)
{
s_DmaFlag = 2;
DMA1->HIFCR = DMA_FLAG_TCIF3_7;
}
if((DMA1->HISR & DMA_FLAG_HTIF3_7) != RESET)
{
s_DmaFlag = 1;
DMA1->HIFCR = DMA_FLAG_HTIF3_7;
}
}
}
|
|