Ошибка переполнения UART при попытке записи в регистр хранения передачи (U0THR) - PullRequest
1 голос
/ 10 апреля 2020

Итак, у меня есть терминал, подключенный к контактам TxD0 и RxD0. Допустим, я просто хочу проверить, работает ли запись в него в конце концов.

Я написал несколько функций, чтобы UART мог читать и записывать символы и строки. Хотя, если я попытаюсь запустить его в симуляторе, он выдаст ошибку переполнения.

Вот функции в файле uart. c:

void uart0_write(unsigned char reg_data)
{
    while((U0LSR & (0x20)) != 0x20);/*wait until holding register is empty*/
    U0THR = (int) reg_data;/*write to holding register*/
}

void uart0_write_str(char str[])
{
    while(*str != '\0')/*check for EOF*/
    {
        uart0_write(*str);/*write a char*/
        str++;
    }
}

Функция инициализации UART0:

void uart0_init(void)
{
    PINSEL0 = 0x05; /*set pin P0.0 to TXD0 and P0.1 RxD0 (TXD0 - 01; RxD0 - 01; 0101 = 0x05)*/
    U0LCR = 0x83; /*set length for 8-bit word, set the stop bit, enable DLAB*/
    U0IER = (1<<0) | (1<<1);/*enable RBR and THR interrupts*/
    U0FCR = 0xC7; /*enable FIFO; reset Tx FIFO; set interrupt after 14 characters*/

    /*Baud rate configured to 9600 Baud (from lecture notes)*/
    U0DLL = 0x9D;
    U0DLM = 0x0;
    U0LCR = 0x03; /*8-bit character selection; disable DLAB*/
}

Примерное использование в основном:

int main(void)
{
    char *introMsg;
    introMsg = "Hello World\n";

    systemInit();
    ADC_init();
    timer0_init();
    uart0_init();

    uart0_write_str(introMsg);

    /*or: */
    while(1)
    {
         uart0_write('c');
    }
    return 0;
}

С этими демонстрационными фрагментами кода UART должен работать правильно, как я видел в других местах в Интернете. Но при попытке запустить его ничего не печатается и выскакивает OE. Что я делаю неправильно? Я только начинаю погружаться в глубины программирования на голом металле, поэтому, возможно, есть какая-то ошибка, которую я не заметил.

Я бы приветствовал любые идеи!

Оставайтесь дома,

Иаков

...