Array para controlar los GPIO individuales [cerrado]

0

Soy nuevo en sistemas embebidos y programación en C Actualmente estoy tratando de programar una PCB utilizando un microcontrolador STM32 para controlar una serie de 8 ventiladores al recibir un solo comando. es decir, 00001011 encenderá los ventiladores 5, 7 y 8. Hay un total de 256 combinaciones posibles y no sería muy eficiente programar cada una individualmente.

Estoy pensando en usar una matriz para lograr esto usando algo como;

fan_array[8] = {fan1, fan2, fan3, fan4, fan5, fan6, fan7, fan8};
printf ("Input fan state"); // user would input binary number as shown above
scanf (%d, fan_array);

¿Esto establecería los pines GPIO que controlan cada ventilador alto o bajo según los valores binarios ingresados en la matriz?

    
pregunta cath001

2 respuestas

5

Si conecta los ventiladores hasta los 8 bits de un puerto GPIO, puede escribir el valor de byte directamente en el puerto, y cada ventilador responderá solo a su bit. No es necesario ningún software sofisticado.

    
respondido por el Dave Tweed
-1
scanf (%d, fan_array);

Eso lee un número entero en el primer elemento de la matriz. scanf% d lee en un puntero a un entero. fan_array es un puntero al primer elemento, fan_array [0].

Puedes hacer lo que quieras con una tabla de búsqueda " fácilmente " ... si conoces tus punteros.

// List element with pointer to GPIO object and pin number.
typedef struct {
  GPIO_PORT *port;
  uint8_t pin
} fan_pin_t;

// List of fan ports and pint
const fan_pin_t fan_pin_list[] = {
  {PORTA, 4},
  {PORTC, 7},
  ...
  {0,0}
};

// Function to set fans based on bitmask.
void set_fan(uint8_t command){
  fan_pin_t *fp = fan_pin;              // Load list pointer
  uint8_t mask = 1;                     // Load mask 00000001
  while(fp->port != 0){               // While not element {0,0}
    if(command & mask){                   
      fp->port->BSRR = (1<<fp->pin);    // Write to Bit/Set/Reset/Register from current element
    }else{
      fp->port->BRR = (1<<fp->pin);    // Write to Bit/Reset/Register from current element
    }    
    mask <<= 1;                         // Left shift mask by 1
    fp++;                               // Next element in list
  }
}
    
respondido por el Jeroen3

Lea otras preguntas en las etiquetas