15#include "adc_rp2040.h"
19using namespace _IO_BANK0_;
23adc_rp2040::adc_rp2040() {
26 while (!_ADC_::ADC.CS.READY) ;
28 for (
int i=26; i <= 29; ++i) {
30 _PADS_BANK0_::PADS_BANK0.GPIO[i].PUE = 0;
31 _PADS_BANK0_::PADS_BANK0.GPIO[i].PDE = 0;
35void adc_rp2040::adcMode(uint8_t channel, uint16_t mode) {
37 assert(mode < ADC::ADC_14_BIT);
38 _modes[channel] = mode;
41adc_mode_t adc_rp2040::getMode(uint8_t channel) {
43 return _modes[channel];
46uint16_t adc_rp2040::adcReadRaw(uint8_t channel) {
50 task::enterCritical();
52 IO_BANK0_SET.GPIO18_CTRL.OEOVER <<= GPIO_CTRL_OEOVER__ENABLE;
54 IO_BANK0.GPIO18_CTRL.OUTOVER = GPIO_CTRL_OUTOVER__HIGH;
56 IO_BANK0.GPIO18_CTRL.OUTOVER = GPIO_CTRL_OUTOVER__LOW;
59 _ADC_::ADC.CS.AINSEL = (channel / 2);
60 _ADC_::ADC.CS.START_ONCE = 1;
61 while(!_ADC_::ADC.CS.READY) ;
62 uint16_t result = _ADC_::ADC.RESULT;
64 task::leaveCritical();
66 IO_BANK0_CLR.GPIO18_CTRL.OEOVER <<= GPIO_CTRL_OEOVER__ENABLE;
67 IO_BANK0_CLR.GPIO18_CTRL.OUTOVER <<= GPIO_CTRL_OUTOVER__HIGH;
70 switch(_modes[channel]) {
81float adc_rp2040::adcReadVoltage(uint8_t channel) {
82 return rawToVoltage(channel, adcReadRaw(channel));
85float adc_rp2040::rawToVoltage(uint8_t channel, uint16_t raw) {
86 float voltage = 3.3f * (float)raw;
87 switch(_modes[channel]) {
CMSIS-Core(M) Device Peripheral Access Layer Header File for Device RP2040.