x86128: (Default)
[personal profile] x86128
Продолжаю осваивать Quartus.

Для работы с внутренней флешкой MAX10 напрямую, решил собрать SoC с процессором Nios2.

Собирая Hello World с Nios2 вылазили, по-мелочи, всякие странные ошибки типа таких:


Хотя я и не просил:


Заглядываем в мастер систем:


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

Смотрим в отчет:



Сохраняем проект. В дизайнере платформы ставим снимаем галочки на преинициализации памяти, сохраняем и перегенерируем скрипты. Закрываем квартус. Открываем собираем проект - вуаля всё в порядке :)

Но дальше следующие грабли. Мастер генерирования HAL на базе Eclipse падает где угодно при показе File open dialog. Пришлось запускаться снова на Windows.

Генерируем файл описания платформы и проверяем что адреса областей памяти в Linker script верные и совпдают с теми что были в Platform Designer:



Все что нужно попадает в dram, а не flash.

Собираем Hello world и смотрим на него через nios2-terminal.exe (который цепляется сам к JTAG UART)



Запускаем на Nios2 такой код:
#include <stdio.h>
#include <stdint.h>
 
#define _MMIO_DWORD(mem_addr) (*(volatile uint32_t *)(mem_addr))
 
#define BIT0 0x1
#define BIT1 (0x1 << 1)
#define BIT2 (0x1 << 2)
#define BIT3 (0x1 << 3)
#define BIT4 (0x1 << 4)
#define BIT5 (0x1 << 5)
#define BIT6 (0x1 << 6)
#define BIT7 (0x1 << 7)
#define BIT8 (0x1 << 8)
#define BIT9 (0x1 << 9)
 
#define BIT23 (0x1 << 23)
 
 
#define F_CSR _MMIO_DWORD(0x89000)
#define F_CCR _MMIO_DWORD(0x89004)
 
#define F_SECTOR1(addr) _MMIO_DWORD(0x0+addr)
 
void print_status() {
    uint32_t t = F_CSR;
    printf("Flash is ");
    switch(& 0x3) {
        case 0: printf("IDLE "); break;
        case 1: printf("BUSY_ERASE "); break;
        case 2: printf("BUSY_WRITE "); break;
        case 3: printf("BUSY_READ "); break;
    }
 
    printf("\nWrite protect status:\n");
    printf("  Sector ID 1 is ");
    if (& BIT5) printf("protected"); else printf("open");
    printf("\n  Sector ID 2 is ");
    if (& BIT6) printf("protected"); else printf("open");
    printf("\n  Sector ID 3 is ");
    if (& BIT7) printf("protected"); else printf("open");
    printf("\n  Sector ID 4 is ");
    if (& BIT8) printf("protected"); else printf("open");
    printf("\n  Sector ID 5 is ");
    if (& BIT9) printf("protected"); else printf("open");
 
    printf("\nLast operation status (if any, default - failed)\n");
    printf("Read is ");
    if (& BIT2) printf("successful"); else printf("failed");
    printf("\nWrite is ");
    if (& BIT3) printf("successful"); else printf("failed");
    printf("\nErase is ");
    if (& BIT4) printf("successful"); else printf("failed");
    printf("\n");
}
 
void print_control() {
    uint32_t t = F_CCR;
    printf("Sector ID 1 is ");
    if (& BIT23) printf("write protected\n"); else printf("open\n");
}
 
int main()
{
    print_status();
    F_CCR = 0xffffffff;
    print_control();
    F_CCR = 0xffffffff ^ BIT23;
    print_control();
    printf("Data from address 0x0 is %08X\n", F_SECTOR1(0));
    printf("Writing data to address 0x0...\n");
    F_SECTOR1(0) = 0xcafebabe;
    printf("Waiting for IDLE...\n");
    while(F_CSR & 0x3);
    print_status();
    printf("Data from address 0x0 is %08X\n", F_SECTOR1(0));
}
 


Всё работает, ура!!!

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

x86128: (Default)
x86128

April 2023

S M T W T F S
      1
2345678
9101112131415
16171819202122
232425 26272829
30      

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2025 05:44 am
Powered by Dreamwidth Studios