Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.

Başlatan z, 07 Mayıs 2015, 23:54:27

z

Aşağıda anlatmaya çalıştığım özellik var ama nasıl kullanılıyor bilmiyorum.

MCUmuza bağlı LCD vs ekran olmasın.

Debug ederken bazı satırlarda uyarı mesajları vermek istiyorum.

Kodun bir bölgesinde mesela "0x20000010 adresine 0x53 yazdım" gibi bir uyarı satırı eklemek istiyorum

Kodlar koşmaya başlayıp bahsi geçen noktaya geldimi PC ekranında bu uyarıyı almak istiyorum.

SWD ile debug yapıyorum bu istediğimi nasıl yaparım?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam IAR'da direkt printf ile gönderilebiliyor fakat keil'da ITM Portunu ayarlamak ve fputc fonksiyonunu ona göre implement etmek gerekiyo.Keil'da hiç denemedim ama aşağıdaki bişeyler anlatılıyor.
http://www.keil.com/support/man/docs/ulink2/ulink2_trace_itm_viewer.htm
şurda da st-link için olanı anlatılmış
http://armcortexm.blogs.upv.es/stm32f4-discovery-and-printf-redirection-to-debug-viewer-in-keil/

X-Fi

Hocam bir öneri olması açısından run-time çalışan uygulamayı non-blocking yapıda izlemek daha sağlıklı olacaktır. Bunun için CM3'de timer ve DMA modulü kullanılarak yazılmış __FILE__,  __LINE__ makrolarını gönderecek rutinler hazırlarsanız ve bu verileri usart üzeriden alıp teraterm gibi bir program ile izleyebilirsiniz.

FreeRTOS tools'da da benzer yapıda çözümler mevcut incelemenizi öneririm.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

yamak

Hocam evet haklısınız printf performans açısında mikro ya külfet oluyo ama basit şeylerde ya da UART ın olmadığı durumlar çok işe yarıyo.Aslında IAR'da log break point var o da buna benzer bi iş görüyo.

z

Vdd ve Gnd dahil olmak üzere 4 telli SWD mi bu tip debug işlemlerinde kullanabilecekmiyim?

Bu şekilde 32 adet port varmış. Süper bir şey.

Peki SWD pinlerinine bağlanmış STLlink cihazını kullanan yazılımı kendimiz yazabilirmiyiz?

#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))

#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA          0x01000000
struct __FILE { int handle; /* Add whatever needed */ };
FILE __stdout;
FILE __stdin;

int fputc(int ch, FILE *f) {
  if (DEMCR & TRCENA) {
    while (ITM_Port32(0) == 0);
    ITM_Port8(0) = ch;
  }
  return(ch);
}

printf("AD value = 0x%04X\r\n", AD_value);
Bana e^st de diyebilirsiniz.   www.cncdesigner.com


mufitsozen

Alıntı yapılan: z - 08 Mayıs 2015, 11:47:01
.............
Peki SWD pinlerinine bağlanmış STLlink cihazını kullanan yazılımı kendimiz yazabilirmiyiz?
...........

Tabiiki bkz:

https://fedcsis.org/proceedings/2012/pliks/279.pdf

http://infocenter.arm.com/help/topic/com.arm.doc.ddi0413c/DDI0413C_cortexm1_r0p1_trm.pdf

libSWD ve PySWD

ayrica saleae icinde SWD gosteren bir opsiyon var diye hatirliyorum.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Bu ITM portu keske ARM öğreniyoruz derslerinin başında biliyor olsaydık.

Dersler çok daha renkli geçecekmiş.

ITM port üzerinden Debug viewer'ı bombardıman ettim. 1 Byte karakter 7.5 ... 10 mikrosaniye içinde gidiyor. Arada bir veriler bozulsa da sonuç süper.

@mufitsozen

Hocam teşekkürler.

Bayağı bir zaman ayırmak gerekecek.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı yapılan: z - 08 Mayıs 2015, 13:04:02


ITM port üzerinden Debug viewer'ı bombardıman ettim. 1 Byte karakter 7.5 ... 10 mikrosaniye içinde gidiyor. Arada bir veriler bozulsa da sonuç süper.


arada bir bozulmasinin nedeni buyuk ihtimalle empedans mismatchden dolayi yansima olmasi vs olabilir datasheet'de belirtilen bir termination direnci varmi bir bakarmisiniz. Ben genellikle bu tip hizli veri hatlarinda araya bir tane 82 ohm (75 bulamadigim icin) koyarim cok sik olur :-)

mesaj birleştirme:: 08 Mayıs 2015, 13:16:10

Gerci benim hatirladigim kdari ile SWD protokolunde hata kontrolu da vardi ama zaman gecti, yas ilerledi dogrumu hatirliyorum bilemiyorum ...
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

justice_for_all

Peripheral examples içerisinde bulunan LibDebug örneği.


/**

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/** @addtogroup STM32F0xx_StdPeriph_Examples
  * @{
  */

/** @addtogroup Lib_DEBUG_Example
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
USART_InitTypeDef USART_InitStructure;

/* Private function prototypes -----------------------------------------------*/
#ifdef __GNUC__
 /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    set to 'Yes') calls __io_putchar() */
 #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
 #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f0xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f0xx.c file
     */ 
  GPIO_InitTypeDef GPIOA_InitStructure;

  /* USARTx configured as follow:
        - BaudRate = 115200 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
  */
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  STM_EVAL_COMInit(COM1, &USART_InitStructure);
  
  /* Initialize all peripherals pointers */
  IP_Debug();
  
  printf("\r\n STM32F0xx Firmware Library compiled with FULL ASSERT function... \n\r");
  printf("...Run-time checking enabled  \n\r");

  /* Simulate wrong parameter passed to library function ---------------------*/
  /* To enable SPI1 clock, RCC_APB2PeriphClockCmd function must be used and
     not RCC_APB1PeriphClockCmd */
  RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  
  /* Some member of GPIOA_InitStructure structure are not initialized */
  GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  /*GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;*/
  GPIOA_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIOA_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
  GPIO_Init(GPIOA, &GPIOA_InitStructure);
  /* Infinite loop */
  while (1)
  {
  }
}

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(EVAL_COM1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number */

  printf("\n\r Wrong parameter value detected on\r\n");
  printf("       file  %s\r\n", file);
  printf("       line  %d\r\n", line);
    
  /* Infinite loop */
  /* while (1)
  {
  } */
}
#endif

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

yamak

Alıntı yapılan: z - 08 Mayıs 2015, 11:47:01
Vdd ve Gnd dahil olmak üzere 4 telli SWD mi bu tip debug işlemlerinde kullanabilecekmiyim?

Bu şekilde 32 adet port varmış. Süper bir şey.

Peki SWD pinlerinine bağlanmış STLlink cihazını kullanan yazılımı kendimiz yazabilirmiyiz?
Hocam SWO pinini de kullanmanız gerekiyo.Yani toplamda 5 pin lazım

z

Belki karakter bombardımanı yaptığımda bazı karakterlerin bozulmasının sebebi budur.

@mufitsozen

Empedans uyumsuzluğu olsa debug işlemlerinde de sorun yaşamamız gerekir. 

Karakter bozulmasını sebebi tahminimce şu şekilde;

PC yeter sana yetişemiyorum gibisinden bir uyarı yollaması lazım diye düşünüyorum.

while (ITM_Port32(0) == 0);
satırı sanki bu uyarının olup olmadığına bakıyor.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com