3434
3535#include <libmaple/adc.h>
3636#include <libmaple/gpio.h>
37+ #include <libmaple/nvic.h> //Added by bubulindo.
3738
3839/*
3940 * Devices
4243adc_dev adc1 = {
4344 .regs = ADC1_BASE ,
4445 .clk_id = RCC_ADC1 ,
46+ .handlers = {[3 ]= 0 }, //added by bubulindo. EOC, JEOC, AWD
47+ .irq_num = NVIC_ADC_1_2 ,
4548};
4649/** ADC1 device. */
47- const adc_dev * ADC1 = & adc1 ;
50+ adc_dev * ADC1 = & adc1 ;
4851
4952adc_dev adc2 = {
5053 .regs = ADC2_BASE ,
5154 .clk_id = RCC_ADC2 ,
5255};
5356/** ADC2 device. */
54- const adc_dev * ADC2 = & adc2 ;
57+ adc_dev * ADC2 = & adc2 ;
5558
5659#if defined(STM32_HIGH_DENSITY ) || defined(STM32_XL_DENSITY )
5760adc_dev adc3 = {
5861 .regs = ADC3_BASE ,
5962 .clk_id = RCC_ADC3 ,
63+ .handlers = {[3 ]= 0 }, //added by bubulindo. EOC, JEOC, AWD
64+ .irq_num = NVIC_ADC3 ,//added by bubulindo.
6065};
6166/** ADC3 device. */
62- const adc_dev * ADC3 = & adc3 ;
67+ adc_dev * ADC3 = & adc3 ;
6368#endif
6469
70+
71+ /*
72+ adc irq routine.
73+ Added by bubulindo.
74+ */
75+ void __irq_adc () {
76+ //get status
77+ uint32 adc_sr = ADC1 -> regs -> SR ;
78+ //End Of Conversion
79+ if (adc_sr & (1U << ADC_SR_EOC_BIT )) {
80+ ADC1 -> regs -> SR &= ~(1 <<ADC_SR_EOC_BIT );
81+ void (* handler )(void ) = ADC1 -> handlers [ADC_EOC ];
82+ if (handler ) {
83+ handler ();
84+ }
85+ }
86+ //Injected End Of Conversion
87+ if (adc_sr & (1U << ADC_SR_JEOC_BIT )) {
88+ ADC1 -> regs -> SR &= ~(1 <<ADC_SR_JEOC_BIT );
89+ void (* handler )(void ) = ADC1 -> handlers [ADC_JEOC ];
90+ if (handler ) {
91+ handler ();
92+ }
93+ }
94+ //Analog Watchdog
95+ if (adc_sr & (1U << ADC_SR_AWD_BIT )) {
96+ ADC1 -> regs -> SR &= ~(1 <<ADC_SR_AWD_BIT );
97+ void (* handler )(void ) = ADC1 -> handlers [ADC_AWD ];
98+ if (handler ) {
99+ handler ();
100+ }
101+ }
102+ };//end of adc irq
103+
104+
105+ /*
106+ ADC3 IRQ handler.
107+ added by bubulindo
108+ */
109+ #if defined(STM32_HIGH_DENSITY ) || defined(STM32_XL_DENSITY )
110+ void __irq_adc3 () {
111+ //get status
112+ uint32 adc_sr = ADC3 -> regs -> SR ;
113+ //End Of Conversion
114+ if (adc_sr & (1U << ADC_SR_EOC_BIT )) {
115+ ADC3 -> regs -> SR &= ~(1 <<ADC_SR_EOC_BIT );
116+ void (* handler )(void ) = ADC3 -> handlers [ADC_EOC ];
117+ if (handler ) {
118+ handler ();
119+ }
120+ }
121+ //Injected End Of Conversion
122+ if (adc_sr & (1U << ADC_SR_JEOC_BIT )) {
123+ ADC3 -> regs -> SR &= ~(1 <<ADC_SR_JEOC_BIT );
124+ void (* handler )(void ) = ADC3 -> handlers [ADC_JEOC ];
125+ if (handler ) {
126+ handler ();
127+ }
128+ }
129+ //Analog Watchdog
130+ if (adc_sr & (1U << ADC_SR_AWD_BIT )) {
131+ ADC3 -> regs -> SR &= ~(1 <<ADC_SR_AWD_BIT );
132+ void (* handler )(void ) = ADC3 -> handlers [ADC_AWD ];
133+ if (handler ) {
134+ handler ();
135+ }
136+ }
137+ };//end of ADC3 irq
138+ #endif
139+
140+ /*
141+ enable interrupts on the ADC:
142+ use ADC_EOC, ADC_JEOC, ADC_AWD
143+ This will set up the interrupt bit in the ADC as well as in the NVIC.
144+ added by bubulindo
145+ */
146+ void adc_enable_irq (adc_dev * dev , uint8 interrupt ) {//ADC1 for now.
147+ dev -> regs -> CR1 |= (1U <<(interrupt + ADC_CR1_EOCIE_BIT ));
148+ nvic_irq_enable (dev -> irq_num );
149+ }
150+
151+ /*
152+ attach interrupt functionality for ADC
153+ use ADC_EOC, ADC_JEOC, ADC_AWD
154+ added by bubulindo
155+ */
156+
157+ void adc_attach_interrupt (adc_dev * dev ,
158+ uint8 interrupt ,
159+ voidFuncPtr handler ) {
160+ dev -> handlers [interrupt ] = handler ;
161+ adc_enable_irq (dev , interrupt );
162+ //enable_irq(dev, interrupt); //I need to create this function. to enable NVIC
163+ // nvic_irq_enable()
164+ }
165+
65166/*
66167 * STM32F1 routines
67168 */
@@ -73,7 +174,7 @@ const adc_dev *ADC3 = &adc3;
73174 *
74175 * @param dev adc device
75176 */
76- void adc_calibrate (const adc_dev * dev ) {
177+ void adc_calibrate (adc_dev * dev ) {
77178 __io uint32 * rstcal_bit = bb_perip (& (dev -> regs -> CR2 ), 3 );
78179 __io uint32 * cal_bit = bb_perip (& (dev -> regs -> CR2 ), 2 );
79180
@@ -94,19 +195,19 @@ void adc_set_prescaler(adc_prescaler pre) {
94195 rcc_set_prescaler (RCC_PRESCALER_ADC , (uint32 )pre );
95196}
96197
97- void adc_foreach (void (* fn )(const adc_dev * )) {
198+ void adc_foreach (void (* fn )(adc_dev * )) {
98199 fn (ADC1 );
99200 fn (ADC2 );
100201#if defined(STM32_HIGH_DENSITY ) || defined(STM32_XL_DENSITY )
101202 fn (ADC3 );
102203#endif
103204}
104205
105- void adc_config_gpio (const adc_dev * ignored , gpio_dev * gdev , uint8 bit ) {
206+ void adc_config_gpio (adc_dev * ignored , gpio_dev * gdev , uint8 bit ) {
106207 gpio_set_mode (gdev , bit , GPIO_INPUT_ANALOG );
107208}
108209
109- void adc_enable_single_swstart (const adc_dev * dev ) {
210+ void adc_enable_single_swstart (adc_dev * dev ) {
110211 adc_init (dev );
111212 adc_set_extsel (dev , ADC_SWSTART );
112213 adc_set_exttrig (dev , 1 );
0 commit comments