ST意法半导体
直播中

熊本熊

9年用户 1492经验值
擅长:处理器/DSP
私信 关注
[问答]

Nucleo-h745ziq板上的DMA停止更新数据怎么解决

我在 Nucleo-h745ziq 板上工作。我启用了 ADC ch3 和 12 位分辨率,启用了 DMA 和循环模式。我将 3v 电源连接到 ADC 通道。但是当我重置板时我没有得到更新值我得到更新值,当我禁用缓存时我得到更新值。下面是我完成的设置。你能帮我解决这个问题吗?
uint8_t 标志;
__attribute__((section(".buffer"),used)) uint32_t ADCbUFF[1];
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{

        标志=1;        

}

MX_GPIO_Init();
MX_USART3_UART_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_SPI1_Init();
/* 用户代码开始 2 */
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADCbUFF, 1);

/* 用户代码结束 2 */

/* 无限循环 */
/* 用户代码开始时 */
而 (1)
{
  /* 用户代码结束 */

  /* 用户代码开始 3 */
         如果(标志==1)
                                    {
                                            printf("ADC值=%ldnr",ADCbUFF[0]);
                                            标志=0;
                                            HAL_延迟(2000);
                                    }

}


静态无效 MX_ADC1_Init(无效)
{

/* 用户代码开始 ADC1_Init 0 */

/* 用户代码结束 ADC1_Init 0 */

ADC_MultiModeTypeDef 多模 = {0};

/* 用户代码开始 ADC1_Init 1 */

/* 用户代码结束 ADC1_Init 1 */
/** 通用配置
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = 禁用;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = 禁用;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.OversamplingMode = ENABLE;
如果(HAL_ADC_Init(&hadc1)!= HAL_OK)
{
  错误处理程序();
}
/** 配置ADC多模式
*/
multimode.Mode = ADC_MODE_INDEPENDENT;
如果 (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
  错误处理程序();
}
/* 用户代码开始 ADC1_Init 2 */

/* 用户代码结束 ADC1_Init 2 */

}

void SystemClock_Config(无效)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** 提供配置更新使能
*/
HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);
/** 配置主内部稳压器输出电压
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

同时(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)){}
/** 配置PLL时钟源的宏
*/
__HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
/** 根据指定的参数初始化 RCC 振荡器
* 在 RCC_OscInitTypeDef 结构中。
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 120;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 32;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
如果 (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
  错误处理程序();
}
/** 初始化 CPU、AHB 和 APB 总线时钟
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

如果 (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
  错误处理程序();
}
}

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
如果(hadc->实例==ADC1)
{
/* 用户代码开始 ADC1_MspInit 0 */

/* 用户代码结束 ADC1_MspInit 0 */
/** 初始化外设时钟
*/
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInitStruct.PLL2.PLL2M = 2;
  PeriphClkInitStruct.PLL2.PLL2N = 129;
  PeriphClkInitStruct.PLL2.PLL2P = 18;
  PeriphClkInitStruct.PLL2.PLL2Q = 2;
  PeriphClkInitStruct.PLL2.PLL2R = 2;
  PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
  PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
  PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
  PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
  如果(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)!= HAL_OK)
  {
   错误处理程序();
  }

  /* 外设时钟使能 */
  __HAL_RCC_ADC12_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();
  /**ADC1 GPIO 配置
  PA6 ------> ADC1_INP3
  */
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* ADC1 DMA 初始化 */
  /* ADC1 初始化 */
  hdma_adc1.Instance = DMA1_Stream0;
  hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
  hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  hdma_adc1.Init.Mode = DMA_CIRCULAR;
  hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
  hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  如果(HAL_DMA_Init(&hdma_adc1)!= HAL_OK)
  {
   错误处理程序();
  }

  __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

  /* ADC1 中断初始化 */
  HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(ADC_IRQn);
/* 用户代码开始 ADC1_MspInit 1 */

/* 用户代码结束 ADC1_MspInit 1 */
}

}


更多回帖

发帖
×
20
完善资料,
赚取积分