STM32HAL库 ADC结构体应避免直接拷贝赋值

本文介绍了在STM32中初始化ADC时遇到的问题,即直接复制已初始化的ADC结构体给另一个ADC导致初始化失败。解决办法是将结构体赋值操作放在初始化之前,或者避免直接复制,而是逐个设置每个ADC的配置参数。内容详细展示了针对ADC1和ADC2的初始化步骤,包括通道配置和校准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 对ADC1的结构体AdcHandle1赋值并初始化后,想要继续初始化ADC2的AdcHandle2,想着大部分是一样的,可以直接拷贝AdcHandle1,也就是

AdcHandle2 = AdcHandle1;

 但ADC2却不起作用,经过一番debug,发现不能在AdcHandle1初始化后使用AdcHandle1赋值AdcHandle2,应该是初始化ADC1的代码部分对AdcHandle1的某些成员进行了修改。

可以将

AdcHandle2 = AdcHandle1;

放到赋值完 AdcHandle1并在初始化ADC1的函数HAL_ADC_Init()之前。

安全和规范起见,也可以像cubeMX生成的代码一样,每一个外设的结构体都按规范全部重写一遍。不使用结构体直接赋值的方式。

static void MX_ADC_Init(void)
{
	ADC_ChannelConfTypeDef 		sConfig;

	/*----------------------------ADC1-------------------------------*/
	AdcHandle1.Instance = ADC1;
	AdcHandle1.Init.ScanConvMode = ENABLE;
	AdcHandle1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  AdcHandle1.Init.NbrOfConversion = 4;
	AdcHandle1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONVHRTIM_TRG1;
	AdcHandle1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
	AdcHandle1.Init.DMAContinuousRequests = ENABLE;
  AdcHandle2 = AdcHandle1;
	if (HAL_ADC_Init(&AdcHandle1) != HAL_OK){Error_Handler();}

  //-------------------------ADC1通道配置----------------------------- 通道1、2、3、4
	sConfig.Channel = ADC_CHANNEL_1;
	sConfig.Rank = ADC_REGULAR_RANK_1;
	sConfig.SamplingTime = ADC_SAMPLETIME_4CYCLES_5;		//采样时间加长
	sConfig.SingleDiff = ADC_SINGLE_ENDED;
	sConfig.OffsetNumber = ADC_OFFSET_NONE;
	sConfig.Offset = 0;
	if (HAL_ADC_ConfigChannel(&AdcHandle1, &sConfig) != HAL_OK){Error_Handler();}

	sConfig.Channel = ADC_CHANNEL_2;
	sConfig.Rank = ADC_REGULAR_RANK_2;
	if (HAL_ADC_ConfigChannel(&AdcHandle1, &sConfig) != HAL_OK){Error_Handler();}

	sConfig.Channel = ADC_CHANNEL_3;
	sConfig.Rank = ADC_REGULAR_RANK_3;
	if (HAL_ADC_ConfigChannel(&AdcHandle1, &sConfig) != HAL_OK){Error_Handler();}

	sConfig.Channel = ADC_CHANNEL_4;
	sConfig.Rank = ADC_REGULAR_RANK_4;
	if (HAL_ADC_ConfigChannel(&AdcHandle1, &sConfig) != HAL_OK){Error_Handler();}

	if (HAL_ADCEx_Calibration_Start(&AdcHandle1, ADC_SINGLE_ENDED) != HAL_OK){Error_Handler();}
	if (HAL_ADC_Start_DMA(&AdcHandle1, (uint32_t *)&ADC1_Value, 4) != HAL_OK){Error_Handler();}


  /*----------------------------ADC2-------------------------------*/
	AdcHandle2.Instance = ADC2;
  AdcHandle2.Init.NbrOfConversion = 4;

  // AdcHandle2.Instance = ADC2;
	// AdcHandle2.Init.ScanConvMode = ENABLE;                      //ADC_SCAN_ENABLE	/* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
	// AdcHandle2.Init.EOCSelection = ADC_EOC_SEQ_CONV;				//ADC_ISR_EOS
  // AdcHandle2.Init.NbrOfConversion = 4;						//转换通道
	// AdcHandle2.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONVHRTIM_TRG1;		/* Software start to trig the 1st conversion manually, without external event */
	// AdcHandle2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
	// AdcHandle2.Init.DMAContinuousRequests = ENABLE;

  
	if (HAL_ADC_Init(&AdcHandle2) != HAL_OK) { Error_Handler(); }

	sConfig.Channel = ADC_CHANNEL_1;
	sConfig.Rank = ADC_REGULAR_RANK_1;
	if (HAL_ADC_ConfigChannel(&AdcHandle2, &sConfig) != HAL_OK) { Error_Handler(); }

	sConfig.Channel = ADC_CHANNEL_8;
	sConfig.Rank = ADC_REGULAR_RANK_2;
	if (HAL_ADC_ConfigChannel(&AdcHandle2, &sConfig) != HAL_OK) { Error_Handler(); }

  sConfig.Channel = ADC_CHANNEL_9;
	sConfig.Rank = ADC_REGULAR_RANK_3;
	if (HAL_ADC_ConfigChannel(&AdcHandle2, &sConfig) != HAL_OK) { Error_Handler(); }

	sConfig.Channel = ADC_CHANNEL_12;
	sConfig.Rank = ADC_REGULAR_RANK_4;
	if (HAL_ADC_ConfigChannel(&AdcHandle2, &sConfig) != HAL_OK) { Error_Handler(); }

	if (HAL_ADCEx_Calibration_Start(&AdcHandle2, ADC_SINGLE_ENDED) != HAL_OK) { Error_Handler(); }
	if (HAL_ADC_Start_DMA(&AdcHandle2, (uint32_t *)&ADC2_Value, 4) != HAL_OK) { Error_Handler(); }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值