Me gustaría medir el pin PC1 y compararlo con Vref para obtener el voltaje actual. Este código de abajo trabajó en L152re. Cambié el número de pin, la dirección ADC1 y el canal DMA. Mide algo pero estoy seguro que no estoy en lo correcto. Oscila entre +/- 300 unidades. Al menos Vref debe ser estable. Estoy bastante seguro de que el problema será con la configuración de ADC o DMA. ¿Alguien puede echar un vistazo? Muchas gracias.
#include "init.h"
#include "stm32f4xx_rcc.h"
__IO uint16_t ADCConvertedValues[2];
void init_DMA(void){
DMA_InitTypeDef DMA_initStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
DMA_DeInit(DMA2_Stream0);
DMA_initStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_initStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValues;
DMA_initStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_initStructure.DMA_BufferSize = 2;
DMA_initStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_initStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_initStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_initStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_initStructure.DMA_Mode = DMA_Mode_Circular;
DMA_initStructure.DMA_Priority = DMA_Priority_High;
DMA_initStructure.DMA_Channel = DMA_Channel_0;
DMA_Init(DMA2_Stream0, &DMA_initStructure);
DMA_Cmd(DMA2_Stream0, ENABLE);
}
void init_ADC(void){
GPIO_InitTypeDef GPIO_initStructure;
ADC_InitTypeDef ADC_initStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_HSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
GPIO_initStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_initStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_initStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_initStructure);
ADC_DeInit();
ADC_initStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_initStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_initStructure.ADC_ContinuousConvMode = ENABLE;
ADC_initStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
ADC_initStructure.ADC_NbrOfConversion = 2;
ADC_initStructure.ADC_ScanConvMode = ENABLE;
ADC_Init(ADC1, &ADC_initStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 1, ADC_SampleTime_144Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint, 2, ADC_SampleTime_144Cycles);
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConv(ADC1);
}
void init(void){
init_DMA();
init_ADC();
}