/* Vídeo 8.1.
Programa que efectúa la lectura de la tensión (conversión A/D) en el
pin PA1 del microcontrolador y enciende el LED LD3 de la tarjeta Nucleo
L031K6 si el resultado de la conversión es igual o superior a un determinado
valor. Lo apaga si es menor.
Microcontrolador: STM32L031K6**/
//----- Función que genera un retardo en milisegundos
void delay_ms(uint32_t milliseconds) {
uint32_t cycles = milliseconds * (SystemCoreClock / 1000);
for (uint32_t i = 0; i < cycles; i++) {
__NOP();
}
}
//----- Función para configurar el conversor A/D
void inicio_ADC(void) {
// Habilita el reloj del ADC
RCC->APB2ENR |= 0b00000000000000000000001000000000;
// Configura el pin PA1 como entrada analógica. Por defecto,
// PA1 está en modo analógico.
GPIOA->MODER |= 0b00000000000000000000000000000011;
// Selecciona el canal 1 para la conversión A/D
ADC1->CHSELR |= 0b00000000000000000000000000000001;
// Habilita el ADC
ADC1->CR |= 0b00000000000000000000000000000001;
}
//----- Función para habilitar el puerto y el pin del LED LD3
void inicio_LED(void) {
// Habilita el reloj del puerto GPIOB
RCC->IOPENR |= 0b00000000000000000000000000000010;
// Configura el pin PB3 como salida
GPIOB->MODER &= 0b11111111111111110101010101110101;
}
//----- Función para efectuar una conversión A/D
uint16_t lectura_ADC(void) {
// Inicia la conversión A/D
ADC1->CR |= 0b00000000000000000000000000000100;
// Espera hasta que la conversión A/D se complete
while ((ADC1->ISR & 0b1<<1) == 0);
// Lee el valor convertido
return ADC1->DR;
}
//----- Función principal ----------------------------------
int main(void) {
inicio_ADC(); // Inicializa el ADC
inicio_LED(); // Inicializa el puerto y el pin del LED
// Bucle infinito
while(1){
// Realiza una conversión ADC
uint16_t valor_ADC = lectura_ADC();
// Verifica el valor del ADC
if (valor_ADC >= 1862) {
// Si el valor es mayor o igual a la mitad del rango,
// enciende el LED
GPIOB->BSRR |= 0b00000000000000000000000000001011;
}
if (valor_ADC >= 3724) {
GPIOB->BSRR |= 0b00000000000000000000000011111011;
}
else {
// Si el valor es menor a la mitad del rango,
// apaga el LED
GPIOB->BSRR |= 0b11111111111111111111111111111111;
}
delay_ms(20); // Retardo
}
}
Loading
st-nucleo-l031k6
st-nucleo-l031k6