Пытаюсь сделать эхо полученных данных по UART, т.е. дождаться символов с UART и передать обратно по UART. Я эмулирую плату LM3S811 в QEMU. Я приложил файл .c и код запуска и компоновщика. Я получаю ошибки при компиляции файла .c, и я не знаю, правильный ли подход для выполнения эха данных, полученных по UART. Было бы полезно, если бы были предоставлены какие-либо ссылки, объясняющие программирование на «голом железе» с нуля. Спасибо.
main.c
#define U0RBR (*((volatile unsigned int *) 0x4000C000))
#define U0DLL (*((volatile unsigned int *) 0x4000C000))
#define U0THR (*((volatile unsigned int *) 0x4000C000))
#define U0LCR (*((volatile unsigned int *) 0x4000C00C))
#define U0DLM (*((volatile unsigned int *) 0x4000C004))
#define U0LSR (*((volatile unsigned int *) 0x4000C014))
void UART0_init(void);
unsigned char UART0_RxChar(void);
void UART0_TxChar(char ch);
void UART0_init(void)
{
volatile unsigned int PINSEL0 = 0x0;
PINSEL0 = 0x00000005;
U0LCR = 0x83;
U0DLM = 0x00;
U0DLL = 0x61;
U0LCR = 0x03;
}
unsigned char UART0_RxChar(void)
{
while ((U0LSR & 0x01) == 0);
return U0RBR;
}
void UART0_TxChar(char ch)
{
U0THR = ch;
while ((U0LSR & 0x40) == 0);
}
int main(void)
{
char receive;
UART0_init();
while (1) {
receive = UART0_Rxchar();
UART0_TxChar(receive);
}
return 0;
}
запуск.s
.thumb
.global start
start:
.word 0x20001000
.word main
flash.ld
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00010000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00002000
}
SECTIONS
{
.text : {
*(.vectors);
*(.text);
etext = .;
} > FLASH
.rodata : {
*(.rodata);
} > FLASH
.data : {
sdata = .;
*(.data);
edata = .;
} > SRAM AT > FLASH
.bss : {
sbss = .;
*(.bss);
ebss = .;
} > SRAM
}
Ошибки при компиляции команды файла .c: arm-none-eabi-gcc -mthumb -mcpu=cortex-m3 - c main.c -o main.o
main.c:7:2: error: 'PINSEL0' undeclared (first use in this function)
PINSEL0 = PINSEL0 | 0x00000005;
^
main.c:7:2: note: each undeclared identifier is reported only once for each function it appears in
main.c:8:2: error: 'UOLCR' undeclared (first use in this function)
UOLCR = 0x83;
^
main.c:9:2: error: 'U0DLM' undeclared (first use in this function)
U0DLM = 0x00;
^
main.c:10:2: error: 'U0DLL' undeclared (first use in this function)
U0DLL = 0x61;
^
main.c:11:2: error: 'U0LCR' undeclared (first use in this function)
U0LCR = 0x03;
После добавления адреса регистра в Qemu печатается только символ «a», и я не могу ввести его в терминале. Вызванная команда была qemu-system-arm -M lm3s811evb -kernel main.bin -monitor stdio