用于控制各个GPIO的阵列

2019-07-14 17:13发布

我是嵌入式系统和C编程的新手。我目前正在尝试使用STM32微控制器对PCB进行编程,以便在收到单个命令后控制8个风扇的阵列。即00001011将打开风扇5,7和8.总共有256种可能的组合,对每个单独的组合进行编程效率不高。我正在考虑使用一个数组来实现这一点,如:fan_array[8] = {fan1, fan2, fan3, fan4, fan5, fan6, fan7, fan8};printf ("Input fan state"); // user would input binary number as shown abovescanf (%d, fan_array);这是否会根据输入到阵列中的二进制值将GPIO引脚设置为控制每个风扇的高电平值还是低电平?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
成长的小师弟
1楼-- · 2019-07-15 00:04
 精彩回答 2  元偷偷看……
huangdajiang
2楼-- · 2019-07-15 01:21
所以我一直在研究BSRR寄存器,这似乎是控制风扇的最佳方式。我知道设置代码的位是这样的:GPIOA - > BSRR =(1 << 5)将PA5设置为1.但是如果我输入一个命令,如10101011(这将打开风扇1, 3,5,7和8)我如何能够分离命令并将每个位分配给一个引脚?
jenny042
3楼-- · 2019-07-15 07:16
您可能需要查看STM32Fxxx参考手册,BSRR部分。
c1441424
4楼-- · 2019-07-15 12:36
如果将风扇连接到GPIO端口的8位,则可以将字节值直接写入端口,每个风扇仅响应其位。不需要任何花哨的软件。
c1441424
5楼-- · 2019-07-15 13:21

scanf (%d, fan_array);
它将整数读入数组的第一个元素。scanf%d读入指向整数的指针。fan_array是指向第一个元素fan_array [0]的指针。

你可以“ 轻松地 ” 使用查找表做你想做的事......如果你知道你的指针。

// 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
  }
}
hzp_bbs1
6楼-- · 2019-07-15 13:21
 精彩回答 2  元偷偷看……

一周热门 更多>