Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сконфигурировать второй UART в Tiva TM4C123?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
kuka_v
Вкуривание документации и просмотр учебных видео мне не помогло.
Помогите, что надо поправить в коде, чтобы задействовать UART1 на плате TI Tiva TM4C123?
Вот код из учебника, который рассказывает иностранный дядечка.
Первые две строчки я понял как расширить на пару портов, я вот дальше...
Я хочу оставить UART0 для отладочных сообщений, тогда как UART1 работает с внешней аппаратурой.
Даташит на плату вот:
http://www.ti.com/general/docs/lit/getlite...mp;fileType=pdf

CODE
#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++));
}
}
Georg_M_B0
Скажите, а у вас хоть что то, заработало при записи настроек и команд прямо в регистры?
kuka_v
Цитата(Georg_M_B0 @ Aug 25 2016, 08:43) *
Скажите, а у вас хоть что то, заработало при записи настроек и команд прямо в регистры?

Да с UART0 все работает.
Маленький фолт был замечен при работе команды switch:
выключить вообще все светодиоды возможно только после красного.
А так все переключается
Georg_M_B0
Я вам советую использовать встроенные в ROM API функции, мы хотели использовать этот процессор три года назад, и корректно всё работало при использовании API функций, это не понравилось нашим программистам и мы от него отказались. А чем он вас превлёк?
kuka_v
Цитата(Georg_M_B0 @ Aug 25 2016, 09:08) *
Я вам советую использовать встроенные в ROM API функции, мы хотели использовать этот процессор три года назад, и корректно всё работало при использовании API функций, это не понравилось нашим программистам и мы от него отказались. А чем он вас превлёк?

Меня устроил бы любой АРМ Кортех, а этот пылился в коробке.
Пока никаких симпатий-антипатий.
В силу того что потребуется отладка на уровне ассемблера, хочется понять что же написано в документации.
Но вот "забуксовал" чего то.
jcxz
Цитата(kuka_v @ Aug 25 2016, 15:21) *
В силу того что потребуется отладка на уровне ассемблера, хочется понять что же написано в документации.

Начать с изучения системы тактирования.
kuka_v
Цитата(jcxz @ Aug 25 2016, 10:25) *
Начать с изучения системы тактирования.

И?
а по существу что то можете сказать?
Ну если не знаете или не хотите говорить, ну прошел мимо и все!
В чем проблема, то?
Вы не поверите, с системой тактирования давно разобрался и не только с этим процом.
alag57
Есть несколько вариантов.
Первый - сделать тоже самое, что сделано у вас для 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.



kuka_v
Цитата(alag57 @ Aug 25 2016, 12:59) *
Есть несколько вариантов.
Первый - сделать тоже самое, что сделано у вас для 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 преобразователь и воткнут в отдельную винду. Но пока там тишина, как я не мучал плату.
Когда две неизвестных сложнее искать причину. Если бы я был уверен в коде, то грешил бы на преобазователь.

Ан нет на этот курс я натыкался. Он показался мне длинноватым.
Да и материалов к курсу я не увидел.
Буду пересматривать.
Еще раз спасибо!
kolobok0
Цитата(kuka_v @ Aug 25 2016, 16:30) *
..Сколько ни мучал гугл...


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

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

удачи вам
(круглый)

jcxz
Цитата(kolobok0 @ Aug 26 2016, 00:34) *
вот jcxz скорее всего ближе к теме кмк.
Вам скорее всего правильно подсказал.
в кортексах бывает, что тактирование с разных шин идёт либо с разных предделителей.

Тут типичная картина:
Цитата(kuka_v @ Aug 25 2016, 19:30) *
Сколько ни мучал гугл, сюда он меня не приводил.
Я еще раз все проверю. Вообщем то я ожидал что пройдя все что для 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).
CODE
//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
Цитата(jcxz @ Aug 26 2016, 06:46) *
Чел "мучает гугл", ковыряет наугад чужие исходники. Вместо того чтобы открыть и прочитать даташит на МК. Отсюда и все проблемы.
Любая помощь тут бессмысленна.


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

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

В коде была ошибка-опечатка и другой "опытный! чел мог бы и указать на нее.
Ошибка была в адресе бита-регистра потому компилятор это не видел.
jcxz
Цитата(kuka_v @ Sep 8 2016, 14:23) *
В коде была ошибка-опечатка и другой "опытный! чел мог бы и указать на нее.
Ошибка была в адресе бита-регистра потому компилятор это не видел.

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

PS: И вообще - благодарнее надо к людям относится! Вам тут никто ничего не должен, не нужны советы - разбирайтесь сами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.