2017-03-24 29 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如何更改我的功能输入与字符数组

之后,我调整了继电器状态(“GPIO引脚状态”),熟悉HAL函数。例如,在每个cylce我设置我的9个继电器与我使用这个代码块中的微控制器引脚这个`

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

    } 
`. 

我的问题是这样的状态。有没有办法让我这样做,以缩短这种代码的形式。我可以使用循环,而不是所有的语句。例如,我想编写代码,如:`

 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

您不能索引到预处理器名称,no。它们不是运行时变量,在编译器甚至看到代码之前,它们被严格用于文本替换。

正确的解决方案是你的继电器作为,以及,一个数组的数组型号:

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

非常感谢您的时间和精力 –

相关问题