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?
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/)
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.
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.
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);
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)
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.
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.
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 ...
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****/
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
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.