Разработка цифровых ИС на примере микроконтроллерного ядра SCR1 - прgграммное обеспечение
Это соответствует руководству SCR1 External Architecture Specification, раздел 7.3.
| 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, а также адрес, по которому находится строка, которую нам требуется вывести.


