В целях вывода отладочной информации при использовании Debug не в пошаговом режиме удобно выводить текущие значения переменных с помощью стандартной функции C printf(). Для этого в проект добавляем кроме стандартных файлов startup_stm32f10x_md.s и system_stm32f10x.c создаем файл retarget.c листинг которого представлен ниже и подключаем его в проект
#include <stdio.h>
#include <stm32f10x.h>
#pragma import(__use_no_semihosting_swi)
#define ECHO_FGETC
volatile int ITM_RxBuffer=0x5AA55AA5; /* Buffer to transmit data towards debug system. */
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
return (ITM_SendChar((uint32_t)ch));
}
unsigned char backspace_called;
unsigned char last_char_read;
int r;
int fgetc(FILE *f)
{
/* if we just backspaced, then return the backspaced character */
/* otherwise output the next character in the stream */
if (backspace_called == 1)
{
backspace_called = 0;
}
else {
do {
r = ITM_ReceiveChar();
} while (r == -1);
last_char_read = (unsigned char)r;
#ifdef ECHO_FGETC
ITM_SendChar(r);
#endif
}
return last_char_read;
}
/*
** The effect of __backspace() should be to return the last character
** read from the stream, such that a subsequent fgetc() will
** return the same character again.
*/
int __backspace(FILE *f)
{
backspace_called = 1;
return 0;
}
int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}
void _ttywrch(int ch) {
ITM_SendChar((uint32_t)ch);
}
void _sys_exit(int return_code) {
while (1); /* endless loop */
}
По материалам из
#include <stdio.h>
#include <stm32f10x.h>
#pragma import(__use_no_semihosting_swi)
#define ECHO_FGETC
volatile int ITM_RxBuffer=0x5AA55AA5; /* Buffer to transmit data towards debug system. */
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
return (ITM_SendChar((uint32_t)ch));
}
unsigned char backspace_called;
unsigned char last_char_read;
int r;
int fgetc(FILE *f)
{
/* if we just backspaced, then return the backspaced character */
/* otherwise output the next character in the stream */
if (backspace_called == 1)
{
backspace_called = 0;
}
else {
do {
r = ITM_ReceiveChar();
} while (r == -1);
last_char_read = (unsigned char)r;
#ifdef ECHO_FGETC
ITM_SendChar(r);
#endif
}
return last_char_read;
}
/*
** The effect of __backspace() should be to return the last character
** read from the stream, such that a subsequent fgetc() will
** return the same character again.
*/
int __backspace(FILE *f)
{
backspace_called = 1;
return 0;
}
int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}
void _ttywrch(int ch) {
ITM_SendChar((uint32_t)ch);
}
void _sys_exit(int return_code) {
while (1); /* endless loop */
}
создаем файл main.c для демонстрации работы функции printf()
#include "stdio.h"
//#include <stm32f10x.h> // Required by CMSIS
int main(void) {
int j = 0;
unsigned char i =0;
while (1) {
j++;
if (j==1000000) {
j = 0;
if (i==0xFF) i = 0;
printf("Value of i: %d\n", i);
i++;
}
}
}
Запускаем Debugger и выбираем View -> Serial Windows-> Debug printf() Viever. После запуска программы на выполнение, наблюдаем вывод в окне Debug printf() Viever
По материалам из
Комментариев нет:
Отправить комментарий