Hardware IO control: mirrors, lock in

Committer:
mbedalvaro
Date:
Mon Oct 17 13:23:06 2011 +0000
Revision:
0:c19dc1d8b225
I wonder if perhaps it would be better to avoid a hardwareIO object, and instead have a set of global hardware functions... I think I will do this in the next revisions of this library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:c19dc1d8b225 1 /* mbed Library - ADC
mbedalvaro 0:c19dc1d8b225 2 * Copyright (c) 2010, sblandford
mbedalvaro 0:c19dc1d8b225 3 * released under MIT license http://mbed.org/licence/mit
mbedalvaro 0:c19dc1d8b225 4 */
mbedalvaro 0:c19dc1d8b225 5
mbedalvaro 0:c19dc1d8b225 6 #ifndef MBED_ADC_H
mbedalvaro 0:c19dc1d8b225 7 #define MBED_ADC_H
mbedalvaro 0:c19dc1d8b225 8
mbedalvaro 0:c19dc1d8b225 9 #include "mbed.h"
mbedalvaro 0:c19dc1d8b225 10
mbedalvaro 0:c19dc1d8b225 11 #define XTAL_FREQ 12000000
mbedalvaro 0:c19dc1d8b225 12 #define MAX_ADC_CLOCK 13000000
mbedalvaro 0:c19dc1d8b225 13 #define CLKS_PER_SAMPLE 64
mbedalvaro 0:c19dc1d8b225 14
mbedalvaro 0:c19dc1d8b225 15 #define ADC_SAMPLE_RATE 150000
mbedalvaro 0:c19dc1d8b225 16
mbedalvaro 0:c19dc1d8b225 17
mbedalvaro 0:c19dc1d8b225 18 class ADC {
mbedalvaro 0:c19dc1d8b225 19 public:
mbedalvaro 0:c19dc1d8b225 20
mbedalvaro 0:c19dc1d8b225 21 //Initialize ADC with ADC maximum sample rate of
mbedalvaro 0:c19dc1d8b225 22 //sample_rate and system clock divider of cclk_div
mbedalvaro 0:c19dc1d8b225 23 //Maximum recommened sample rate is 184000
mbedalvaro 0:c19dc1d8b225 24 ADC(int sample_rate, int cclk_div);
mbedalvaro 0:c19dc1d8b225 25
mbedalvaro 0:c19dc1d8b225 26 //Enable/disable ADC on pin according to state
mbedalvaro 0:c19dc1d8b225 27 //and also select/de-select for next conversion
mbedalvaro 0:c19dc1d8b225 28 void setup(PinName pin, int state);
mbedalvaro 0:c19dc1d8b225 29
mbedalvaro 0:c19dc1d8b225 30 //Return enabled/disabled state of ADC on pin
mbedalvaro 0:c19dc1d8b225 31 int setup(PinName pin);
mbedalvaro 0:c19dc1d8b225 32
mbedalvaro 0:c19dc1d8b225 33 //Enable/disable burst mode according to state
mbedalvaro 0:c19dc1d8b225 34 void burst(int state);
mbedalvaro 0:c19dc1d8b225 35
mbedalvaro 0:c19dc1d8b225 36 //Select channel already setup
mbedalvaro 0:c19dc1d8b225 37 void select(PinName pin);
mbedalvaro 0:c19dc1d8b225 38
mbedalvaro 0:c19dc1d8b225 39 //Return burst mode enabled/disabled
mbedalvaro 0:c19dc1d8b225 40 int burst(void);
mbedalvaro 0:c19dc1d8b225 41
mbedalvaro 0:c19dc1d8b225 42 /*Set start condition and edge according to mode:
mbedalvaro 0:c19dc1d8b225 43 0 - No start (this value should be used when clearing PDN to 0).
mbedalvaro 0:c19dc1d8b225 44 1 - Start conversion now.
mbedalvaro 0:c19dc1d8b225 45 2 - Start conversion when the edge selected by bit 27 occurs on the P2.10 / EINT0 / NMI pin.
mbedalvaro 0:c19dc1d8b225 46 3 - Start conversion when the edge selected by bit 27 occurs on the P1.27 / CLKOUT /
mbedalvaro 0:c19dc1d8b225 47 USB_OVRCRn / CAP0.1 pin.
mbedalvaro 0:c19dc1d8b225 48 4 - Start conversion when the edge selected by bit 27 occurs on MAT0.1. Note that this does
mbedalvaro 0:c19dc1d8b225 49 not require that the MAT0.1 function appear on a device pin.
mbedalvaro 0:c19dc1d8b225 50 5 - Start conversion when the edge selected by bit 27 occurs on MAT0.3. Note that it is not
mbedalvaro 0:c19dc1d8b225 51 possible to cause the MAT0.3 function to appear on a device pin.
mbedalvaro 0:c19dc1d8b225 52 6 - Start conversion when the edge selected by bit 27 occurs on MAT1.0. Note that this does
mbedalvaro 0:c19dc1d8b225 53 not require that the MAT1.0 function appear on a device pin.
mbedalvaro 0:c19dc1d8b225 54 7 - Start conversion when the edge selected by bit 27 occurs on MAT1.1. Note that this does
mbedalvaro 0:c19dc1d8b225 55 not require that the MAT1.1 function appear on a device pin.
mbedalvaro 0:c19dc1d8b225 56 When mode >= 2, conversion is triggered by edge:
mbedalvaro 0:c19dc1d8b225 57 0 - Rising edge
mbedalvaro 0:c19dc1d8b225 58 1 - Falling edge
mbedalvaro 0:c19dc1d8b225 59 */
mbedalvaro 0:c19dc1d8b225 60 void startmode(int mode, int edge);
mbedalvaro 0:c19dc1d8b225 61
mbedalvaro 0:c19dc1d8b225 62 //Return startmode state according to mode_edge=0: mode and mode_edge=1: edge
mbedalvaro 0:c19dc1d8b225 63 int startmode(int mode_edge);
mbedalvaro 0:c19dc1d8b225 64
mbedalvaro 0:c19dc1d8b225 65 //Start ADC conversion
mbedalvaro 0:c19dc1d8b225 66 void start(void);
mbedalvaro 0:c19dc1d8b225 67
mbedalvaro 0:c19dc1d8b225 68 //Set interrupt enable/disable for pin to state
mbedalvaro 0:c19dc1d8b225 69 void interrupt_state(PinName pin, int state);
mbedalvaro 0:c19dc1d8b225 70
mbedalvaro 0:c19dc1d8b225 71 //Return enable/disable state of interrupt for pin
mbedalvaro 0:c19dc1d8b225 72 int interrupt_state(PinName pin);
mbedalvaro 0:c19dc1d8b225 73
mbedalvaro 0:c19dc1d8b225 74 //Attach custom interrupt handler replacing default
mbedalvaro 0:c19dc1d8b225 75 void attach(void(*fptr)(void));
mbedalvaro 0:c19dc1d8b225 76
mbedalvaro 0:c19dc1d8b225 77 //Restore default interrupt handler
mbedalvaro 0:c19dc1d8b225 78 void detach(void);
mbedalvaro 0:c19dc1d8b225 79
mbedalvaro 0:c19dc1d8b225 80 //Append custom interrupt handler for pin
mbedalvaro 0:c19dc1d8b225 81 void append(PinName pin, void(*fptr)(uint32_t value));
mbedalvaro 0:c19dc1d8b225 82
mbedalvaro 0:c19dc1d8b225 83 //Unappend custom interrupt handler for pin
mbedalvaro 0:c19dc1d8b225 84 void unappend(PinName pin);
mbedalvaro 0:c19dc1d8b225 85
mbedalvaro 0:c19dc1d8b225 86 //Append custom global interrupt handler
mbedalvaro 0:c19dc1d8b225 87 void append(void(*fptr)(int chan, uint32_t value));
mbedalvaro 0:c19dc1d8b225 88
mbedalvaro 0:c19dc1d8b225 89 //Unappend custom global interrupt handler
mbedalvaro 0:c19dc1d8b225 90 void unappend(void);
mbedalvaro 0:c19dc1d8b225 91
mbedalvaro 0:c19dc1d8b225 92 //Set ADC offset to a value 0-7
mbedalvaro 0:c19dc1d8b225 93 void offset(int offset);
mbedalvaro 0:c19dc1d8b225 94
mbedalvaro 0:c19dc1d8b225 95 //Return current ADC offset
mbedalvaro 0:c19dc1d8b225 96 int offset(void);
mbedalvaro 0:c19dc1d8b225 97
mbedalvaro 0:c19dc1d8b225 98 //Return value of ADC on pin
mbedalvaro 0:c19dc1d8b225 99 int read(PinName pin);
mbedalvaro 0:c19dc1d8b225 100
mbedalvaro 0:c19dc1d8b225 101 //Return DONE flag of ADC on pin
mbedalvaro 0:c19dc1d8b225 102 int done(PinName pin);
mbedalvaro 0:c19dc1d8b225 103
mbedalvaro 0:c19dc1d8b225 104 //Return OVERRUN flag of ADC on pin
mbedalvaro 0:c19dc1d8b225 105 int overrun(PinName pin);
mbedalvaro 0:c19dc1d8b225 106
mbedalvaro 0:c19dc1d8b225 107 //Return actual ADC clock
mbedalvaro 0:c19dc1d8b225 108 int actual_adc_clock(void);
mbedalvaro 0:c19dc1d8b225 109
mbedalvaro 0:c19dc1d8b225 110 //Return actual maximum sample rate
mbedalvaro 0:c19dc1d8b225 111 int actual_sample_rate(void);
mbedalvaro 0:c19dc1d8b225 112
mbedalvaro 0:c19dc1d8b225 113 //Return pin ID of ADC channel
mbedalvaro 0:c19dc1d8b225 114 PinName channel_to_pin(int chan);
mbedalvaro 0:c19dc1d8b225 115
mbedalvaro 0:c19dc1d8b225 116 //Return pin number of ADC channel
mbedalvaro 0:c19dc1d8b225 117 int channel_to_pin_number(int chan);
mbedalvaro 0:c19dc1d8b225 118
mbedalvaro 0:c19dc1d8b225 119
mbedalvaro 0:c19dc1d8b225 120 private:
mbedalvaro 0:c19dc1d8b225 121 int _pin_to_channel(PinName pin);
mbedalvaro 0:c19dc1d8b225 122 uint32_t _data_of_pin(PinName pin);
mbedalvaro 0:c19dc1d8b225 123
mbedalvaro 0:c19dc1d8b225 124 int _adc_clk_freq;
mbedalvaro 0:c19dc1d8b225 125 void adcisr(void);
mbedalvaro 0:c19dc1d8b225 126 static void _adcisr(void);
mbedalvaro 0:c19dc1d8b225 127 static ADC *instance;
mbedalvaro 0:c19dc1d8b225 128
mbedalvaro 0:c19dc1d8b225 129 uint32_t _adc_data[8];
mbedalvaro 0:c19dc1d8b225 130 void(*_adc_isr[8])(uint32_t value);
mbedalvaro 0:c19dc1d8b225 131 void(*_adc_g_isr)(int chan, uint32_t value);
mbedalvaro 0:c19dc1d8b225 132 void(*_adc_m_isr)(void);
mbedalvaro 0:c19dc1d8b225 133 };
mbedalvaro 0:c19dc1d8b225 134
mbedalvaro 0:c19dc1d8b225 135 extern ADC adc;
mbedalvaro 0:c19dc1d8b225 136
mbedalvaro 0:c19dc1d8b225 137 #endif