Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[ARM] STM32G4. How to disable ADC channels which aren't used at the given time?

kender

Advanced Member level 4
Advanced Member level 4
Joined
Jun 19, 2005
Messages
1,428
Helped
138
Reputation
276
Reaction score
39
Trophy points
1,328
Location
Stanford, SF Bay Peninsula, California, Earth, Sol
Activity points
10,069
I've got a question related to reconfiguring the ADC channels at runtime. How can I disable channels which aren't used at the given time?

In one part of my program ADC2 is reading channels 1,2,4 in scan mode with DMA. In another part of the program ADC2 is reading channel 9. I need to reconfigure the ADC channels at runtime back and forth.

I saw code examples which used ADC_RANK_NONE to disable channels [if I understood it correctly]. But the HAL for my microcontroller (STM32G4) doesn't define ADC_RANK_NONE .
 
Last edited:
To manage ADC channel configuration at runtime on an STM32G4 microcontroller, especially when switching between different sets of channels, you need to adjust your ADC configuration dynamically. In STM32, ADC channels are generally configured using the HAL library functions, and you can enable or disable channels by configuring the ADC’s regular and injected channels.

Since `ADC_RANK_NONE` isn't defined in your HAL library for the STM32G4, you need to use alternative methods to effectively "disable" channels. Here’s how you can manage channel configuration:

### 1. **Dynamic Configuration Using HAL Functions**

To switch between different sets of ADC channels, you can use the HAL library functions to configure the channels as needed.

#### Example Steps to Reconfigure ADC Channels:

1. **Stop ADC Conversion:**
Ensure that the ADC is not actively converting before reconfiguring channels.

```c
HAL_ADC_Stop(&hadc2);
```

2. **Deinitialize ADC:**
Optionally, you can deinitialize the ADC and then reinitialize it. This step might not always be necessary but can ensure a clean reconfiguration.

```c
HAL_ADC_DeInit(&hadc2);
```

3. **Reconfigure Channels:**
To configure the ADC channels, use the appropriate HAL functions to set the channels you want.

- **Configure Regular Channels:**
Use `HAL_ADC_ConfigChannel()` to configure ADC channels.

```c
ADC_ChannelConfTypeDef sConfig = {0};

sConfig.Channel = ADC_CHANNEL_1; // Example channel
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
HAL_ADC_ConfigChannel(&hadc2, &sConfig);

// Repeat for other channels as needed
```

4. **Start ADC Conversion:**
Start the ADC conversion after reconfiguration.

```c
HAL_ADC_Start(&hadc2);
```

5. **Optionally, Reinitialize ADC:**
If you deinitialized the ADC earlier, reinitialize it.

```c
HAL_ADC_Init(&hadc2);
```

### 2. **Use DMA (Direct Memory Access) for Multiple Channels**

If you're using DMA for continuous conversion across multiple channels, ensure that DMA configurations and channel configurations align. The DMA settings should be updated accordingly when changing channels.

### 3. **Disable and Enable Channels (Alternative Approach)**

If your HAL doesn’t provide a direct way to disable channels like `ADC_RANK_NONE`, you can work around this limitation by configuring channels to invalid or unconnected states.

1. **Configure to a Dummy Channel:**
Configure the channel to a dummy or unused channel. For instance, if channel 9 is not valid, configure it to an invalid channel.

```c
sConfig.Channel = ADC_CHANNEL_INVALID; // Or an unused channel
HAL_ADC_ConfigChannel(&hadc2, &sConfig);
```

2. **Use `ADC_CHANNEL_NC` (if applicable):**
Some STM32 HAL libraries define `ADC_CHANNEL_NC` to denote a non-connected channel. Check if your HAL version supports this.

### 4. **Example Code for Switching Channels**

Here’s a simplified example to switch between different ADC configurations:

```c
void ConfigureADCForChannels1To4(void) {
ADC_ChannelConfTypeDef sConfig = {0};

// Stop ADC conversion
HAL_ADC_Stop(&hadc2);

// Configure channels 1, 2, 4
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&hadc2, &sConfig);

sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_REGULAR_RANK_2;
HAL_ADC_ConfigChannel(&hadc2, &sConfig);

sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_3;
HAL_ADC_ConfigChannel(&hadc2, &sConfig);

// Restart ADC conversion
HAL_ADC_Start(&hadc2);
}

void ConfigureADCForChannel9(void) {
ADC_ChannelConfTypeDef sConfig = {0};

// Stop ADC conversion
HAL_ADC_Stop(&hadc2);

// Configure channel 9
sConfig.Channel = ADC_CHANNEL_9;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
HAL_ADC_ConfigChannel(&hadc2, &sConfig);

// Restart ADC conversion
HAL_ADC_Start(&hadc2);
}
```

### Summary

- **Stop ADC Conversion** before reconfiguring channels.
- **Reconfigure Channels** using `HAL_ADC_ConfigChannel()` for each channel you want to use.
- **Start ADC Conversion** again after reconfiguration.
- **Optional Deinitialization** of ADC can ensure a clean start but is usually not necessary.

Ensure that your configuration logic aligns with the ADC and DMA setup to avoid conflicts. By dynamically reconfiguring the ADC channels, you can switch between different sets of channels based on your application’s needs.
 

LaTeX Commands Quick-Menu:

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top