Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Cyclone V baremetal hellow world
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
RadiatoR
Всем доброго дня.
Написал небольшое приложение, которое выводит значение кнопки Key в консоль (плата de0-nano-soc).
Кнопка висит на GPIO54 (J18), что находится в группе GPIO1 со сдвигом (1 << 25). Пытаюсь прочитать ее значение с регистра ext_port_a, но она всегда в одном и том же состоянии - выключена. Такое ощущение, что не включено тактирование (аля как в STM32). Но регистр ext_port_a для GPIO0 иногда меняется. Видимо я что-то упустил? Не могу понять.
Вот код:

CODE
#include
#include "Types.h"

#define GPIO_BASE 0xFF708000
#define GPIO_0 GPIO_BASE
#define GPIO_1 GPIO_0 + 0x1000
#define GPIO_2 GPIO_1 + 0x1000

#define GPIO_EXT_PORT_A 0x50

#define GPIO_0_EXT_PORT_A GPIO_0 + GPIO_EXT_PORT_A
#define GPIO_1_EXT_PORT_A GPIO_1 + GPIO_EXT_PORT_A
#define GPIO_2_EXT_PORT_A GPIO_2 + GPIO_EXT_PORT_A

void delay(unsigned long long delay)
{
while(delay--);
}

#define PIN 25

void main()//int argc, char** argv
{
unsigned int step = 0;
//scanf("%d", &step);
while(true)
{
if((*((uint *)GPIO_0_EXT_PORT_A) & ((uint)1 << PIN)) > 0) printf("ON! gpio_0 Iteration: %d\n", step);
else printf("OFF! gpio_0 Iteration: %d\n", step);

if((*((uint *)GPIO_1_EXT_PORT_A) & ((uint)1 << PIN)) > 0) printf("ON! gpio_1 Iteration: %d\n", step);
else printf("OFF! gpio_1 Iteration: %d\n", step);

if((*((uint *)GPIO_2_EXT_PORT_A) & ((uint)1 << PIN)) > 0) printf("ON! gpio_2 Iteration: %d\n", step);
else printf("OFF! gpio_2 Iteration: %d\n", step);

printf("\n");

step++;

delay(100000000);
}
}


Заранее спасибо!
sonycman
Попробуйте сначала хотя бы снять сигнал сброса с модуля GPIO, вызвав alt_gpio_init()

В настройках HPS в QSys нужные пины настроены как GPIO?
RadiatoR
По поводу alt_gpio_init() есть проблема - не могу понять как заголовочные мне нужно подключить для работы с периферией hps.
У меня есть папка C:\intelFPGA\16.1\embedded\ip\altera\hps\altera_hps\hwlib\include и тут много заголовочных файлов, в том числе для gpio.
При добавлении в свойствах проекта

этой директории компилятор ругается на некоторые инклюды, например Error: #5: cannot open source input file "cstdbool": No such file or directory.

Вообще эклипс странный какой-то (запускаю через EDS shell - "eclipse &") просто в проекте не подтягивает cstdbool, более того при билде проекта не билдит его.
То есть если пожмакать в исходнике без ошибок кнопками просто в коде и забилдить - он напишет:
Код
17:17:10 **** Incremental Build of configuration Debug for project Altera-Cyclone-V_RAM ****
make all
make: Nothing to be done for 'all'.

17:17:10 Build Finished (took 73ms)
и типо нормально. Хотя ругаться на рандомный текст должен.
Хм, если сделать клин и опять билд, то он в консоли пишет, что билдит, все ок, но такого быть не может...
Что за идиотизм? Помогает перезагрузка... Странно очень.

Пока что не могу понять по исходникам что и где ресетится... Долго лазить, т.к. у меня они не подтягиваются... Сейчас буду бороться с эклипсом...

По поводу Qsys - раньше с ним дела не имел. Как я понял это планировщик ножек микросхемы?
А по дефолту ноги настроены на плис?

Открыл голд реф в квартусе. Тут есть верилог файл ghrd_top (видимо описание какая нога куда идет). Запустил qsys, появилось (графическое?) отображение



схемы соединения чего-то с чем-то. Есть блоки (instance?) hps_0, там есть hps_io, полагаю это блок GPIO и его нужно физически соединить с ногами.

Есть блоки button_pio и led_pio. Между hps_io и button_pio (external_connection) было уже какое-то серое (выключенное) соединение.
Я воткнул точки по этому соединению на обоих блоках. Сразу выскочило 13 ошибок. Видимо что-то пошло не так :D
Есть какой-то референс, где эти кнопки уже подключены?

А как в итоге заливается эта настройка ног? Через прошивку ПЛИС?
Или это всего лишь наглядное отображение, а потом на основе него генерируется верилоговский файл (ghrd_top.v), который уже компилируется квартусом и шьется?
sonycman
Цитата(RadiatoR @ Jul 23 2017, 19:02) *
компилятор ругается на некоторые инклюды, например Error: #5: cannot open source input file "cstdbool": No such file or directory.

Аналогично было.
Я не стал парится, а просто положил пустой файл с именем cstdbool в папку с исходниками и проблема ушла.
Нужные исходники hwlib тоже пришлось скопировать в отдельную папку проекта, чтобы они подключились и компилировались.

По поводу эклипса и билда - использую компилятор ARM, и в настройках C/C++ Build у меня включено Generate Makefiles Automatically.
Работает чётко, все изменения в проекте отслеживаются правильно, компилируются только модифицированные файлы.

Цитата
По поводу Qsys - раньше с ним дела не имел. Как я понял это планировщик ножек микросхемы?

Это интегратор системы, в котором задаются настройки модулей и их соединения.
В том числе QSys генерирует код, на основе которого загрузчик будет инициализировать процессор, настраивать пины, SDRAM, PLL и т.д.

К примеру, пины GPIO настраиваются в свойствах HPS на вкладке Peripheral Pins.

А планировщик ножек - это PinPlanner.

Вы бы матчасть поизучали получше.
Иначе SoC вам поднимать будет непросто sm.gif

Цитата
Есть какой-то референс, где эти кнопки уже подключены?

Вот в GHRD всё, что надо, подключено, изучайте его.

Цитата
А как в итоге заливается эта настройка ног? Через прошивку ПЛИС?

Загрузчиком - bootloader называется.
Тут было несколько тем, где подробнее разжёвано.
RadiatoR
Доброго дня.
К сожалению не много времени получается уделить освоению платки, но все же лучше чем ничего.
Разобрался с Qsys, голд референсом. Обнаружил модуль Reset manager, который все блокировал (я то по аналогии с stm32 работал, а там только тактирование...). Снял ресет с гпио -> отобразился ID портов 0x3230382A, увидел изменение регистра в gpio_ext_porta по нажатию кнопки. Здорово, вот только диодом так и не могу поморгать. Пытался работать с ним напрямую из памяти - не хочет. DDR естественно установлен. Вроде бы ограничений больше нет. В голд референсе выходы J18(кнопка) и A20(led) как и положены установлены в гпио. Сам светодиодик кстати слегка светится, думал это weak pull-up, убрал просто на tri stated, но светик так и остался слегка светящимся...

Что может еще ограничивать его включение?

Спасибо
sonycman
Настроить пины надо будет всё равно:
Код
    // Setup GPIOs
    // Reset GPIO module
    alt_gpio_init();
    ALT_GPIO_CONFIG_RECORD_t gpio_init_pins[] =
    {
        // HPS_LED
        { ALT_GPIO_1BIT_53, ALT_GPIO_PIN_OUTPUT, ALT_GPIO_PIN_LEVEL_TRIG_INT, ALT_GPIO_PIN_ACTIVE_LOW, ALT_GPIO_PIN_NODEBOUNCE, ALT_GPIO_PIN_DATAZERO },
        // HPS_KEY
        { ALT_GPIO_1BIT_54, ALT_GPIO_PIN_INPUT, ALT_GPIO_PIN_LEVEL_TRIG_INT, ALT_GPIO_PIN_ACTIVE_LOW, ALT_GPIO_PIN_DEBOUNCE, ALT_GPIO_PIN_DATAZERO }
    };
    status = alt_gpio_group_config(gpio_init_pins, ARRAY_COUNT(gpio_init_pins));
    assert(status == ALT_E_SUCCESS);

И затем уже можно будет изменять значение на пине функцией alt_gpio_port_data_write
RadiatoR
Выкинув некоторые куски непонятного asm кода из альтеровских библиотек они все таки скомпилились.
Провел инициализацию gpio с помощью alt_gpio_group_config и далее попробовал включить светик с помощью alt_gpio_port_data_write. Не получилось.
В обоих случаях функция возвращала "успех". Не удивительно, ведь эти функции всего лишь настраивают регистры GPIO, а именно прерывания, дебаунс и т.д. Все они находятся в дефолтном, выключенном состоянии и не меняются при вызове этих функций. Меняется только DDR регистр на 1 << 24 и DR регистр выставляет ту же единичку. Все это я проделывал напрямую через память. Светодиод продолжает очень тускло гореть. При изменении бита в DR яркость горения не меняется.

Вообще полагаю тут даже дело не в настройке, т.к. gpio на вход работает нормально. Это свидетельствует о наличии тактирования и вообще работоспособности интерфейса. Т.к. за выход отвечает только 1 бит в DDR, то настройка проведена верно. Загвоздка где-то рядом, но не тут. В общем буду копать дальше.

Кстати еще вопросик - у меня while цикл бесконечный. Если идти по шагам, то все ок. Если ткнуть "play", то PC прыгнет на код bootROM и будет там что-то делать. Кроме как прерыванию тут более нечему сработать. Почему так происходит? Какое прерывание может срабатывать и выбрасывать код опять в бут? Кстати при выбросе в бут GPIO опять падает в reset.
sonycman
А что у вас в настройках HPS в квартусе?
Нужные пины GPIO настроены верно?
Я же выше говорил уже про это:
Цитата
К примеру, пины GPIO настраиваются в свойствах HPS на вкладке Peripheral Pins.


Затем генерируете прелоадер с настройками своей системы, и он проведет необходимую низкоуровневую настройку - pinmux, reset manager и т.п.

Вы как свое приложение запускаете вообще?
RadiatoR
Добрый день.
В настройках hps 54 и 53 пины настроены как gpio. Собственно это в голд референсе было изначально. Это дело прошивается в плис, соответственно настраиваются тамошние свзяи (или не настраиваются?).
Далее я запускаю baremetal приложение (SD карта вообще не вставлена). Код загружается в 64кб RAM и стартует оттуда. Там уже сбрасывается ресет с гпио и инициализируется ножка на выход.
Получается прелоадера нет никакого, т.к. нет сд карты.
Я сегодня попробую перенастроить ножку кнопки на выход, ее включить и посмотреть что у нее там будет. Мало ли чего могло произойти с ногой светика, хотя вряд ли.
sonycman
Цитата(RadiatoR @ Oct 20 2017, 09:47) *
В настройках hps 54 и 53 пины настроены как gpio. Собственно это в голд референсе было изначально. Это дело прошивается в плис, соответственно настраиваются тамошние свзяи (или не настраиваются?).
Далее я запускаю baremetal приложение (SD карта вообще не вставлена). Код загружается в 64кб RAM и стартует оттуда. Там уже сбрасывается ресет с гпио и инициализируется ножка на выход.
Получается прелоадера нет никакого, т.к. нет сд карты.
Я сегодня попробую перенастроить ножку кнопки на выход, ее включить и посмотреть что у нее там будет. Мало ли чего могло произойти с ногой светика, хотя вряд ли.

Ну я так и понял, что вы занимаетесь ерундой.
Без прелоадера ничего у вас нормально работать не будет.
RadiatoR
Доброго вечера.
Через прелоадер неспортивно. Хочется понять какие модули нужно настроить чтобы заработал интерфейс. В дальнейшем так будет проще настраивать остальное, да и базовые знания будут лучше, чем "просто запустим прелоадер".
Итак QSys сгенерил голд референс. Там GPIO настроены как GPIO, что и требуется.
1. В программе первым делом сбрасываю вотчдог (с помощью ресет манагера) - именно он выкидывал меня куда-то в прерывание в бут если я не сбрасывал его.
2. Настраиваю GPLMUX53 на GPIO:
Код
*((uint *)0xFFD086A8) = 1;

3. Снимаю ресет на GPIO1
Код
RSTMGR->PERMODRST &= ~(uint(1 << 26));

4. GENERALIO5 уже находится в GPIO, поэтому обнулять его нам не нужно.
5. Настраиваю DDR у порта
Код
GPIO1->DDR |= 1 << 24;

6. Пытаюсь мигать с задержкой, регистры меняются, светик не светит =(
Код
        if(phase)
        {
            phase = false;
            GPIO1->DR = 1 << 24;
        }
        else
        {
            phase = true;
            GPIO1->DR &= ~(uint(1 << 24));
        }
        delay(2000000);


Прочитал про все менеджеры. Вроде бы более никто не контролирует GPIO. Уже совсем близко, но что-то еще держит...

Завтра попробую скомпилить прелоадер и поискать какой кусок кода инициализирует gpio, а то так можно бесконечно рыть...
RadiatoR
Всем доброго и с наступающим!
Как оказалось все это время порт был в tri-state состоянии, благодаря биту tristate в System manager -> VIO Control Register[2] (0xFFD08048) -> tristate.
Некая Freeze Control Group в систем манагере.
Итак светик заработал - это главное, а остальные DMA, ETH, FPGA manager и прочие пойдут как по маслу это точно :D
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.