Перейти к содержанию

    

Cyclone V baremetal hellow world

Всем доброго дня.

Написал небольшое приложение, которое выводит значение кнопки Key в консоль (плата de0-nano-soc).

Кнопка висит на GPIO54 (J18), что находится в группе GPIO1 со сдвигом (1 << 25). Пытаюсь прочитать ее значение с регистра ext_port_a, но она всегда в одном и том же состоянии - выключена. Такое ощущение, что не включено тактирование (аля как в STM32). Но регистр ext_port_a для GPIO0 иногда меняется. Видимо я что-то упустил? Не могу понять.

Вот код:

 

#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);
   }
}

 

Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В настройках HPS в QSys нужные пины настроены как GPIO?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу alt_gpio_init() есть проблема - не могу понять как заголовочные мне нужно подключить для работы с периферией hps.

У меня есть папка C:\intelFPGA\16.1\embedded\ip\altera\hps\altera_hps\hwlib\include и тут много заголовочных файлов, в том числе для gpio.

При добавлении в свойствах проекта

prop.png

этой директории компилятор ругается на некоторые инклюды, например 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, появилось (графическое?) отображение

 

qsys.png

 

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

 

Есть блоки button_pio и led_pio. Между hps_io и button_pio (external_connection) было уже какое-то серое (выключенное) соединение.

Я воткнул точки по этому соединению на обоих блоках. Сразу выскочило 13 ошибок. Видимо что-то пошло не так :D

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

 

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

Или это всего лишь наглядное отображение, а потом на основе него генерируется верилоговский файл (ghrd_top.v), который уже компилируется квартусом и шьется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
компилятор ругается на некоторые инклюды, например 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 вам поднимать будет непросто :)

 

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

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

 

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

Загрузчиком - bootloader называется.

Тут было несколько тем, где подробнее разжёвано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго дня.

К сожалению не много времени получается уделить освоению платки, но все же лучше чем ничего.

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

 

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

 

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Настроить пины надо будет всё равно:

    // 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкинув некоторые куски непонятного 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что у вас в настройках HPS в квартусе?

Нужные пины GPIO настроены верно?

Я же выше говорил уже про это:

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

 

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

 

Вы как свое приложение запускаете вообще?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

В настройках hps 54 и 53 пины настроены как gpio. Собственно это в голд референсе было изначально. Это дело прошивается в плис, соответственно настраиваются тамошние свзяи (или не настраиваются?).

Далее я запускаю baremetal приложение (SD карта вообще не вставлена). Код загружается в 64кб RAM и стартует оттуда. Там уже сбрасывается ресет с гпио и инициализируется ножка на выход.

Получается прелоадера нет никакого, т.к. нет сд карты.

Я сегодня попробую перенастроить ножку кнопки на выход, ее включить и посмотреть что у нее там будет. Мало ли чего могло произойти с ногой светика, хотя вряд ли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В настройках hps 54 и 53 пины настроены как gpio. Собственно это в голд референсе было изначально. Это дело прошивается в плис, соответственно настраиваются тамошние свзяи (или не настраиваются?).

Далее я запускаю baremetal приложение (SD карта вообще не вставлена). Код загружается в 64кб RAM и стартует оттуда. Там уже сбрасывается ресет с гпио и инициализируется ножка на выход.

Получается прелоадера нет никакого, т.к. нет сд карты.

Я сегодня попробую перенастроить ножку кнопки на выход, ее включить и посмотреть что у нее там будет. Мало ли чего могло произойти с ногой светика, хотя вряд ли.

Ну я так и понял, что вы занимаетесь ерундой.

Без прелоадера ничего у вас нормально работать не будет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго вечера.

Через прелоадер неспортивно. Хочется понять какие модули нужно настроить чтобы заработал интерфейс. В дальнейшем так будет проще настраивать остальное, да и базовые знания будут лучше, чем "просто запустим прелоадер".

Итак 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, а то так можно бесконечно рыть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем доброго и с наступающим!

Как оказалось все это время порт был в tri-state состоянии, благодаря биту tristate в System manager -> VIO Control Register[2] (0xFFD08048) -> tristate.

Некая Freeze Control Group в систем манагере.

Итак светик заработал - это главное, а остальные DMA, ETH, FPGA manager и прочие пойдут как по маслу это точно :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация