|
Cyclone V baremetal hellow world |
|
|
|
Jul 23 2017, 08:38
|

Местный
  
Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901

|
Всем доброго дня. Написал небольшое приложение, которое выводит значение кнопки 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); } } Заранее спасибо!
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Jul 23 2017, 15:02
|

Местный
  
Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901

|
По поводу 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), который уже компилируется квартусом и шьется?
|
|
|
|
|
Jul 23 2017, 23:40
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(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 вам поднимать будет непросто  Цитата Есть какой-то референс, где эти кнопки уже подключены? Вот в GHRD всё, что надо, подключено, изучайте его. Цитата А как в итоге заливается эта настройка ног? Через прошивку ПЛИС? Загрузчиком - bootloader называется. Тут было несколько тем, где подробнее разжёвано.
|
|
|
|
|
Oct 18 2017, 20:16
|

Местный
  
Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901

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

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Настроить пины надо будет всё равно: Код // 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
|
|
|
|
|
Oct 19 2017, 17:49
|

Местный
  
Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901

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

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
А что у вас в настройках HPS в квартусе? Нужные пины GPIO настроены верно? Я же выше говорил уже про это: Цитата К примеру, пины GPIO настраиваются в свойствах HPS на вкладке Peripheral Pins. Затем генерируете прелоадер с настройками своей системы, и он проведет необходимую низкоуровневую настройку - pinmux, reset manager и т.п. Вы как свое приложение запускаете вообще?
|
|
|
|
|
Jan 25 2018, 20:07
|

Местный
  
Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901

|
Доброго вечера. Через прелоадер неспортивно. Хочется понять какие модули нужно настроить чтобы заработал интерфейс. В дальнейшем так будет проще настраивать остальное, да и базовые знания будут лучше, чем "просто запустим прелоадер". Итак 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, а то так можно бесконечно рыть...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|