2017-03-24 2 views
2

Hallo, ich schreibe alle einen eingebetteten C-Code auf STM32Fxx Mikroprozessoren mit Keil MicroVision IDE. In meinem Projekt verwende ich 8 Stück Relais. Ich habe jedes meiner Relais mit folgendem Codebeispiel deklariert. #define DO9_Pin GPIO_PIN_14 #define DO9_GPIO_Port GPIOC #define DO8_Pin GPIO_PIN_15 #define DO8_GPIO_Port GPIOC #define DO7_Pin GPIO_PIN_1 #define DO7_GPIO_Port GPIOA #define DO6_Pin GPIO_PIN_0 #define DO6_GPIO_Port GPIOA #define DO5_Pin GPIO_PIN_7 #define DO5_GPIO_Port GPIOB #define DO4_Pin GPIO_PIN_6 #define DO4_GPIO_Port GPIOB #define DO3_Pin GPIO_PIN_5 #define DO3_GPIO_Port GPIOB #define DO2_Pin GPIO_PIN_1 #define DO2_GPIO_Port GPIOB #define DO1_Pin GPIO_PIN_4 #define DO1_GPIO_Port GPIOA #define DO0_Pin GPIO_PIN_3 #define DO0_GPIO_Port GPIOAWie kann ich meine Funktionseingänge mit chracter array ändern?

Danach habe ich den Relais-Status ("GPIO PIN STATUS") mit gut mit HAL-Funktionen bekannt angepasst. Zum Beispiel in jedem cylce setze ich den Status meines 9-Relais mit den Mikrocontrollern Pins für diesen Ich bin mit diesem Codeblock `

void prsSetResetRelays(unsigned char coilNo,char status){ 

    if(coilNo==0){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_RESET); 
     } 
    } 
    else if(coilNo==1){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_RESET); 
     } 
    } 
    else if(coilNo==2){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_RESET); 
     } 
    } 
    else if(coilNo==3){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_RESET); 
     } 
    }else if(coilNo==4){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_RESET); 
     } 
    }else if(coilNo==5){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_RESET); 
     } 
    } 
    else if(coilNo==6){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_RESET); 
     } 
    } 
    else if(coilNo==7){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_RESET); 
     } 
    } 
    else if(coilNo==8){ 
     if(status=='s' || status=='S'){ 
      HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_SET); 
     }else{ 
      HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_RESET); 
     } 
    } 
     else if(coilNo==9){ 
      if(status=='s' || status=='S'){ 
       HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_SET); 
      }else{ 
       HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_RESET); 
     } 
     } 

    } 
`. 

Meine Frage ist. Gibt es eine Möglichkeit für mich, diesen Code in kürzerer Form zu reduzieren? Kann ich einen for cycle verwenden, statt dessen alle Anweisungen. Zum Beispiel würde Ich mag einen Code wie schreiben: `für mich

 for(int i=0;i<10;i++){ 
      if(status=='s' || status=='S'){ 
        HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_SET); 
      }else{ 
       HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_RESET); 
     } 
     } 

`

Gibt es eine Möglichkeit zu tun, diese Art der Notation in c-Programmiersprache. Danke im Voraus.

Antwort

4

Sie können nicht in Präprozessornamen, nein. Sie sind keine Laufzeitvariablen, sie werden ausschließlich zum Ersetzen von Text verwendet, bevor der Compiler den Code selbst sieht.

Die richtige Lösung ist Ihr Array von Relais als, nun ja, ein Array zu modellieren:

static const struct { 
    GPIO_TypeDef *port; 
    uint16_t  pin; 
} relays[] = { 
{ GPIOC, GPIO_PIN_14 }, 
{ GPIOC, GPIO_PIN_15 }, 
... more here ... 
}; 

Dann können Sie einen Index in das Array verwenden, um die Port/Pin-Daten zu erhalten, und stecken es:

void prsSetResetRelays(unsigned char coilNo, char status) 
{ 
    if(coilNo >= sizeof relays/sizeof *relays) 
    return; 
    HAL_GPIO_WritePin(relays[coilNo].port, relays[coilNo].pin, 
    (status == 's' || status == 'S') ? GPIO_PIN_SET : GPIO_PIN_RESET); 
} 
+0

Vielen Dank für Ihre Zeit und Mühe –

Verwandte Themen