2017-03-24 5 views
2

안녕하십니까 Keil MicroVision IDE가있는 STM32Fxx 마이크로 프로세서에 임베디드 C 코드를 작성하고 있습니다. 내 프로젝트에서 나는 릴레이 8 조각을 사용하고있다. 다음 코드 샘플을 사용하여 각 릴레이를 해제했습니다. #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 GPIOA커 텍터 배열을 사용하여 함수 입력을 변경하는 방법

그런 다음 HAL 기능으로 잘 알려진 릴레이 상태 ("GPIO PIN STATUS")를 조정했습니다. 각 cylce 예를 들어 나는이에 대한 마이크로 컨트롤러 핀 내가

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); 
     } 
     } 

    } 
`. 

내 질문은 이것이다`이 코드 블록을 사용하고 내 9 릴레이의 상태를 설정하고있다. 이 코드를 더 짧은 형식으로 줄이기 위해 저를 그렇게 할 수있는 방법이 있습니까? 이 모든 명령문 대신에 for 문을 사용할 수 있습니까? 예를 들어 내가 좋아하는 코드를 작성하려합니다 :`

 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); 
     } 
     } 

`

이는 C 프로그래밍 언어로 표기 이런 종류의 일에 나를 위해 어떤 방법입니다. 미리 감사드립니다.

답변

4

전 처리기 이름에 인덱싱 할 수 없습니다. 그것들은 런타임 변수가 아니며 컴파일러가 코드를보기 전에 텍스트 대체를하기 위해 엄격히 사용됩니다.

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

는 그런 다음 포트/핀 데이터를 얻기 위해 배열에 인덱스를 사용하고, 찌를 수 있습니다 :

적절한 솔루션은 배열, 음, 같은 릴레이의 배열을 모델링하는 것입니다

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

시간과 노력에 감사드립니다. –