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


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

Profile

x86128: (Default)
x86128

April 2023

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

Page Summary

Style Credit

Expand Cut Tags

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