kuka_v 0 25 августа, 2016 Опубликовано 25 августа, 2016 (изменено) · Жалоба Вкуривание документации и просмотр учебных видео мне не помогло. Помогите, что надо поправить в коде, чтобы задействовать 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++)); } } Изменено 25 августа, 2016 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GeorgMB0 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Скажите, а у вас хоть что то, заработало при записи настроек и команд прямо в регистры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuka_v 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Скажите, а у вас хоть что то, заработало при записи настроек и команд прямо в регистры? Да с UART0 все работает. Маленький фолт был замечен при работе команды switch: выключить вообще все светодиоды возможно только после красного. А так все переключается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GeorgMB0 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Я вам советую использовать встроенные в ROM API функции, мы хотели использовать этот процессор три года назад, и корректно всё работало при использовании API функций, это не понравилось нашим программистам и мы от него отказались. А чем он вас превлёк? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuka_v 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Я вам советую использовать встроенные в ROM API функции, мы хотели использовать этот процессор три года назад, и корректно всё работало при использовании API функций, это не понравилось нашим программистам и мы от него отказались. А чем он вас превлёк? Меня устроил бы любой АРМ Кортех, а этот пылился в коробке. Пока никаких симпатий-антипатий. В силу того что потребуется отладка на уровне ассемблера, хочется понять что же написано в документации. Но вот "забуксовал" чего то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба В силу того что потребуется отладка на уровне ассемблера, хочется понять что же написано в документации. Начать с изучения системы тактирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuka_v 0 25 августа, 2016 Опубликовано 25 августа, 2016 (изменено) · Жалоба Начать с изучения системы тактирования. И? а по существу что то можете сказать? Ну если не знаете или не хотите говорить, ну прошел мимо и все! В чем проблема, то? Вы не поверите, с системой тактирования давно разобрался и не только с этим процом. Изменено 25 августа, 2016 пользователем kuka_v Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alag57 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Есть несколько вариантов. Первый - сделать тоже самое, что сделано у вас для 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 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Есть несколько вариантов. Первый - сделать тоже самое, что сделано у вас для 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 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба ..Сколько ни мучал гугл... вот jcxz скорее всего ближе к теме кмк. Вам скорее всего правильно подсказал. в кортексах бывает, что тактирование с разных шин идёт либо с разных предделителей. удачи вам (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 26 августа, 2016 Опубликовано 26 августа, 2016 · Жалоба вот 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 0 8 сентября, 2016 Опубликовано 8 сентября, 2016 (изменено) · Жалоба Чел "мучает гугл", ковыряет наугад чужие исходники. Вместо того чтобы открыть и прочитать даташит на МК. Отсюда и все проблемы. Любая помощь тут бессмысленна. Добрее надо к людям относится! Свою "крутизну" в другом месте показывать надо... Чел прочитал и даташит несколько раз и видео инструкции послушал. И только выполнял урок из видео, использую метод "шаг в сторону" В коде была ошибка-опечатка и другой "опытный! чел мог бы и указать на нее. Ошибка была в адресе бита-регистра потому компилятор это не видел. Изменено 8 сентября, 2016 пользователем kuka_v Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 8 сентября, 2016 Опубликовано 8 сентября, 2016 · Жалоба В коде была ошибка-опечатка и другой "опытный! чел мог бы и указать на нее. Ошибка была в адресе бита-регистра потому компилятор это не видел. Вообще-то я сравнил (по диагонали конечно) периферию TM4C123 и TM4C129, увидел что они похоже совпадают, вырезал из своего кода для TMC4C129 всё, что должно было Вам помочь, написал комменты. А вот отлаживать Ваш код - уж увольте. Или сами учитесь или не беритесь вообще за программирование. PS: И вообще - благодарнее надо к людям относится! Вам тут никто ничего не должен, не нужны советы - разбирайтесь сами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться