Skip to main content
Jiajin
Associate
August 13, 2025
Question

Self-assignment warning bug

  • August 13, 2025
  • 2 replies
  • 373 views

This warning is occurring in the STM32U5xx HAL driver's low-level ADC header file (stm32u5xx_ll_adc.h). The warning indicates there's a self-assignment of a variable analog_wd_monit_channels where a variable is being assigned to itself.

 

STM32CubeMX/Target_1/STM32CubeMX/Drivers/STM32U5xx_HAL_Driver/Inc/stm32u5xx_ll_adc.h:6920:34: warning: explicitly assigning value of variable of type 'uint32_t' (aka 'unsigned int') to itself [-Wself-assign]
6920 | analog_wd_monit_channels = analog_wd_monit_channels;
| ~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

2 replies

Pavel A.
Super User
August 13, 2025

This usually occurs because of some kind of "unused parameter" macro, which in its turn exists to silence another warning. For example

#define UNUSED_PARAMETER(x) x = x

int junk(int p1, char p2)
{
 UNUSED_PARAMETER(p2);
 return p1;
}

So... decide which of the warnings you hate more, and disable the other.

 

Jiajin
JiajinAuthor
Associate
August 14, 2025

I don't seem to have found any unused macro definitions. Here is the code for the warning section.

/**
 * @brief Get ADC analog watchdog monitored channel.
 * @note Usage of the returned channel number:
 * - To reinject this channel into another function LL_ADC_xxx:
 * the returned channel number is only partly formatted on definition
 * of literals LL_ADC_CHANNEL_x. Therefore, it has to be compared
 * with parts of literals LL_ADC_CHANNEL_x or using
 * helper macro @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB().
 * Then the selected literal LL_ADC_CHANNEL_x can be used
 * as parameter for another function.
 * - To get the channel number in decimal format:
 * process the returned value with the helper macro
 * @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB().
 * Applicable only when the analog watchdog is set to monitor
 * one channel.
 * @note On this STM32 series, there are 2 kinds of analog watchdog
 * instance:
 * - AWD standard (instance AWD1):
 * - channels monitored: can monitor 1 channel or all channels.
 * - groups monitored: ADC groups regular and-or injected.
 * - resolution: resolution is not limited (corresponds to
 * ADC resolution configured).
 * - AWD flexible (instances AWD2, AWD3):
 * - channels monitored: flexible on channels monitored, selection is
 * channel wise, from from 1 to all channels.
 * Specificity of this analog watchdog: Multiple channels can
 * be selected. For example:
 * (LL_ADC_AWD_CHANNEL4_REG_INJ | LL_ADC_AWD_CHANNEL5_REG_INJ | ...)
 * - groups monitored: not selection possible (monitoring on both
 * groups regular and injected).
 * Channels selected are monitored on groups regular and injected:
 * LL_ADC_AWD_CHANNELxx_REG_INJ (do not use parameters
 * LL_ADC_AWD_CHANNELxx_REG and LL_ADC_AWD_CHANNELxx_INJ)
 * - resolution: resolution is limited to 8 bits: if ADC resolution is
 * 12 bits the 4 LSB are ignored, if ADC resolution is 10 bits
 * the 2 LSB are ignored.
 * @note On this STM32 series, setting of this feature is conditioned to
 * ADC state:
 * ADC must be disabled or enabled without conversion on going
 * on either groups regular or injected.
 * @rmtoll CFGR AWD1CH LL_ADC_GetAnalogWDMonitChannels\n
 * CFGR AWD1SGL LL_ADC_GetAnalogWDMonitChannels\n
 * CFGR AWD1EN LL_ADC_GetAnalogWDMonitChannels\n
 * CFGR JAWD1EN LL_ADC_GetAnalogWDMonitChannels\n
 * AWD2CR AWD2CH LL_ADC_GetAnalogWDMonitChannels\n
 * AWD3CR AWD3CH LL_ADC_GetAnalogWDMonitChannels
 * @PAram ADCx ADC instance
 * @PAram AWDy This parameter can be one of the following values:
 * @arg @ref LL_ADC_AWD1
 * @arg @ref LL_ADC_AWD2 (1)
 * @arg @ref LL_ADC_AWD3 (1)
 *
 * (1) On this AWD number, monitored channel can be retrieved
 * if only 1 channel is programmed (or none or all channels).
 * This function cannot retrieve monitored channel if
 * multiple channels are programmed simultaneously
 * by bitfield.
 * @retval Returned value can be one of the following values:
 * @arg @ref LL_ADC_AWD_DISABLE
 * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG (0)
 * @arg @ref LL_ADC_AWD_ALL_CHANNELS_INJ (0)
 * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_0_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_0_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_0_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_1_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_1_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_1_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_2_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_2_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_2_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_3_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_3_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_3_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_4_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_4_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_4_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_5_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_5_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_5_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_6_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_6_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_6_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_7_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_7_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_7_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_8_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_8_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_8_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_9_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_9_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_9_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_10_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_10_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_10_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_11_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_11_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_11_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_12_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_12_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_12_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_13_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_13_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_13_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_14_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_14_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_14_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_15_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_15_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_15_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_16_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_16_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_16_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_17_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_17_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_17_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_18_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_18_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_18_REG_INJ
 * @arg @ref LL_ADC_AWD_CHANNEL_19_REG (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_19_INJ (0)
 * @arg @ref LL_ADC_AWD_CHANNEL_19_REG_INJ
 *
 * (0) On STM32U5, parameter available only on analog watchdog number: AWD1.
 */
__STATIC_INLINE uint32_t LL_ADC_GetAnalogWDMonitChannels(const ADC_TypeDef *ADCx, uint32_t AWDy)
{
 const __IO uint32_t *preg;

 if (AWDy == LL_ADC_AWD1)
 {
 /* Set pointer to register of selected analog watchdog */
 preg = __ADC_PTR_REG_OFFSET(ADCx->CFGR1, 0UL);
 }
 else
 {
 /* Set pointer to register of selected analog watchdog */
 preg = __ADC_PTR_REG_OFFSET(ADCx->AWD2CR, ((AWDy & ADC_AWD_CRX_REGOFFSET_MASK)) \
 >> (ADC_AWD_CRX_REGOFFSET_POS + 1UL));
 }

 uint32_t analog_wd_monit_channels = (READ_BIT(*preg, AWDy) & AWDy & ADC_AWD_CR_ALL_CHANNEL_MASK);

 /* If "analog_wd_monit_channels" == 0, then the selected AWD is disabled */
 /* (parameter value LL_ADC_AWD_DISABLE). */
 /* Else, the selected AWD is enabled and is monitoring a group of channels */
 /* or a single channel. */
 if (analog_wd_monit_channels != 0UL)
 {
 if (AWDy == LL_ADC_AWD1)
 {
 if ((analog_wd_monit_channels & ADC_CFGR1_AWD1SGL) == 0UL)
 {
 /* AWD monitoring a group of channels */
 analog_wd_monit_channels = ((analog_wd_monit_channels | (0x000FFFFFUL)) & (~(ADC_CFGR1_AWD1CH)));
 }
 else
 {
 /* AWD monitoring a single channel */
 analog_wd_monit_channels = analog_wd_monit_channels;
 }
 }
 else
 {
 if (ADCx != ADC4)
 {
 if ((analog_wd_monit_channels & 0x000FFFFFUL) == 0x000FFFFFUL)
 {
 /* AWD monitoring a group of channels */
 analog_wd_monit_channels = (0x000FFFFFUL | ((ADC_CFGR1_JAWD1EN | ADC_CFGR1_AWD1EN)));
 }
 else
 {
 /* AWD monitoring a single channel */
 /* AWD monitoring a group of channels */
 analog_wd_monit_channels = ((ADC_CFGR1_JAWD1EN | ADC_CFGR1_AWD1EN | ADC_CFGR1_AWD1SGL)
 | (__LL_ADC_CHANNEL_TO_DECIMAL_NB(analog_wd_monit_channels) \
 << ADC_CFGR1_AWD1CH_Pos));
 }
 }
 else
 {
 if ((analog_wd_monit_channels & ADC_AWD_CR23_CHANNEL_MASK) == ADC_AWD_CR23_CHANNEL_MASK)
 {
 /* AWD monitoring a group of channels */
 analog_wd_monit_channels = (0x000FFFFFUL | (ADC_CFGR1_AWD1EN));
 }
 else
 {
 /* AWD monitoring a single channel */
 /* AWD monitoring a group of channels */
 analog_wd_monit_channels = ((ADC_CFGR1_AWD1EN | ADC_CFGR1_AWD1SGL)
 | (__LL_ADC_CHANNEL_TO_DECIMAL_NB(analog_wd_monit_channels) \
 << ADC_CFGR1_AWD1CH_Pos));
 }
 }
 }
 }

 return analog_wd_monit_channels;
}
Pavel A.
Super User
August 14, 2025

Hmm indeed in line 160: analog_wd_monit_channels = analog_wd_monit_channels;

This looks awkward but is legal. Specific warnings can be disabled in the compiler settings.