中级会员
 
- 积分
- 236
- 金钱
- 236
- 注册时间
- 2021-6-19
- 在线时间
- 67 小时
|
6金钱
大家好!我在测试TIM2驱动ADC2采样,DMA传输时发现,当我设定的128大小的数组被填充完毕后,就不再更新。我设想的是当数组被填满后,继续开始从数组第0位填充更新数组。请问这种想法可以实现吗,具体要如何实现?谢谢各位大佬指教!
下面是我的具体配置
ADC2+DMA:
- ADC_HandleTypeDef hadc2;
- DMA_HandleTypeDef hdma_adc2;
- ADC_ChannelConfTypeDef hadc2_channel;
- void MY_ADC_Init(void)
- {
- __HAL_RCC_DMA2_CLK_ENABLE();
- HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
- hdma_adc2.Instance = DMA2_Stream2;
- hdma_adc2.Init.Channel = DMA_CHANNEL_1;
- hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;
- hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE; //???????
- hdma_adc2.Init.MemInc = DMA_MINC_ENABLE; //???????
- hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //??????:16?
- hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; //???????:16?
- hdma_adc2.Init.Mode = DMA_CIRCULAR; //???????
- hdma_adc2.Init.Priority = DMA_PRIORITY_LOW; //?????
- hdma_adc2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* ??FIFO*/
- HAL_DMA_Init(&hdma_adc2);
- __HAL_LINKDMA(&hadc2, DMA_Handle, hdma_adc2); //?DMA?ADC????
- hadc2.Instance = ADC2;
- hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4??,ADCCLK=PCLK2/4=108/4=27MHZ
- hadc2.Init.Resolution = ADC_RESOLUTION_12B; //12???
- hadc2.Init.ScanConvMode = DISABLE; //?????
- hadc2.Init.ContinuousConvMode = DISABLE; //??????
- hadc2.Init.DiscontinuousConvMode = DISABLE; //?????????
- hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; //??????
- hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T2_CC2; //????
- hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT; //???
- hadc2.Init.NbrOfConversion = 1; //1????????? ??????????1
- hadc2.Init.DMAContinuousRequests = ENABLE; //??DMA??
- hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
- HAL_ADC_Init(&hadc2);
- hadc2_channel.Channel = ADC_CHANNEL_3; //??
- hadc2_channel.Rank = 1; //??1
- hadc2_channel.SamplingTime = ADC_SAMPLETIME_480CYCLES; //????
- hadc2_channel.Offset = 0;
- HAL_ADC_ConfigChannel(&hadc2, &hadc2_channel); //????
- MY_TIM2_Init();
- HAL_ADC_Start_DMA(&hadc2, (uint32_t *)buffer, sizeof(buffer));
- }
- //void DMA2_Stream2_IRQHandler(void)
- //{
- // HAL_DMA_IRQHandler(&hdma_adc2);
- //}
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
- {
- printf("DMA transfer complete\r\n");
- }
- void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)
- {
- printf("DMA Half transfer complete\r\n");
- }
- void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
- {
- printf("DMA transfer error\r\n");
- }
复制代码 TIM2:
- TIM_HandleTypeDef htim2;
- TIM_OC_InitTypeDef TIM2_CH2Handler;
- void MY_TIM2_Init(void)
- {
- __HAL_RCC_TIM2_CLK_ENABLE();
-
- HAL_NVIC_SetPriority(TIM2_IRQn, 1, 3);
- HAL_NVIC_EnableIRQ(TIM2_IRQn);
- htim2.Instance = TIM2;
- htim2.Init.Prescaler = 10800-1;
- htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim2.Init.Period = 20000;
- htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- HAL_TIM_PWM_Init(&htim2);
- TIM2_CH2Handler.OCMode = TIM_OCMODE_PWM1;
- TIM2_CH2Handler.Pulse = 10000;
- TIM2_CH2Handler.OCPolarity = TIM_OCPOLARITY_LOW;
- TIM2_CH2Handler.OCFastMode = TIM_OCFAST_DISABLE;
- HAL_TIM_PWM_ConfigChannel(&htim2, &TIM2_CH2Handler, TIM_CHANNEL_2) ;
- __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);
- TIM_CCxChannelCmd(htim2.Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
- __HAL_TIM_ENABLE(&htim2);
- }
- void TIM2_IRQHandler(void)
- {
- HAL_TIM_IRQHandler(&htim2);
- }
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- if (htim == (&htim2))
- {
- printf("timer irq\r\n");
- }
- }
- void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- __HAL_RCC_TIM2_CLK_ENABLE();
- __HAL_RCC_GPIOA_CLK_ENABLE();
- GPIO_InitStruct.Pin = GPIO_PIN_1;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- }
复制代码 main.c
- extern uint16_t buffer[128];
- void show()
- {
- int i;
- printf("\r\ndata:");
- for (i = 0; i < 128; i++)
- {
- if (i % 16 == 0) printf("\r\n");
- printf("%6d", buffer[i]);
- //buffer[i]=0;
- }
- printf("\r\n");
- }
- int main
- {
- MY_ADC_Init();
- }
复制代码
|
|