Опубликован: 04.08.2025 | Доступ: свободный | Студентов: 7 / 0 | Длительность: 02:58:00
Лекция 5:

Разработка цифровых ИС на примере микроконтроллерного ядра SCR1 - прgграммное обеспечение

Это соответствует руководству SCR1 External Architecture Specification, раздел 7.3.

Table30; Map of IPIC registers
Offset Mnemonic Name
0x00 IPIC_CISV Current Interrupt Vector in Service
0x01 IPIC_CICSR Current Interrupt Control Status Register
0x02 IPIC_IPR Interrupt Pending Register
0x03 IPIC_ISVR Interrupts in Service Register

Bare-metal драйвера: UART

Примеры из драйвера UART (заголовочный файл uart.h)

Соответствует стандарту Xilinx AXI UART 16550.

// Base addr
#define SC1F_UART0_PORT 0xff010000

#define UART_115200_CLK_DIVISOR <длинная формула>

// UART regs
#define SC1F_UART_RXD            (0x00)
#define SC1F_UART_TXD            (0x00)
#define SC1F_UART_IER              (0x04)
…
// UART FIFO control register bits
#define SC1F_UART_FCR_RT_1 (0 << 6)
#define SC1F_UART_FCR_RT_4 (1 << 6)
…
// UART status register bits
#define SC1F_UART_ST_TEMPTY (1 << 6) // tx empty
…

Программный код загрузчика

Для работы с препроцессорными директивами расширение файла должно быть "S"". Начальный фрагмент файла bootloader.S, содержащего исходный код загрузчика:

#include "riscv_csr_encoding.h"
#include "ipic.h" 
#include "uart.h"

.section ".text.init"
.align 4
.globl _crt_start

В отдельные заголовочные файлы вынесены определения, упрощающие написание кода.

! Полный код загрузчика с комментариями можно найти в предоставляемом архиве 5_SW_lab_collateral.zip в директории my_boot.

Инициализация целочисленных регистров осуществляется следующим образом:

_crt_start:
          li x1, 0
…
           li x31, 0

Затем ядро совершает переход по адресу reset_vector, где происходит инициализация mtvec - CSR регистра, содержащего адрес обработчика прерываний (trap_vector). По этому адресу совершится переход в случае возникновения прерывания или исключения.


Программный код загрузчика: IPIC

Далее требуется разрешить прерывания, установив соответствующие биты регистра mie и бит MIE регистра mstatus. После этого происходит инициализация регистров контроллера прерываний IPIC. Описание его работы можно найти в SCR1 External Architecture Specification.


Программный код загрузчика: UART

Для начала нужно установить делитель частоты. Скорость передачи данных устанавливается в 115200 бод, что учитывается в формуле в uart.h. Доступ к делителю разблокируется через регистр контроля UART.


Вывод отладочного сообщения

init_m_mode:

               li a0, MSTATUS_MPIE
               csrs mstatus, a0

               la t0, transmit_debug_message
               csrw mepc, t0
               mret

В данном блоке кода осуществляется возврат (mret) из загрузчика по заданному адресу. В нашем случае, на функцию вывода отладочного сообщения.

.section ".text"
transmit_debug_message:

              /* Debug message */
              li s0, SC1F_UART0_PORT

              la a6, message

Секция .text содержит в себе код. Вновь записываем базовый адрес UART, а также адрес, по которому находится строка, которую нам требуется вывести.