9#include "adc14_msp432.h"
10#include "gpio_msp432.h"
15adc14_msp432::adc14_msp432() {
18 for(uint8_t channel = 0; channel < 24; ++channel) {
19 ADC14->MCTL[channel] = channel;
41 NVIC_EnableIRQ(ADC14_IRQn);
44void adc14_msp432::adcMode(uint8_t channel, uint16_t mode) {
46 _modes[channel] = mode;
47 uint16_t port_pin = (5 << 3) + 5;
49 port_pin = (6 << 3) + 1 + 14;
51 port_pin = (9 << 3) + 1 + 16;
54 uint8_t port = port_pin >> 3;
55 uint8_t pin = port_pin & 0x7;
61adc_mode_t adc14_msp432::getMode(uint8_t channel) {
63 return _modes[channel];
66uint16_t adc14_msp432::adcReadRaw(uint8_t channel) {
69 if (_current_mode !=_modes[channel]) {
70 set_resolution( _modes[channel] );
75 ADC14->CTL1 &= ~ADC14_CTL1_CSTARTADD_MASK;
78 ADC14->CTL0 &= ~ADC14_CTL0_CONSEQ_MASK;
84 return ADC14->MEM[channel];
87float adc14_msp432::adcReadVoltage(uint8_t channel) {
88 return rawToVoltage(channel, adcReadRaw(channel));
91float adc14_msp432::rawToVoltage(uint8_t channel, uint16_t raw) {
92 float voltage = 3.3f * (float)raw;
93 switch(_modes[channel]) {
94 case ADC::ADC_8_BIT : voltage /= 255.0f;
break;
95 case ADC::ADC_10_BIT: voltage /= 1023.0f;
break;
96 case ADC::ADC_12_BIT: voltage /= 4095.0f;
break;
97 case ADC::ADC_14_BIT: voltage /= 16383.0f;
break;
98 default: assert(
false);
103void adc14_msp432::adcSetupScan(uint16_t mode) {
105 if (_current_mode != mode) {
106 set_resolution(mode);
110void adc14_msp432::adcStartScan(uint8_t start, uint8_t end) {
111 assert((start < 24) && (end < 24) && (start <= end));
114 ADC14->CTL1 &= ~ADC14_CTL1_CSTARTADD_MASK;
126void adc14_msp432::adcStopScan() {
131 for (
int i = 0; i < 1000; ++i) ;
135uint16_t adc14_msp432::adcReadScan(uint8_t channel) {
136 assert(channel < 24);
137 return ADC14->MEM[channel];
140void adc14_msp432::attachScanIrq(uint8_t channel,
141 void (*handler)(uint16_t chan, uint16_t val) ) {
142 assert(channel < 24);
145 _irqHandlers[channel] = handler;
147 ADC14->IER0 |= (1 << channel);
150void adc14_msp432::attachWinIrq(uint8_t channel,
151 void (*handler)(uint16_t val, uint16_t mode),
152 uint16_t low, uint16_t high,
154 assert(channel < 24);
161 _irqWinHandler = handler;
163 _irqWinChannel = channel;
174void adc14_msp432::set_resolution(uint16_t mode) {
176 ADC14->CTL1 &= ~ADC14_CTL1_RES_MASK;
180 _current_mode = ADC::ADC_8_BIT;
182 case ADC::ADC_10_BIT:
184 _current_mode = ADC::ADC_10_BIT;
186 case ADC::ADC_12_BIT:
188 _current_mode = ADC::ADC_12_BIT;
190 case ADC::ADC_14_BIT:
192 _current_mode = ADC::ADC_14_BIT;
199void adc14_msp432::handleIrq(uint32_t iv) {
205 ADC14->MCTL[_irqWinChannel] &= ~ADC14_MCTLN_WINC;
213 case 0x6: mode = ADC::ABOVE_HIGH;
break;
214 case 0x8: mode = ADC::BELOW_LOW;
break;
215 case 0xa: mode = ADC::WITHIN_WIN;
break;
218 _irqWinHandler(ADC14->MEM[_irqWinChannel], mode);
225 if (_irqHandlers[iv]) _irqHandlers[iv](iv, ADC14->MEM[iv]);
231void ADC14_IRQHandler(
void) {
232 uint32_t iv = ADC14->IV;
233 adc14_msp432::inst.handleIrq( iv );
#define ADC14_CTL0_PDIV__4
#define ADC14_CTL0_SHT1__64
#define ADC14_CTL1_RES__10BIT
#define ADC14_CTL0_DIV__1
#define ADC14_CTL1_RES__8BIT
#define ADC14_CLRIFGR1_CLRINIFG
#define ADC14_CTL0_CONSEQ_3
#define ADC14_CTL0_CONSEQ_0
#define ADC14_MCTLN_VRSEL_0
#define ADC14_CTL0_SHT0__64
#define ADC14_CTL0_ENC_OFS
#define ADC14_CLRIFGR1_CLRLOIFG
#define ADC14_CTL1_CSTARTADD_OFS
#define ADC14_CTL1_RES__14BIT
#define ADC14_CTL1_PWRMD_0
#define ADC14_CLRIFGR1_CLRHIIFG
#define ADC14_CTL0_BUSY_OFS
#define ADC14_CTL1_RES__12BIT
#define ADC14_CTL0_SSEL__SMCLK