Вывод printf с использованием UART в микроконтроллере ARM Cortex-M3

У меня есть плата на базе LPC1768 - LandTiger (стоит проверить руководство внизу) . Для его программирования я использую Keil uVision4 / 72 Lite и J-Link EDU от Segger. Моя простая программа для взаимодействия с джойстиком и диодами работает нормально, но ...

Я пытаюсь реализовать отладку printf, поэтому я могу видеть вывод printf в окне Keil Debug (printf) Viewer. Проблема в том, что я не вижу никаких выходных данных - я думаю, что я на правильном пути, потому что, когда я запускаю отладчик, я вижу Trace: Running в нижней части окна (до того, как это было Trace: Без синхронизации). К сожалению, я ничего не вижу в окнах вывода UART и Debug.

Я потратил довольно много времени, пытаясь заставить его работать, и был бы признателен за любую помощь, спасибо;)

Мои настройки Keil:

Project / Options for Target / Debug установлен на J-Link / J-Trace Cortex.

Затем в его настройках я выбрал SEGGER с Порт: SW и МАКСИМАЛЬНЫЕ ЧАСЫ: 10 МГц.

Вкладка "Трассировка" активна с частотой ядра 100 МГц и предварительным масштабированием SWO = 17 (что дает тактовая частота SWO 5,882352 МГц). .

Порты стимула ITM установлены на Включить: 0xFFFFFFFF и Привилегии: 0x0000000F.

Вот части моего кода:

определить FOSC 12000000

определить FCCLK (FOSC * 8)

определить FCCO (FCCLK * 3)

определить FPCLK (FCCLK / 4)

определить UART0_BPS 115200

void UART0_Init (недействительно)

{

uint16_t usFdiv;

/ * UART0 * /

LPC_PINCON- ›PINSEL0 | = (1 ‹---------------- 4); / * Вывод P0.2 используется как TXD0 (Com0) * /

LPC_PINCON- ›PINSEL0 | = (1 ‹---------------- 6); / * Вывод P0.3 используется как RXD0 (Com0) * /

LPC_UART0- ›LCR = 0x83;

usFdiv = (FPCLK / 16) / UART0_BPS;

LPC_UART0- ›DLM = usFdiv / 256;

LPC_UART0- ›DLL = usFdiv% 256;

LPC_UART0- ›LCR = 0x03;

LPC_UART0- ›FCR = 0x06;
}

Код отправки:

int UART0_SendByte (int ucData)

{

while (! (LPC_UART0- ›LSR & 0x20)) {};

возврат (LPC_UART0- ›THR = ucData);

}

И мой fputc для printf (он называется - проверил)

интервал fputc (интервал c, ФАЙЛ * f)

{

if (c == '\n') {

UART0_SendByte ('\ r');

}

возврат (UART0_SendByte (c));

}

Любые идеи?

С Уважением!


person Siegfried    schedule 03.09.2013    source источник
comment
Я не понимаю, вы говорите о возможностях трассировки вашего отладчика и все же пишете байты в UART. Что вы ожидаете от этих байтов? Есть ли у вас соединение RS232 между платой и ПК? Обычно, если вы связываете свою программу с полухостингом, printf отправляет данные в IDE отладчика через порт отладки (JLink в вашем случае). Итак, либо вы printf и не отменяете fputc, и ожидаете вывода в окне отладки, либо вы отправляете в UART, подключаете RS232 к ПК и видите его на гипертерминале или что-то в этом роде. Я, наверное, что-то упускаю.   -  person Balau    schedule 04.09.2013
comment
@Balau: Вы должны публиковать ответ, а не комментарий - вы на высоте.   -  person Clifford    schedule 04.09.2013
comment
Меня запутала информация с сайта Keil. Вы, ребята, на 100% правы - все, что мне нужно было сделать, это правильно настроить параметры отладки Keil target, а затем переопределить fputc с помощью ITM_SendChar из CMSIS. И работает нормально! Спасибо!   -  person Siegfried    schedule 05.09.2013
comment
@Clifford и Siegfried, я добавил ответ, чтобы мы могли завершить вопрос и для тех, кто найдет его позже.   -  person Balau    schedule 06.09.2013


Ответы (2)


Ваш fputc отправляет байты напрямую в UART, который подключается к разъему RS232 на плате. Если вы хотите увидеть выходные данные вашего fputc, вам необходимо подключить кабель между платой и ПК и увидеть его с помощью клиента, такого как гипертерминал.

Когда вы говорите о возможностях трассировки, это обычно означает, что адаптер (J-Link в вашем случае) создает высокопроизводительную связь между программой и отладчиком и следит за выполнением программы. Есть и другие функции отладки. Например, если вы компилируете с использованием полухостинга, программа выполняет системные вызовы (_write, _open, ...), которые перехватываются отладчиком, выполняющим их на хост-машине.

Итак, по моему опыту, вы либо вызываете printf, не переопределяете fputc и не компилируете с помощью полухостинга, ожидая вывода в окне отладки, либо отправляете в UART, подключаете RS232 к ПК и видите его на гипертерминале.

Я вижу, вы нашли третий метод, использующий возможности трассировки. Я считаю, что вариант полухостинга является более общим решением, потому что его можно применять также в настройке, которая не имеет возможности трассировки, а только соединение JTAG (или SWD).

person Balau    schedule 06.09.2013
comment
Примечание: я отправляю ответ, как это было предложено @Clifford выше, я задавал вопросы, комментируя, но мы обнаружили, что ответ был в вопросе. - person Balau; 06.09.2013

Вы хотите записать в ячейку ETM с помощью команды printf, если хотите, чтобы вывод шел в интерфейс SWD через JLINK.

Следуйте инструкциям в разделе 3.4 документа http://cdn.energymicro.com/dl/an/pdf/an0043_efm32_debug_trace_capabilities.pdf.

Всегда проверяйте в своем коде "printf", что последний байт ушел, иначе вывод будет некорректным.

person Larry_C    schedule 01.04.2014