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

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...