你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32片内外设--DBG之Keil SWO输出

[复制链接]
党国特派员 提问时间:2015-1-20 13:36 /
本帖最后由 harvardx 于 2015-1-27 23:45 编辑

1) 加入stdio.h,这样你就可以调用printf函数了
2) 使能SWO输出
使能SWO输出。最简单的办法就是将如下的函数拷贝到你的工程里面,并且在mian函数初始化之后调用该函数。
  1. void setupSWO(void)
  2. {
  3. uint32_t *dwt_ctrl = (uint32_t *) 0xE0001000;
  4. uint32_t *tpiu_prescaler = (uint32_t *) 0xE0040010;
  5. uint32_t *tpiu_protocol = (uint32_t *) 0xE00400F0;

  6. CMU->HFPERCLKEN0 |= CMU_HFPERCLKEN0_GPIO;

  7. GPIO->ROUTE |= GPIO_ROUTE_SWOPEN;
  8. #if defined(_EFM32_GIANT_FAMILY)

  9. GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC0;


  10. GPIO->P[5].MODEL &= ~(_GPIO_P_MODEL_MODE2_MASK);
  11. GPIO->P[5].MODEL |= GPIO_P_MODEL_MODE2_PUSHPULL;
  12. #else

  13. GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC1;

  14. GPIO->P[2].MODEH &= ~(_GPIO_P_MODEH_MODE15_MASK);
  15. GPIO->P[2].MODEH |= GPIO_P_MODEH_MODE15_PUSHPULL;
  16. #endif

  17. CMU->OSCENCMD = CMU_OSCENCMD_AUXHFRCOEN;

  18. while(!(CMU->STATUS & CMU_STATUS_AUXHFRCORDY));


  19. CoreDebug->DHCSR |= 1;
  20. CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;


  21. *dwt_ctrl = 0x400113FF;

  22. *tpiu_prescaler = 0xf;

  23. *tpiu_protocol = 2;

  24.    ITM->LAR = 0xC5ACCE55;
  25.    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[5].MODEL &= ~(_GPIO_P_MODEL_MODE2_MASK);
GPIO->P[5].MODEL |= GPIO_P_MODEL_MODE2_PUSHPULL;
#else

GPIO->ROUTE = (GPIO->ROUTE & ~(_GPIO_ROUTE_SWLOCATION_MASK)) | GPIO_ROUTE_SWLOCATION_LOC1;

GPIO->P[2].MODEH &= ~(_GPIO_P_MODEH_MODE15_MASK);
GPIO->P[2].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。详情如下:
3.png
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) View
8) 点击运行之后,在Debug (printf) View里即可查看
222.jpg




收藏 评论9 发布时间:2015-1-20 13:36

举报

9个回答
caizhiwei 回答时间:2015-1-20 14:05:48
我用iar工程为什么不成功?奇怪
拼命三郎 回答时间:2015-1-22 13:26:29
stm32.jpg
子曰小玖 回答时间:2015-1-22 14:44:36
学习一下
stary666 回答时间:2015-1-22 15:30:01
学习一下
feel-376797 回答时间:2015-1-27 22:14:21
谢谢楼主分享
harvardx 回答时间:2015-1-27 23:44:42
楼主的代码 可以使用代码插入功能
党国特派员 回答时间:2015-1-28 09:25:02
harvardx 发表于 2015-1-27 23:44
楼主的代码 可以使用代码插入功能

混了这么多年论坛,不知道有这个功能,惭愧啊。
谢谢提醒,下次试用下这个功能。 blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png
harvardx 回答时间:2015-1-28 11:33:28
党国特派员 发表于 2015-1-28 09:25
混了这么多年论坛,不知道有这个功能,惭愧啊。
谢谢提醒,下次试用下这个功能。 ...

造福需要的同学 哈哈 一般人我不告诉他 嫩是特派员
时光碎了天 回答时间:2015-1-28 12:38:54
学习了的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版