Перейти к содержанию
    

Как сконфигурировать второй UART в Tiva TM4C123?

Вкуривание документации и просмотр учебных видео мне не помогло.

Помогите, что надо поправить в коде, чтобы задействовать UART1 на плате TI Tiva TM4C123?

Вот код из учебника, который рассказывает иностранный дядечка.

Первые две строчки я понял как расширить на пару портов, я вот дальше...

Я хочу оставить UART0 для отладочных сообщений, тогда как UART1 работает с внешней аппаратурой.

Даташит на плату вот:

http://www.ti.com/general/docs/lit/getlite...mp;fileType=pdf

 

#include <lm4f120h5qr.h>

char readChar(void);
void printChar(char c);
void printString(char * string);

int main(void) { 
 char c;
 // 1. Enable the UART module using the RCGCUART register (see page 344).
 SYSCTL->RCGCUART |= (1<<0)|(1<<1);

 // 2. Enable the clock to the appropriate GPIO module via the RCGCGPIO register (see page 340).
 SYSCTL->RCGCGPIO |= (1<<0)|(1<<1);

 // 3. Set the GPIO AFSEL bits for the appropriate pins (see page 671 To determine which GPIOs to
 // configure see table 23-4 on page 1344
 GPIOA->AFSEL = (1<<1)|(1<<0);

 // 4. Configure the GPIO current level and/or slew rate as specified for the mode selected (see
 // page 673 and page 681

 // 5. Configure the PMCn fields in the GPIOPCTL register to assign the UART signals to the appropriate 
 // pins (see page 688 and Table 23-5 on page 1351).
 GPIOA->PCTL = (1<<0)|(1<<4);

 GPIOA->DEN = (1<<0)|(1<<1);

 // Find the Baud-Rate Divisor
 // BRD = 16,000,000 / (16 * 9600) = 104.1666666666666666666666666666666
 // UARTFBRD[DIVFRAC] = integer(0.166667 * 64 + 0.5) = 11

 // With the BRD values in hand, the UART configuration is written to the module in the following order

 // 1. Disable the UART by clearing the UARTEN bit in UARTCTL register
 UART0->CTL &= ~(1<<0);

 // 2. Write the integer portion of the BRD to the UARTIBRD register
 UART0->IBRD = 104;
 // 3. Write the fractional portion of the BRD to the UARTFBRD register
 UART0->FBRD = 11;

 // 4. Write the desired serial parameters to the UARTLCTL register
 UART0->LCRH = (0x3<<5);

 // 5. Configure the UART clock source by written to the UARTCC register
 UART0->CC = 0x0;

 // 6. 
 // 7. Enable the USRT by setting the UARTEN bit in the UARTCTL register
 UART0->CTL = (1<<0)|(1<<8)|(1<<9);

 //Configure LED pins
 SYSCTL->RCGCGPIO |= (1<<5); // enable clock on PortF
 GPIOF->DIR = (1<<1)|(1<<2)|(1<<3); //make LED pins (PF1 PF2 PF3) outputs
 GPIOF->DEN = (1<<1)|(1<<2)|(1<<3); // enable digitalfunctions for the LED pins
 GPIOF->DATA &= ~((1<<1)|(1<<2)|(1<<3)); // turn off leds

 while(1) {
printString("Enter \"r\", \"g\", or \"b\":\n\r");

c = readChar();
printChar©;
printString("\n\r");
switch© {
case 'r':
  GPIOF->DATA = (1<<1); // red LED on
  break;
case 'b':
  GPIOF->DATA = (1<<2); // blue LED on
  break;  
case 'g':
  GPIOF->DATA = (1<<3); // red LED on
  break;
default:
  GPIOF->DATA &= ~(1<<1)|(1<<2)|(1<<3); // red LED on
  break;	  
}
}
}
char readChar(void){
char c;
while((UART0->FR & (1<<4)) != 0);
c = UART0->DR;
return c;
}

void printChar(char c) {
while((UART0->FR & (1<<5)) != 0);
UART0->DR = c;
}   

void printString(char * string) {
while(*string) 
{
	printChar(*(string++));
}
}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажите, а у вас хоть что то, заработало при записи настроек и команд прямо в регистры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажите, а у вас хоть что то, заработало при записи настроек и команд прямо в регистры?

Да с UART0 все работает.

Маленький фолт был замечен при работе команды switch:

выключить вообще все светодиоды возможно только после красного.

А так все переключается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вам советую использовать встроенные в ROM API функции, мы хотели использовать этот процессор три года назад, и корректно всё работало при использовании API функций, это не понравилось нашим программистам и мы от него отказались. А чем он вас превлёк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вам советую использовать встроенные в ROM API функции, мы хотели использовать этот процессор три года назад, и корректно всё работало при использовании API функций, это не понравилось нашим программистам и мы от него отказались. А чем он вас превлёк?

Меня устроил бы любой АРМ Кортех, а этот пылился в коробке.

Пока никаких симпатий-антипатий.

В силу того что потребуется отладка на уровне ассемблера, хочется понять что же написано в документации.

Но вот "забуксовал" чего то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В силу того что потребуется отладка на уровне ассемблера, хочется понять что же написано в документации.

Начать с изучения системы тактирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начать с изучения системы тактирования.

И?

а по существу что то можете сказать?

Ну если не знаете или не хотите говорить, ну прошел мимо и все!

В чем проблема, то?

Вы не поверите, с системой тактирования давно разобрался и не только с этим процом.

Изменено пользователем kuka_v

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть несколько вариантов.

Первый - сделать тоже самое, что сделано у вас для UART0, но только для UART1,

включая выводы UART1 с пункта

// 1. Enable the UART module using the RCGCUART register (see page 344).

до пункта

// 7. Enable the USRT by setting the UARTEN bit in the UARTCTL register

 

Второй - набрать в гугле: TM4C123 UART1 и получить во третьей ссылке

https://github.com/rosterloh/UT.6.01x/blob/...ter/UART/UART.c, посмотреть,

разобраться, закомметировать все, что относится к UART0 и раскомментировать

все, что относится к UART1.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть несколько вариантов.

Первый - сделать тоже самое, что сделано у вас для UART0, но только для UART1,

включая выводы UART1 с пункта

 

до пункта

 

 

Второй - набрать в гугле: TM4C123 UART1 и получить во третьей ссылке

https://github.com/rosterloh/UT.6.01x/blob/...ter/UART/UART.c, посмотреть,

разобраться, закомметировать все, что относится к UART0 и раскомментировать

все, что относится к UART1.

Спасибо!

За материал к классу особенно!

Сколько ни мучал гугл, сюда он меня не приводил.

Я еще раз все проверю. Вообщем то я ожидал что пройдя все что для UART0 и поправив все на значения для UART1 у меня все получится.

Но не тут то было.

У меня сейчас на PB0/PB1GND (это UART1) висит Profilic преобразователь и воткнут в отдельную винду. Но пока там тишина, как я не мучал плату.

Когда две неизвестных сложнее искать причину. Если бы я был уверен в коде, то грешил бы на преобазователь.

 

Ан нет на этот курс я натыкался. Он показался мне длинноватым.

Да и материалов к курсу я не увидел.

Буду пересматривать.

Еще раз спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

..Сколько ни мучал гугл...

 

вот jcxz скорее всего ближе к теме кмк.

Вам скорее всего правильно подсказал.

 

в кортексах бывает, что тактирование с разных шин идёт либо с разных предделителей.

 

удачи вам

(круглый)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот jcxz скорее всего ближе к теме кмк.

Вам скорее всего правильно подсказал.

в кортексах бывает, что тактирование с разных шин идёт либо с разных предделителей.

Тут типичная картина:

Сколько ни мучал гугл, сюда он меня не приводил.

Я еще раз все проверю. Вообщем то я ожидал что пройдя все что для UART0 и поправив все на значения для UART1 у меня все получится.

Но не тут то было.

Чел "мучает гугл", ковыряет наугад чужие исходники. Вместо того чтобы открыть и прочитать даташит на МК. Отсюда и все проблемы.

Любая помощь тут бессмысленна.

 

С семейством TM4C123 не работал, но с TM4C129 - плотно работаю сейчас. Периферия у них вроде похожая.

Ничего кроме даташита на МК и юзермануала я не читал, никаких "гуглов не мучал", но вся периферия заработала быстро, в том числе и все UART-ы.

Настраиваю тактирование ядра и сис.шины (PLL и т.п.), настраиваю пины (периферия - GPIO), потом:

PeripheralOn(concat(PERIPH_UART, nUART_service)); //подача импульса reset, включение питания и тактирования для указанной периферии

UARTinit(115200, UART_FORMAT(UART_DATA_8, UART_STOP_1, UART_PARITY_NO), &concat(UART, nUART_service)); //инит UART с номером nUART_service

и так все необходимые UART. Разрешаю прерывания и всё - работает.

Тактирование всех UART у меня от частоты сис.шины (UARTx.CC = 0).

//CCLK_MH - частота сис.шины (и ядра)
enum PERIPH {
 PERIPH_WDT0   = 0x0000,
 PERIPH_WDT1   = 0x0001,
 PERIPH_TMR0   = 0x0010,
 PERIPH_TMR1   = 0x0011,
 PERIPH_TMR2   = 0x0012,
 PERIPH_TMR3   = 0x0013,
 PERIPH_TMR4   = 0x0014,
 PERIPH_TMR5   = 0x0015,
 PERIPH_TMR6   = 0x0016,
 PERIPH_TMR7   = 0x0017,
 PERIPH_GPIOA  = 0x0020,
 PERIPH_GPIOB  = 0x0021,
 PERIPH_GPIOC  = 0x0022,
 PERIPH_GPIOD  = 0x0023,
 PERIPH_GPIOE  = 0x0024,
 PERIPH_GPIOF  = 0x0025,
 PERIPH_GPIOG  = 0x0026,
 PERIPH_GPIOH  = 0x0027,
 PERIPH_GPIOJ  = 0x0028,
 PERIPH_GPIOK  = 0x0029,
 PERIPH_GPIOL  = 0x002A,
 PERIPH_GPIOM  = 0x002B,
 PERIPH_GPION  = 0x002C,
 PERIPH_GPIOP  = 0x002D,
 PERIPH_GPIOQ  = 0x002E,
 PERIPH_DMA    = 0x0030,
 PERIPH_EPI    = 0x0040,
 PERIPH_HIB    = 0x0050,
 PERIPH_UART0  = 0x0060,
 PERIPH_UART1  = 0x0061,
 PERIPH_UART2  = 0x0062,
 PERIPH_UART3  = 0x0063,
 PERIPH_UART4  = 0x0064,
 PERIPH_UART5  = 0x0065,
 PERIPH_UART6  = 0x0066,
 PERIPH_UART7  = 0x0067,
 PERIPH_SSI0   = 0x0070,
 PERIPH_SSI1   = 0x0071,
 PERIPH_SSI2   = 0x0072,
 PERIPH_SSI3   = 0x0073,
 PERIPH_I2C0   = 0x0080,
 PERIPH_I2C1   = 0x0081,
 PERIPH_I2C2   = 0x0082,
 PERIPH_I2C3   = 0x0083,
 PERIPH_I2C4   = 0x0084,
 PERIPH_I2C5   = 0x0085,
 PERIPH_I2C6   = 0x0086,
 PERIPH_I2C7   = 0x0087,
 PERIPH_I2C9   = 0x0088,
 PERIPH_I2C10  = 0x0089,
 PERIPH_USB    = 0x00A0,
 PERIPH_CAN0   = 0x00D0,
 PERIPH_CAN1   = 0x00D1,
 PERIPH_ADC0   = 0x00E0,
 PERIPH_ADC1   = 0x00E1,
 PERIPH_ACMP   = 0x00F0,
 PERIPH_PWM    = 0x0100,
 PERIPH_QEI    = 0x0110,
 PERIPH_EEPROM = 0x0160,
 PERIPH_CCM    = 0x01D0,
 PERIPH_EMAC   = 0x0270
};

//return: 1 - если соотв.периферия доступна (включена, затактирована и сигнал сброса снят с неё).
int PeripheralReady(PERIPH periph)
{
 return *BITBAND_IO(&SYSCTL.PR.M[periph >> 4], periph & 15);
}

void PeripheralOn(PERIPH periph)
{
 *BITBAND_IO(&SYSCTL.SR.M[periph >> 4], periph & 15) = 1;
 *BITBAND_IO(&SYSCTL.PC.M[periph >> 4], periph & 15) = 1;
 *BITBAND_IO(&SYSCTL.RCGC.M[periph >> 4], periph & 15) = 1;
 __DMB();
 *BITBAND_IO(&SYSCTL.SR.M[periph >> 4], periph & 15) = 0;
 __DMB();
 while (!PeripheralReady(periph));
}

//Инициализация UART.
//baudrate - скорость
//format - формат (может быть создан макросом UART_FORMAT())
//io - указатель на порты IO UART
//return: false - невозможно установить данную baudrate
bool UARTinit(u32 baudrate, u32 format, volatile HwRegsUART *io)
{
 #define K 8
 static u32 const tcclk[] = {CCLK_MH * (1ULL << K) / OVERSAMPLING,
   CCLK_MT * (1ULL << K) / OVERSAMPLING};
 u32 c, i;
 io->CTL = 1 << UART_CTL_EOT | ((OVERSAMPLING == 8) ? 1: 0) << UART_CTL_HSE;
 i = (format & 3) << UART_LCRH_WLEN | (format & B2) << UART_LCRH_STP2 - 2;
 if ((s32)(format = (format >> 3) - 1) >= 0) i |= 1 << UART_LCRH_PEN |
   (format & 1) << UART_LCRH_EPS | format >> 1 << UART_LCRH_SPS;
 while (io->FR & 1 << UART_FR_BUSY);
 io->LCRH = i;
 io->CC = 0;
 c = tcclk[cclkRun] / baudrate + (1 << K - 7);
 io->IBRD = c >> K;
 io->FBRD = c >> K - 6 & B6 - 1;
 while (!(io->FR & 1 << UART_FR_RXFE)) { int cc = io->DR; }
 io->IM = 0;
 io->ICR = B13 - 1 | B16 | B17;
 io->IFLS = 0 << UART_IFLS_TXIFLSEL | 2 << UART_IFLS_RXIFLSEL;
 io->ECR = 15;
 io->LCRH = i | 1 << UART_LCRH_FEN;
 io->CTL = ((OVERSAMPLING == 8) ? 1: 0) << UART_CTL_HSE;
 return true;
 #undef K
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чел "мучает гугл", ковыряет наугад чужие исходники. Вместо того чтобы открыть и прочитать даташит на МК. Отсюда и все проблемы.

Любая помощь тут бессмысленна.

 

Добрее надо к людям относится! Свою "крутизну" в другом месте показывать надо...

 

Чел прочитал и даташит несколько раз и видео инструкции послушал.

И только выполнял урок из видео, использую метод "шаг в сторону"

 

В коде была ошибка-опечатка и другой "опытный! чел мог бы и указать на нее.

Ошибка была в адресе бита-регистра потому компилятор это не видел.

Изменено пользователем kuka_v

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В коде была ошибка-опечатка и другой "опытный! чел мог бы и указать на нее.

Ошибка была в адресе бита-регистра потому компилятор это не видел.

Вообще-то я сравнил (по диагонали конечно) периферию TM4C123 и TM4C129, увидел что они похоже совпадают, вырезал из своего кода для TMC4C129 всё, что должно было Вам помочь, написал комменты.

А вот отлаживать Ваш код - уж увольте. Или сами учитесь или не беритесь вообще за программирование.

 

PS: И вообще - благодарнее надо к людям относится! Вам тут никто ничего не должен, не нужны советы - разбирайтесь сами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...