Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: z - 07 Mayıs 2015, 23:54:27

Başlık: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: z - 07 Mayıs 2015, 23:54:27
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?
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: yamak - 08 Mayıs 2015, 09:33:44
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 (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/ (http://armcortexm.blogs.upv.es/stm32f4-discovery-and-printf-redirection-to-debug-viewer-in-keil/)
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: X-Fi - 08 Mayıs 2015, 10:12:22
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.
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: yamak - 08 Mayıs 2015, 10:19:58
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.
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: 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?

#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);
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: Gökhan BEKEN - 08 Mayıs 2015, 12:09:08
http://yusuftas.com/keil-ile-printf-kullanimi/ (http://yusuftas.com/keil-ile-printf-kullanimi/)
https://www.youtube.com/watch?v=jRBdTLwnP9M (https://www.youtube.com/watch?v=jRBdTLwnP9M)
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: mufitsozen - 08 Mayıs 2015, 12:50:59
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 (https://fedcsis.org/proceedings/2012/pliks/279.pdf)

http://infocenter.arm.com/help/topic/com.arm.doc.ddi0413c/DDI0413C_cortexm1_r0p1_trm.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.
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: z - 08 Mayıs 2015, 13:04:02
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.

Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: mufitsozen - 08 Mayıs 2015, 13:15:12
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 ...
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: justice_for_all - 08 Mayıs 2015, 13:36:45
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****/
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: yamak - 08 Mayıs 2015, 16:56:12
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
Başlık: Ynt: Keil'de CM3 çipi üzerindeki kodu debug yaparken ekrana mesaj göndermek.
Gönderen: z - 08 Mayıs 2015, 18:43:37
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.