簡體   English   中英

用於控制單個 GPIO 的 STM32 陣列

[英]STM32 array to control individual GPIO

我是嵌入式系統和 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 above
scanf (%d, fan_array);

這是否會根據輸入到陣列中的二進制值將控制每個風扇的 GPIO 引腳設置為高電平或低電平?

如果你仔細想想,有 256 種可能的組合,但你只對 8 個風扇感興趣,所以你需要檢查的只是 8 位:

#include <stdio.h>

#define STATE_ON    0x01
#define STATE_OFF    0x00

void enable_relay(unsigned char relay, unsigned char state)
{
    /* This is a brute force approach that enables any relay/port combination:
     * relay 8: PB2
     * relay 7: PB4
     * (...)
     * relay 1: PA1
     */

    switch(relay)
    {
        case 8:
            if(state == STATE_ON)
                GPIOB->ODR |= 0x0004;
            else
                GPIOB->ODR &= ~0x0004;
            break;
        case 7:
            if(state == STATE_ON)
                GPIOB->ODR |= 0x0010;
            else
                GPIOB->ODR &= ~0x0010;
            break;
        case 1:
            if(state == STATE_ON)
                GPIOA->ODR |= 0x0002;
            else
                GPIOA->ODR &= ~0x0002;
            break;
    }

}

void check_relay(unsigned char fan_map)
{
int i;
unsigned char bit;
unsigned char state;

    for(i=0; i < 8; i++) {
        bit = (fan_map&(0x01<<i));
        state = ((bit != 0)? STATE_ON : STATE_OFF);
        enable_relay( (8-i), state);
    }
}

int main(void)
{
    unsigned char fan_map = 0x0B; /* 0x0B = 00001011 */
    check_relay(fan_map);
}

您需要8-i部分,因為您的位順序與值順序相反(最左邊的位是 fan1)(MSB 是最左邊的位)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM