12 февраля 2013 г.

Stellaris LaunchPad

Помнится я обещал написать что нибудь для часов eZ430-Chronos Но руки так и не дошли у меня поковырять их. Зато ко мне приехала платка Stellaris LaunchPad от того же Texas Instruments.
А вот до нее у меня руки уже дошли. Я не очень понимаю, почему все так мастурбируют на Arduino ну акромя конечно кучи примеров и библиотек. Ценник дорогой, Arduina UNO таже стоит от 20 австралийских баксов, за 3 элемента на плате, типа сонара и пары резюков требуют аж 10 автралийских баксов. А мощи то в ардуине както и не так уж и много.
Поглядел я на это дело и заказал Stellaris LaunchPad всего за 12.99USD. Иногда поговаривают бывает распродажа и можно купить ее за 4.99USD.
Причем плата на достаточно мощном ARM проце Cortex M4F.
Итак, чтож мы имеем в итоге:

Цена: 12.99USD
Процессор: 2xCortex M4F по 80Mhz каждый
Flash: 256kb
SDRAM: 32kb
Порты: USB, I2C
GPIO: 43
Таймеры: 12 штук
Вообщем хоть целую операционку можно написать и запускать и это все будет работать.
На плате также есть 2 кнопки для управления и 1 кнопка резет. Датчик температуры и прочие ништяки в виде 3x цветного светодиода.

Поковыряв стандартные экзамплы с миганием набортного светодиода, я решил что надо бы сделать свое мигание в стиле Arduino, чтобы было со своими кнопками и лампочками.
Для начала надо установить Code Composter Studio, как это делается я объяснять не буду, мануалов и интернетах полно, например можно это почитать тут.
Далее я собрал макетную плату, получилось что то типа такого:
С одной стороны:

С другой стороны:
Идея скетча состоит в том, чтобы при нажатии на кнопку загорался собственно тот светодиод с какой стороны нажата кнопка. Если нажаты обе кнопки, то загорается ближайший светодиод.

А теперь немного говнокода:
/*
 * main.c
 */
#include "inc/hw_gpio.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"
#include "drivers/buttons.h"
#include "driverlib/rom.h"
#include "led-test.h"

#define LED_FORWARD GPIO_PIN_0 // светодод FORWARD висит на выводе B0
#define LED_RIGHT GPIO_PIN_5 // светодод RIGHT висит на выводе B5
#define LED_LEFT GPIO_PIN_6 // светодод LEFT висит на выводе B6
#define LED_REVERS GPIO_PIN_7 // светодод REVERS висит на выводе B7

#define BUTTON_LEFT GPIO_PIN_4 // кнопочка 1 висит на выводе F4
#define BUTTON_RIGHT GPIO_PIN_0 // кнопочка 2 висит на выводе F0
#define BUTTON_ALL BUTTON_LEFT|BUTTON_RIGHT // обе кнопки

void main(void) {
    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); // выставляем частоту

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // включаем GPIO группу B в нее у нас воткнуты светодиоды
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); // включаем GPIO группу F - это кнопки

    HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD; // страшное колдунство заставляющее кнопки работать
    HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0x01; // страшное колдунство заставляющее кнопки работать
    HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0; // страшное колдунство заставляющее кнопки работать

    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,LED_RIGHT); // инициализируем светодиод RIGHT
    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,LED_LEFT); // инициализируем светодиод LEFT
    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,LED_FORWARD);  // инициализируем светодиод FORWARD
    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,LED_REVERS); // инициализируем светодиод REVERS

    GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, BUTTON_ALL); // инициализируем кнопки
    GPIOPadConfigSet(GPIO_PORTF_BASE, BUTTON_LEFT, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); // конфигурируем кнопки
    GPIOPadConfigSet(GPIO_PORTF_BASE, BUTTON_RIGHT, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); // конфигурируем кнопки

    GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD|LED_REVERS|LED_LEFT|LED_RIGHT, 0x0); // пишем на всякий случай во все светодиодные регистры 0, чтобы светодиоды потухли

    for(;;) { // бесконечный цикл
        unsigned long key_switch; // создаем переменную
        key_switch = GPIOPinRead(GPIO_PORTF_BASE, BUTTON_ALL); // получим в переменную состояние кнопок

//LEFT
        if(key_switch == 1) { //если в переменной key_switch обнаружим 1
            GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD, 0x0); // гасим светодиод FORWARD
            GPIOPinWrite(GPIO_PORTB_BASE,LED_LEFT, 0x40); // зажигаем светодиод LEFT
            SysCtlDelay(3000000); // задержка в 3мс
            GPIOPinWrite(GPIO_PORTB_BASE,LED_LEFT, 0x0); // гасим светодиод LEFT
            SysCtlDelay(3000000); // задержка в 3мс
        }

//RIGHT
        if(key_switch == 16) { //если в переменной key_switch обнаружим 16
            GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD, 0x0); // гасим светодиод FORWARD
            GPIOPinWrite(GPIO_PORTB_BASE,LED_RIGHT, 0x20); // зажигаем светодиод RIGHT
            SysCtlDelay(3000000); // задержка в 3мс
            GPIOPinWrite(GPIO_PORTB_BASE,LED_RIGHT, 0x0); // гасим светодиод RIGHT
            SysCtlDelay(3000000); // задержка в 3мс
        }

//REVERSE
        if(key_switch == 0) { //если в переменной key_switch обнаружим 0
            GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD, 0x0); // гасим светодиод FORWARD
            GPIOPinWrite(GPIO_PORTB_BASE,LED_REVERS, 0x80); // зажигаем светодиод REVERS
        }

//FORWARD
        if(key_switch == 17) { //если в переменной key_switch обнаружим 17
            GPIOPinWrite(GPIO_PORTB_BASE,LED_REVERS, 0x0); // гасим светодиод REVERS
            GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD, 0x1); // зажигаем светодиод FORWARD
        }

    }
}

Теперь можно посмотреть как это все работает в живую:

В принципе и все, часть кода мне самому непонятна, взял из всяких скетчей посвященных Stellaris LaunchPad, особенно с выставлением регистров на кнопках.
Так что буду дальше разбираться.

Комментариев нет:

Отправить комментарий