2013-09-03 4 views
2

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

Я пытаюсь реализовать отладки Printf, так что я могу видеть выход PRINTF в Keil «Debug (PRINTF) Viewer» окна. Проблема в том, что я не вижу выхода - я думаю, что нахожусь на правильном пути, потому что, когда я запускаю отладчик, я вижу Trace: Запуск внизу окна (до того, как он был Trace: No Synchronization). К сожалению, я ничего не вижу в окнах вывода UART и Debug.

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

Мои Keil являются:

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

Тогда внутри его настройки у меня есть Segger отбираться с Порт: SW и MAX ЧАСЫ: 10 МГц.

Вкладка трассировки включен с 100Mhz тактовая и SWO прескалером = 17 (что приводит к 5.882352MHz SWO Clock).

ITM Стимул Порты устанавливаются Enable: 0xFFFFFFFF и Privilege: 0x0000000F

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

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

определяют FCCLK (FOSC * 8)

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

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

определяет UART0_BPS 115200

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

{

uint16_t usFdiv;

/* УАПП0 */

LPC_PINCON-> PINSEL0 | = (1 < < 4);/* Вывод Р0.2 используется как TXD0 (Com0) */

LPC_PINCON-> PINSEL0 | = (1 < < 6);/* Pin 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)

{(! (LPC_UART0-> LSR & 0x20))

в то время как {};

возвращение (LPC_UART0-> THR = ucData);

}

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

INT fputc (интермедиат с, FILE * е)

{

если (c == '\ n') {

UART0_SendByte ('\ r');

}

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

}

Любые идеи?

С уважением!

+4

Я не понимаю, вы говорите о возможностях трассировки вашего отладчика, и все же вы пишете байты на UART. Что вы ожидаете от этих байтов? У вас есть связь RS232 между плате и ПК? Обычно, если вы связываете свою программу с полуохождением, 'printf' отправляет данные в ID отладчика через порт отладки (JLink в вашем случае). Итак, либо вы 'printf', либо не переопределяете' fputc', и ожидаете выхода в окне отладки, либо отправляете в UART, подключаете RS232 к ПК и видите его на гипертерминале или что-то в этом роде. У меня, наверное, что-то не хватает. – Balau

+0

@Balau: Вы должны опубликовать ответ, а не комментарий, - на вашем месте. – Clifford

+0

Я смутился с информацией с сайта Keil. Вы, парни, на 100% прав - все, что мне нужно было, - правильно настроить параметры отладки Keil, а затем переопределить fputc с помощью ITM_SendChar из CMSIS. И все отлично! Спасибо! – Siegfried

ответ

0

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

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

Так что в моем опыте либо вы называете printf, не переопределить fputc и компилировать с semihosting, и ожидаем, что выход на окно отладки, или отправить UART, подключите RS232 к компьютеру и увидеть его на HyperTerminal ,

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

+0

Примечание: я отправляю ответ, предложенный @Clifford выше, я задавал вопросы, комментируя, но мы выяснили, что ответ был в вопросе. – Balau

0

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

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

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

Смежные вопросы