This article describes the ADC API, its application usage, and how to implement for BSP/device drivers.
Repository URL: https://github.com/dtbpkmte/GSoC-2022-RTEMS
Description
This ADC API aims for increasing portability and simplifying application code in using analog input pins.
Features:
- Read in blocking/non-blocking mode
- Configure resolution, data alignment, and more
- Register a transfer function for each pin and read converted results
- ADC interrupts
- Extends the Peripherals API: only a
rtems_gpio
object is required for operations
Usage
Getting a rtems_gpio
object:
rtems_gpio *pin;
rtems_gpio_get(PIN_NUMBER, &pin);
Setting ADC API:
rtems_gpio_set_pin_mode(pin, RTEMS_GPIO_PINMODE_ANALOG);
rtems_periph_api_set_api(pin, RTEMS_PERIPH_TYPE_ADC); // required
Reading raw value, blocking:
uint32_t result;
rtems_adc_read_raw(pin, &result);
Reading raw value, non-blocking:
uint32_t result;
rtems_adc_start_read_raw_nb(pin);
rtems_adc_read_raw_nb(pin); // returns RTEMS_ADC_READY if conversion
// done
Assigning a transfer function:
double result;
rtems_adc_assign_tf(pot, to_voltage, NULL);
rtems_adc_read(pot, &result);...double to_voltage(void *param, uint32_t raw) {
return (double) raw * 3.3 / MAX_ADC_VALUE;
}
Implementation for BSP/drivers
Please see my Peripherals API article here for BSP-specific implementation of all APIs in this system.