大家好我正在使用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 PIN STATUS"),并且具有众所周知的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循环,而不是所有语句。例如,我想编写一个代码:`
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编程语言中使用这种表示法。提前谢谢。
答案 0 :(得分: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);
}