EE445M RTOS
Taken at the University of Texas Spring 2015
adcpp.cpp
Go to the documentation of this file.
1 #include "adcpp.hpp"
2 
3 #include "inc/tm4c123gh6pm.h"
4 
5 #include "driverlib/adc.h"
6 #include "driverlib/gpio.h"
7 #include "driverlib/interrupt.h"
8 #include "driverlib/sysctl.h"
9 #include "driverlib/timer.h"
10 
11 #include "inc/hw_memmap.h"
12 
14 
15 adc::adc(memory_address_t adc_base, uint8_t adc_trigger_source,
16  uint8_t adc_sequencer) {
17 
18  base = adc_base;
19  trigger_source = adc_trigger_source;
20  sequencer = adc_sequencer;
21 
22  /* TODO: determine where the other ADC ports are located */
23  switch(adc_base) {
24  case ADC0_BASE:
25  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
26  SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOE);
27  GPIOPinTypeADC(GPIO_PORTE_AHB_BASE,
28  GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
29  SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
30  SysCtlPeripheralReset(SYSCTL_PERIPH_ADC0);
31  break;
32  default:
33  while(1) {}
34  }
35  /* we don't have to set the reference for the internal ADC, but we
36  might if we have an external one. */
37  ADCReferenceSet(base, ADC_REF_INT);
38 
39  ADCSequenceConfigure(base, sequencer, trigger_source, default_priority);
40 
41  channel_count = 0;
42 }
43 
45 
46  TimerControlTrigger(t->get_base(), t->get_subtimer(), true);
47 }
48 
49 void adc::configure_timer_interrupt(uint32_t timer_base, uint32_t timer_subtimer) {
50 
51  TimerControlTrigger(timer_base, timer_subtimer, true);
52 }
53 
55 void adc::configure_sequence(uint32_t sequencer_configuration) {
56 
57  /* From TI: Configure step 0 on sequence 3. Sample channel 0
58  (ADC_CTL_CH0) in single-ended mode (default) and configure the
59  interrupt flag (ADC_CTL_IE) to be set when the sample is done.
60  Tell the ADC logic that this is the last conversion on sequence
61  3 (ADC_CTL_END). Sequence 3 has only one programmable step.
62  Sequence 1 and 2 have 4 steps, and sequence 0 has 8
63  programmable steps. Since we are only doing a single
64  conversion using sequence 3 we will only configure step 0. For
65  more information on the ADC sequences and steps, reference the
66  datasheet. */
67  ADCSequenceStepConfigure(base, sequencer, channel_count,
68  sequencer_configuration);
69  ++channel_count;
70 }
71 
72 void adc::start() {
73 
74  IntEnable(INT_ADC0SS0 + sequencer);
75  ADCIntEnable(base, sequencer);
76  ADCSequenceEnable(base, sequencer);
77 }
78 
79 void adc::stop() {
80 
81  IntDisable(INT_ADC0SS0 + sequencer);
82  ADCIntDisable(base, sequencer);
83  ADCSequenceDisable(base, sequencer);
84 }
85 
86 void adc::sample() {
87 
88  ADCSequenceDataGet(base, sequencer, sequencer_data);
89 }
90 
91 uint32_t adc::get_sample(uint8_t i) {
92  return sequencer_data[i];
93 }
94 
95 uint32_t adc::ack() {
96 
97  ADCIntClear(base, sequencer);
98  return 0xDEADBEEF;
99 }
100 
101 /* Local Variables: */
102 /* firestarter: (compile "make -k -j32 -C ~/workspace/ee445m-labs/build/") */
103 /* End: */
uint32_t memory_address_t
Definition: adcpp.hpp:16
uint32_t sequencer_data[max_num_sequencer_steps]
Definition: adcpp.hpp:29
virtual void stop(void)
Definition: adcpp.cpp:79
void configure_timer_interrupt(uint32_t timer_base, uint32_t timer_subtimer)
Definition: adcpp.cpp:49
static const uint8_t default_priority
Definition: adcpp.hpp:20
adc()
Definition: adcpp.cpp:13
uint8_t sequencer
Definition: adcpp.hpp:25
uint32_t get_sample(uint8_t i)
Definition: adcpp.cpp:91
const uint32_t get_base()
Definition: timerpp.cpp:109
void sample(void)
Definition: adcpp.cpp:86
void configure_sequence(uint32_t sequencer_configuration)
Definition: adcpp.cpp:55
virtual void start(void)
Definition: adcpp.cpp:72
memory_address_t base
Definition: adcpp.hpp:24
virtual uint32_t ack(void)
Definition: adcpp.cpp:95
uint8_t trigger_source
Definition: adcpp.hpp:28
const subtimer_t get_subtimer()
Definition: timerpp.cpp:105
uint8_t channel_count
Definition: adcpp.hpp:26