Массив STM32 для управления отдельным GPIO - PullRequest
0 голосов
/ 28 сентября 2018

Я новичок во встроенных системах и программировании на C.В настоящее время я пытаюсь запрограммировать печатную плату с помощью микроконтроллера STM32 для управления массивом из 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, управляющие каждым вентилятором, высокими или низкими в соответствии с двоичными значениями, введенными в массив?

1 Ответ

0 голосов
/ 28 сентября 2018

Если подумать, существует 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 часть, поскольку ваш битовый порядок обратный (вентилятор1 - самый левый бит) с порядком значений (MSB - самый левый бит).

...