STM32F411: simplify analog readings
We don't need an interrupt for the DMA. Simply clear and set the DMA-bit for the ADC is sufficient.
This commit is contained in:
parent
aeb98b557b
commit
767c4a6911
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include "cmsis-stm32f4xx.h"
|
#include "cmsis-stm32f4xx.h"
|
||||||
#include "arduino.h"
|
#include "arduino.h"
|
||||||
|
#include "pinio.h"
|
||||||
#include "delay.h"
|
#include "delay.h"
|
||||||
#include "temp.h"
|
#include "temp.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
@ -48,9 +49,9 @@ void init_analog() {
|
||||||
3. high speed
|
3. high speed
|
||||||
*/
|
*/
|
||||||
#define DEFINE_TEMP_SENSOR(name, type, pin, additional) \
|
#define DEFINE_TEMP_SENSOR(name, type, pin, additional) \
|
||||||
pin ## _PORT->MODER |= (GPIO_MODER_MODER0 << ((pin ## _PIN) << 1)); \
|
SET_MODE(pin, 0x3); \
|
||||||
pin ## _PORT->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((pin ## _PIN) << 1)); \
|
PULL_OFF(pin); \
|
||||||
pin ## _PORT->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR0 << ((pin ## _PIN) << 1));
|
SET_OSPEED(pin, 0x3);
|
||||||
#include "config_wrapper.h"
|
#include "config_wrapper.h"
|
||||||
#undef DEFINE_TEMP_SENSOR
|
#undef DEFINE_TEMP_SENSOR
|
||||||
|
|
||||||
|
|
@ -144,38 +145,18 @@ void init_dma() {
|
||||||
* halfword for memory and periphal: the 12bit ADC is 16bit right aligned
|
* halfword for memory and periphal: the 12bit ADC is 16bit right aligned
|
||||||
* memory inc.: we read any adc and doing a step of 16bits after each conversion
|
* memory inc.: we read any adc and doing a step of 16bits after each conversion
|
||||||
* circular mode: repeat until inf
|
* circular mode: repeat until inf
|
||||||
* double buffer mode: we write to one adress and read the other
|
|
||||||
*/
|
*/
|
||||||
tmp_CR &= ~(DMA_SxCR_DIR);
|
tmp_CR &= ~(DMA_SxCR_DIR);
|
||||||
tmp_CR |= DMA_SxCR_MSIZE_0 |
|
tmp_CR |= DMA_SxCR_MSIZE_0 |
|
||||||
DMA_SxCR_PSIZE_0 |
|
DMA_SxCR_PSIZE_0 |
|
||||||
DMA_SxCR_MINC |
|
DMA_SxCR_MINC |
|
||||||
DMA_SxCR_CIRC |
|
DMA_SxCR_CIRC;
|
||||||
DMA_SxCR_TCIE;
|
|
||||||
|
|
||||||
DMA2_Stream4->CR = tmp_CR;
|
DMA2_Stream4->CR = tmp_CR;
|
||||||
|
|
||||||
// 10. Enable DMA-Stream
|
// 10. Enable DMA-Stream
|
||||||
DMA2_Stream4->CR |= DMA_SxCR_EN;
|
DMA2_Stream4->CR |= DMA_SxCR_EN;
|
||||||
while(!(DMA2_Stream4->CR & DMA_SxCR_EN));
|
while(!(DMA2_Stream4->CR & DMA_SxCR_EN));
|
||||||
|
|
||||||
NVIC_SetPriority(DMA2_Stream4_IRQn,
|
|
||||||
NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 3, 1));
|
|
||||||
NVIC_EnableIRQ(DMA2_Stream4_IRQn); // Enable interrupt generally.
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
DMA2 Stream4 interrupt.
|
|
||||||
|
|
||||||
Happens every time the complete stream is written.
|
|
||||||
In that case, we can turn of the ADC until we read it.
|
|
||||||
|
|
||||||
Must have the same name as in cmsis-startup_stm32f411xe.s.
|
|
||||||
*/
|
|
||||||
void DMA2_Stream4_IRQHandler(void) {
|
|
||||||
DMA2->HIFCR = DMA_HIFCR_CTCIF4;
|
|
||||||
ADC1->CR2 &= ~(ADC_CR2_DMA); // clear DMA flag; we restart it in start_adc()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read analog value.
|
/** Read analog value.
|
||||||
|
|
@ -212,6 +193,7 @@ uint16_t analog_read(uint8_t index) {
|
||||||
Start a new ADC conversion.
|
Start a new ADC conversion.
|
||||||
*/
|
*/
|
||||||
void start_adc() {
|
void start_adc() {
|
||||||
|
ADC1->CR2 &= ~(ADC_CR2_DMA);
|
||||||
ADC1->CR2 |= ADC_CR2_DMA;
|
ADC1->CR2 |= ADC_CR2_DMA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue