Función para seleccionar el reloj:
void clock_setup(void) { rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_168MHZ]); //f4 stm32-discovery }
Inicialización de los leds, y el puerto A.
void gpio_setup(void) { /* Enable GPIOC clock. */ rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPDEN); /* Set GPIOs (in GPIO port D) to 'output push-pull'. */ gpio_mode_setup(GPIOD, GPIO_MODE_OUTPUT,GPIO_PUPD_NONE, GPIO12); // green LED gpio_mode_setup(GPIOD, GPIO_MODE_OUTPUT,GPIO_PUPD_NONE, GPIO15); // blue led /* Enable GPIOC clock. */ rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); /* Set GPIO0 (in GPIO port A) to 'input open-drain'. */ gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO1); }
Inicialización de las funciones del ADC, activar que sea en puerto A, pre-escalado, des-habilitar escaneo de canales (porque solo se usa 1), ADC en modo simple.
void set_adc (void) { gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO1); // Configura el Pin PA1, modo analógico, sin pull up/down rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_ADC1EN); // Habilita reloj del ADC1 rcc_peripheral_enable_clock(&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); // Habilita pin PA1 adc_set_clk_prescale(ADC_CCR_ADCPRE_BY2); // Pre escala el reloj adc_disable_scan_mode(ADC1); // Se deshabilita el escaneo por grupo adc_set_single_conversion_mode(ADC1); adc_set_sample_time(ADC1, ADC_CHANNEL1, ADC_SMPR1_SMP_1DOT5CYC); //Solo se esta usando un canal u8 channels[16]; channels[0] = ADC_CHANNEL1; channels[1] = ADC_CHANNEL1; channels[2] = ADC_CHANNEL1; channels[3] = ADC_CHANNEL1; channels[4] = ADC_CHANNEL1; channels[5] = ADC_CHANNEL1; channels[6] = ADC_CHANNEL1; channels[7] = ADC_CHANNEL1; channels[8] = ADC_CHANNEL1; channels[9] = ADC_CHANNEL1; channels[10] = ADC_CHANNEL1; channels[11] = ADC_CHANNEL1; channels[12] = ADC_CHANNEL1; channels[13] = ADC_CHANNEL1; channels[14] = ADC_CHANNEL1; channels[15] = ADC_CHANNEL1; adc_set_regular_sequence(ADC1, 16, channels); adc_set_multi_mode(ADC_CCR_MULTI_INDEPENDENT); adc_power_on(ADC1); }
Programa de prueba:
int main(void) { u16 medicion; float Vref=2.966f; float voltage=0.0f; //Inicializar, y configuración clock_setup(); gpio_setup(); set_adc(); while(1) { adc_start_conversion_regular(ADC1); //Empieza la lectura para realizar la conversión del ADC1 while (!adc_eoc(ADC1)); medicion = adc_read_regular(ADC1); //"medición" obtiene el valor calculado por el ADC voltage=medicion*(Vref/4096.0f); //Se establece un valor de voltaje en base a una referencia //min hall voltaje1.49 //max hall voltaje 1.67 if (voltage>=1.64f) //Dependiendo del voltaje voltaje medido y el de referencia de prende el led GPIO12o el GPIO15 gpio_port_write(GPIOD, GPIO12); else gpio_port_write(GPIOD, GPIO15); } return 0; }