Обзор отладочной платы DK-TM4C129X от TI
Сегодня днем я стал одним из первых обладателей отладочной платы на базе предсерийного микроконтроллера TM4C129.

И Считаю просто необходимым написать вообще первый обзор этой платы.
Внимание! Плата собрана на базе экспериментального процессора XM4C129 — от серийной модели TM4C129 он отличается отсутствием каких-либо гарантий, что все будет нормально работать )) ля-ля)
Комплектация:
В коробке нашлись:
Состав платы: (Все дружно смотрим на вкладыш)

Из основного:
В плате уже зашито некоторое ПО, которое соединяется по Ethernet и смотрит погоду в городах. Можно набрать на клавиатуре свой город и посмотреть погоду в нем.
Сенсор, к слову, весьма отзывчивый и буквы набираются без проблем.

Зима, снегопад, лютая стужа, новый год… ять…

Работа в CodeComposer Studio.
Перед тем как начать работу по программированию, необходимо загрузить новую версию TI-RTOS 1.20, после чего в CCS появятся примеры работы с данной отладочной платой. Давайте что-нибудь запустим:

Работа с примерами TI-RTOS проста до безобразия:

Четыре тыка и…мы понимаем что у нас лежит сервер лицензий все работает.
Подключается плата через интерфейс Stellaris In-Cursiut Debug Interface. (напомню что Stellaris — это старое название линейки TIVA-C)

CCS без проблем работает и с J-Link, хотя для последнего нужно добавить пару дров (Пользуюсь TE-ARM-Link-ом и все без проблем)
Для «чистатеста» решил запустить UART Echo
Запускаем Debug кнопочкой Run:

И Все заработало:

Функция echoFxn() выполняется, все замечательно.
Но ЧУ! в функции main эта задача даже не упоминается!
Единственное что привлекает внимание — функция BIOS_start();
За отработку таска echoFxn() отвечает ОСРВ — SYS/BIOS.
Делаем двойной клик по файлу uartecho.cfg — нам открывается TI-RTOS System Overview. Для того, чтобы оно приобрело такой графический вид, выбираем Advanced:

это графическая утилита настройки cfg-файла. Естественно что она доступна только для пользователей CCS.
Открываем BIOS — System Overview

галочками показаны активированные элементы системы.
Нас интересует диспетчер — tasks:

здесь мы видим общие настройки тасков вроде размера стека и числа приоритетов задач.
Нам нужны сами задачи — Instanses

Где мы и находим наш таск UART. Давайте создадим еще один таск!

Сохраняем конфигурацию и в файле uartecho.cfg появились строки:
Допустим, мы хотим зажигать светодиод по кнопке. Понятно, что у платы есть специально определенные кнопки и светодиоды. Их список имеется в файле Board.h:
Создаем функцию для таска. Учтите, что таск самостоятельно отвечает за то чтобы быть зацикленным!
Не забудем про схему подключения кнопок на плате:

Так как кнопки по схеме замыкаются на землю, пишем соответствующее условие
Вам не видно, а у меня работает :)
Кстати, не знаю, баг это или фича, но супер-яркий светодиод загорожен язычком от защитной пленочки(да, дисплей до сих пор не очищен от первой прошивки):

Вот мы и пробежали галопом по Европам по отладочной плате и SYS/BIOS.
Честно говоря SYS/BIOS хоть и мощный, но маленько запутанный — я только только начал в нем разбираться.
А впереди еще TivaWare, внутри которой есть куча драйверов непосредственно железа.

И Считаю просто необходимым написать вообще первый обзор этой платы.
Внимание! Плата собрана на базе экспериментального процессора XM4C129 — от серийной модели TM4C129 он отличается отсутствием каких-либо гарантий, что все будет нормально работать )) ля-ля)
Комплектация:
В коробке нашлись:
- Непосредственно сама плата в недурной упаковке из пупырчатой пленки и антистатическом пакете;
- 2 кабеля USB-A-male — microUSB
- 1 кабель USB-A-Female — microUSB
- шлейф Ethernet
- Флеш-накопитель на 8Гбайт. Спасибо что отказались от CD диска! Флешка содержит все среды программирования (но весьма старые версии — CSS даже 4-й!) и некоторую техническую документацию (датащита, к слову — нет).
Состав платы: (Все дружно смотрим на вкладыш)

Из основного:
- Микроконтроллер XM4C129XNCZAD. Кстати, задание на дом — скачайте для него датащит… там NDA по пути не забудьте (у меня есть, но дать его не могу) Корпус, надо сказать, на него противный — BGA212. Но это не страшно, так как есть варианты и в перевариваемом TQFP128;
- ICDI интерфейс для внутрисхемной отладки;
- Слот для microSD карты;
- Пол-гига SPI флешки;
- QVGA LCD дисплей с резистивным тачскрином;
- Ethernet PHY! — полноценная поддержка Ethernet — просто подключай разъем и вперед!
- Усилитель с динамиком и кнопки...
В плате уже зашито некоторое ПО, которое соединяется по Ethernet и смотрит погоду в городах. Можно набрать на клавиатуре свой город и посмотреть погоду в нем.
Сенсор, к слову, весьма отзывчивый и буквы набираются без проблем.

Зима, снегопад, лютая стужа, новый год… ять…

Работа в CodeComposer Studio.
Перед тем как начать работу по программированию, необходимо загрузить новую версию TI-RTOS 1.20, после чего в CCS появятся примеры работы с данной отладочной платой. Давайте что-нибудь запустим:

Работа с примерами TI-RTOS проста до безобразия:

Четыре тыка и…
Подключается плата через интерфейс Stellaris In-Cursiut Debug Interface. (напомню что Stellaris — это старое название линейки TIVA-C)

CCS без проблем работает и с J-Link, хотя для последнего нужно добавить пару дров (Пользуюсь TE-ARM-Link-ом и все без проблем)
Для «чистатеста» решил запустить UART Echo
Запускаем Debug кнопочкой Run:

И Все заработало:

Функция echoFxn() выполняется, все замечательно.
Void echoFxn(UArg arg0, UArg arg1)
{
Char input;
UART_Handle uart;
UART_Params uartParams;
const Char echoPrompt[] = "\fEchoing characters:\r\n";
/* Create a UART with data processing off. */
UART_Params_init(&uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudRate = 9600;
uart = UART_open(Board_UART0, &uartParams);
if (uart == NULL) {
System_abort("Error opening the UART");
}
UART_write(uart, echoPrompt, sizeof(echoPrompt));
/* Loop forever echoing */
while (TRUE) {
UART_read(uart, &input, 1);
UART_write(uart, &input, 1);
}
}
Но ЧУ! в функции main эта задача даже не упоминается!
/*
* ======== main ========
*/
Int main(Void)
{
/* Call board init functions */
Board_initGeneral();
Board_initGPIO();
Board_initUART();
System_flush();
/* Start BIOS */
BIOS_start();
return (0);
}
Единственное что привлекает внимание — функция BIOS_start();
За отработку таска echoFxn() отвечает ОСРВ — SYS/BIOS.
Делаем двойной клик по файлу uartecho.cfg — нам открывается TI-RTOS System Overview. Для того, чтобы оно приобрело такой графический вид, выбираем Advanced:

это графическая утилита настройки cfg-файла. Естественно что она доступна только для пользователей CCS.
Открываем BIOS — System Overview

галочками показаны активированные элементы системы.
Нас интересует диспетчер — tasks:

здесь мы видим общие настройки тасков вроде размера стека и числа приоритетов задач.
Нам нужны сами задачи — Instanses

Где мы и находим наш таск UART. Давайте создадим еще один таск!

Сохраняем конфигурацию и в файле uartecho.cfg появились строки:
/* ================ Task configuration ================ */
var task0Params = new Task.Params();
task0Params.instance.name = "echo";
task0Params.stackSize = 0x300;
Program.global.echo = Task.create("&echoFxn", task0Params);
/* ================ Logging configuration ================ */
var LoggingSetup = xdc.useModule('ti.uia.sysbios.LoggingSetup');
LoggingSetup.loadLoggerSize = 256;
LoggingSetup.mainLoggerSize = 512;
LoggingSetup.sysbiosLoggerSize = 1024;
/* ================ Driver configuration ================ */
var TIRTOS = xdc.useModule('ti.tirtos.TIRTOS');
var GPIO = xdc.useModule('ti.drivers.GPIO');
var UART = xdc.useModule('ti.drivers.UART');
/* наш таск */
var task1Params = new Task.Params();
task1Params.instance.name = "ButtonDown";
task1Params.stackSize = 768;
Program.global.ButtonDown = Task.create("&ButtonDownPressed", task1Params);
Допустим, мы хотим зажигать светодиод по кнопке. Понятно, что у платы есть специально определенные кнопки и светодиоды. Их список имеется в файле Board.h:
#define Board_LED_ON DK_TM4C129X_LED_ON
#define Board_LED_OFF DK_TM4C129X_LED_OFF
#define Board_LED0 DK_TM4C129X_LED_G
#define Board_LED1 DK_TM4C129X_LED_B
#define Board_LED2 DK_TM4C129X_LED_R
#define Board_BUTTON0 DK_TM4C129X_BUTTON_SELECT
#define Board_BUTTON1 DK_TM4C129X_BUTTON_UP
#define Board_BUTTON2 DK_TM4C129X_BUTTON_DOWN
Создаем функцию для таска. Учтите, что таск самостоятельно отвечает за то чтобы быть зацикленным!
Не забудем про схему подключения кнопок на плате:

Так как кнопки по схеме замыкаются на землю, пишем соответствующее условие
Void ButtonDownPressed(UArg arg0, UArg arg1)
{
while(TRUE){
if (!GPIO_read(Board_BUTTON0)){
GPIO_write(Board_LED1,Board_LED_ON);
}
else{
GPIO_write(Board_LED1,Board_LED_OFF);
}
}
}
Вам не видно, а у меня работает :)
Кстати, не знаю, баг это или фича, но супер-яркий светодиод загорожен язычком от защитной пленочки(да, дисплей до сих пор не очищен от первой прошивки):

Вот мы и пробежали галопом по Европам по отладочной плате и SYS/BIOS.
Честно говоря SYS/BIOS хоть и мощный, но маленько запутанный — я только только начал в нем разбираться.
А впереди еще TivaWare, внутри которой есть куча драйверов непосредственно железа.
10 комментариев
Мог бы заказать напрямую у TI, но нужны были счета, накладные и прочая гадость.
Блин, задолбало то, что каждый свой отладочный протокол лепит. Отладка, фактически состоит из двух комманд — записать и прочитать. Неужто, так сложно всем сделать одни отладочный интерфейс и им пользоваться.
«Повбывав» бы за такие названия.
ICDI это так чисто отладчик называется кстати. На выходе у него вполне себе обычный JTAG. на плате даже разъем соответствующе подписан.
т.е. USB -> ICDI -> JTAG.
В примерах такого достаточно. Хотя основное API вполне себе удобочитаемое
А плата да — 200 баксов
сорри, не выдержал :))