Ярлыки

_GetPixelIndex (1) _SetPixelIndex (1) 3-phase (1) 800x480 (1) АЦП (1) генератор (1) синхронный усилитель (2) структура (1) учебный курс (1) шаговый двигатель (1) ШИМ (2) accert (1) AD7608 (1) AD8429 (1) ADC (5) amplifer (1) arccos (1) arcsin (1) arctang (2) arctg (3) ARM (2) arm_sqrt_q15 (2) assembler (6) ASSERT (1) atan (2) bit (1) Bitband (1) boot (3) bootlloader (1) BUTTON (1) C (5) C# (1) CAN (2) CC2530 (5) CMSIS (4) command (1) Cordic (1) Core746I (1) CubeMX (4) DBGMCU (2) debug (2) debug.ini (1) delegate (1) Digital Potentiometers (1) DigitalPOT (1) Discovery (1) DMA (9) DMA2D (1) DSP (1) DSP library (1) DWT (1) EFM32 (5) EmWin (9) EXTI (1) FATFS (1) FMC (2) FreeRTOS (2) gl868-dual cmux (1) GPIO (4) GUI (2) GUIBuilder (1) GUIDRV_CompactColor_16 (1) HAL (3) HappyGecko (1) Hard Fault (2) heap (1) I2C (1) ID (1) ILI9320 (1) ILI9325 (1) Initialisation (1) InitLTDC (1) Instrumentithion (1) Interrupt (4) ITR (1) JTAG (1) Keil (5) LCDConf (2) lock-in (1) LTCD (1) LTDC (3) main (1) memory (1) MINI_STM32 Revision 01 (1) nBoot0 (1) NVIC (1) OnePulse (2) OSAL (4) pack (1) phase (1) printf (3) Pulse (1) PWM (12) RCC (2) RCR (1) Register (1) RESET (2) RS232 (3) RSS (1) RTC (3) RTOS-RTX (1) RTT (1) RTX-RTOS (1) SDCard (1) SDRAM (6) Segger (2) SPI (3) sqrt (3) SSD1298 (1) SSD1963 (1) Standart Peripherial Library (3) STANDBAY (1) startup (1) STemWin (8) stepper motor (1) STlink (2) STM32 (17) STM32429ZI (1) STM32Cube (1) STM32DBG.IN (1) STM32F (28) STM32F0 (4) STM32F1 (13) STM32F4 (10) STM32F4 Discovery (1) STM32F407ZG (1) STM32F429 (2) STM32F746 (1) STOP (1) string (1) struct (1) SWD (1) SWD JTAG (1) Synhronization (1) system_stm32f4xx.c (1) SystemInit (1) SysTick (1) task (4) telit (1) TIM (27) typedef (1) UART (1) USART (9) viewer (2) WM_PAINT (1) Z-stack (5) ZigBee (5)
Показаны сообщения с ярлыком printf. Показать все сообщения
Показаны сообщения с ярлыком printf. Показать все сообщения

среда, 25 июня 2014 г.

printf

Функция printf уже реализована в стандартной библиотеке непосредственному использованию ее мешает, то, что библиотека не знает, куда отправлять получившийся текст, - в USB-CDC, Ethernet, UART .  В нашем случае мы перенаправим ее в  ITM. Для данной задачи необходимо реализовать всего одну функцию: int fputc(int c, FILE *stream). В ней  будем отправлять всё в отладочный порт. Для этого где-то в CMSIS есть объявление и реализация функции ITM_SendChar, которая записывает символ в нулевой порт трассировщика, чтоб передать его в отладчик.

#include <stm32f4xx.h>
#include <stdio.h>

int fputc(int c, FILE *stream)
{
    return ITM_SendChar(c);
}
int main(void)
{    
    while(1)
    {
       printf("Hello world!");
    }

}

четверг, 17 апреля 2014 г.

Debug (printf) Viewer

Используя технологию ITM (Instrumentation Trace Macrocell) можно организовать вывод функции printf используя небольшой код, вводимый в
программу пользователя. Для этого в начало файла с функцией main необходимо добавить строку:

#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) 

после этого становится возможным вывод переменных с помощью функции printf переменных: 

ITM_Port8(0) = value + 0x30; /* displays value in ASCII */ 
while (ITM_Port8(0) == 0); 
ITM_Port8(0) = 0x0D; 
while (ITM_Port8(0) == 0); 
ITM_Port8(0) = 0x0A;

В настройках отладчика на вкладке Debug-Trace необходимо установить "птичку" для порта ITM0, снять "птичку" с пунктов On Data R/W Sample, EXCTRC и PC Sample. (для снятия излишней нагрузки на SWO port).
После этого в отладчике выбрав на вкладке View/Serial Windows Debug (printf) Viewer после запуска программы в отладчике мы увидим в окне результат работы функции printf.

четверг, 28 ноября 2013 г.

Перенаправление printf() в C для STM32

В целях вывода отладочной информации при использовании 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 */
}

создаем файл 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

По материалам из