STM32片内外设--DBG之Keil SWO输出
本帖最后由 harvardx 于 2015-1-27 23:45 编辑1) 加入stdio.h,这样你就可以调用printf函数了2) 使能SWO输出使能SWO输出。最简单的办法就是将如下的函数拷贝到你的工程里面,并且在mian函数初始化之后调用该函数。void setupSWO(void)
{
uint32_t *dwt_ctrl = (uint32_t *) 0xE0001000;
uint32_t *tpiu_prescaler = (uint32_t *) 0xE0040010;
uint32_t *tpiu_protocol = (uint32_t *) 0xE00400F0;
CMU->HFPERCLKEN0 |= CMU_HFPERCLKEN0_GPIO;
GPIO->ROUTE |= GPIO_ROUTE_SWOPEN;
#if defined(_EFM32_GIANT_FAMILY)
GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC0;
GPIO->P.MODEL &= ~(_GPIO_P_MODEL_MODE2_MASK);
GPIO->P.MODEL |= GPIO_P_MODEL_MODE2_PUSHPULL;
#else
GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC1;
GPIO->P.MODEH &= ~(_GPIO_P_MODEH_MODE15_MASK);
GPIO->P.MODEH |= GPIO_P_MODEH_MODE15_PUSHPULL;
#endif
CMU->OSCENCMD = CMU_OSCENCMD_AUXHFRCOEN;
while(!(CMU->STATUS & CMU_STATUS_AUXHFRCORDY));
CoreDebug->DHCSR |= 1;
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
*dwt_ctrl = 0x400113FF;
*tpiu_prescaler = 0xf;
*tpiu_protocol = 2;
ITM->LAR = 0xC5ACCE55;
ITM->TCR = 0x10009;
void setupSWO(void)
{
uint32_t *dwt_ctrl = (uint32_t *) 0xE0001000;
uint32_t *tpiu_prescaler = (uint32_t *) 0xE0040010;
uint32_t *tpiu_protocol = (uint32_t *) 0xE00400F0;
CMU->HFPERCLKEN0 |= CMU_HFPERCLKEN0_GPIO;
GPIO->ROUTE |= GPIO_ROUTE_SWOPEN;
#if defined(_EFM32_GIANT_FAMILY)
GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC0;
GPIO->P.MODEL &= ~(_GPIO_P_MODEL_MODE2_MASK);
GPIO->P.MODEL |= GPIO_P_MODEL_MODE2_PUSHPULL;
#else
GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC1;
GPIO->P.MODEH &= ~(_GPIO_P_MODEH_MODE15_MASK);
GPIO->P.MODEH |= GPIO_P_MODEH_MODE15_PUSHPULL;
#endif
CMU->OSCENCMD = CMU_OSCENCMD_AUXHFRCOEN;
while(!(CMU->STATUS & CMU_STATUS_AUXHFRCORDY));
CoreDebug->DHCSR |= 1;
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
*dwt_ctrl = 0x400113FF;
*tpiu_prescaler = 0xf;
*tpiu_protocol = 2;
ITM->LAR = 0xC5ACCE55;
ITM->TCR = 0x10009;
}
3) 配置Keil的工程选项打开Keil的工程配置,选择Debug页面,选择仿真器为Cortex-M/R J-Link/J-Trace, 并点击仿真器选项边上的setting选项,打开具体的设置窗口。在打开的窗口中,切换到Trace页面,选中Enable,并且设置Core Clock为14MHz,分频选项为Core Clock/16。详情如下:
4) 在初始化SWO函数之后的地方,使用printf函数进行输出。例如printf("Hello world")。5) 在你的工程里面,需要添加如下的函数:
struct __FILE
{
int handle;
};
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{
ITM_SendChar(ch);
return(ch);
}
6) 编译你的代码,并且进入Debug状态7) 打开Keil的printf-view窗口, 通过 View -> Serial Windows -> Debug(printf) View8) 点击运行之后,在Debug (printf) View里即可查看
我用iar工程为什么不成功?奇怪 学习一下 学习一下 谢谢楼主分享 楼主的代码 可以使用代码插入功能 harvardx 发表于 2015-1-27 23:44
楼主的代码 可以使用代码插入功能
混了这么多年论坛,不知道有这个功能,惭愧啊。
谢谢提醒,下次试用下这个功能。 党国特派员 发表于 2015-1-28 09:25
混了这么多年论坛,不知道有这个功能,惭愧啊。
谢谢提醒,下次试用下这个功能。 ...
造福需要的同学 哈哈 一般人我不告诉他 嫩是特派员 学习了的
页:
[1]