IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 关于STM32的ITM 方式输出走了一些弯路 -> 正文阅读

[嵌入式]关于STM32的ITM 方式输出走了一些弯路

最简单直接且有效的方式就是这篇文章:使用SWO代替UART,实现printf打印功能

实现STM32的printf输出的四种方式

??四种实现方式,我认为第二种最简单可行。

方式一二三通用配置

img

img

img

方式一:Keil官网说明 :

https://www.keil.com/support/man/docs/jlink/jlink_trace_itm_viewer.htm

image-20210904102055548

方式二 和 方式三:

需添加两个头文件stm32f10x.h 和 stdio.h,方式三为串口方式,非ITM方式,还需进行硬件资源配置,看文章了解了就顺便记录下来了。

image-20210904102105596

方式四:添加源文件以及初始化文件

需添加两个头文件stm32f10x.h 和 stdio.h,这点儿是后来弄懂其它方式后才了解到的。

image-20210904102009257

image-20210904095846765

image-20210904102023931

img

为什么要用ITM

??有一个模块的例程代码就用到了printf,然后就想到了之前鱼鹰写的ITM方式调试,就顺势了解了一下怎么实现的,调试方式的进步可能带来工作效率大的提升。

ITM的SWO输出优势

  • 硬件:不占用外设。串口是MCU的片内外设,会占用一个外设资源,影响硬件设计。
  • 代码:不需要写驱动。串口的话针对不同的MCU需要重新编写串口的驱动。
  • 调试:不会引入中断嵌套,也避免了此类问题。串口输出一般使用中断方式发送,调试时可能需要在中断中观察某些信息,这样中断嵌套就容易出现问题。
  • 速度:SWO的速度比串口快得多。在时序要求较高的情况下对代码的影响较小。发送相同的字符串,SWO的速度是串口的8.7倍(一篇文章的测试数据)。

目标

??仿真器连接单片机 与 PC,在线调试,将“Hello World”输出到PC上,在开发工具(MDK) 的某个窗口显示。

原理

??单片机借助PC的显示/输入设备 实现了自己的 输出和输入。

??开发环境搭建:STM32 + MDK + 实现方式(ITM机制:使用硬件接口:五线SWD)

??printf -------ITM提供寄存器-------> 仿真器 -------数据-------->PC机

??printf-------底层调用fputc函数-------> 重写fputc函数(实现输出设备重定向)

背景知识

??printf函数属于C语言标准库函数stdio.h ,用户能定义自己的C语言库函数 fputc,连接器在连接是自动使用新的功能函数。这个过程叫做重定向C语言库函数。在这里,fputc()就似乎目标硬件与标准库函数之间的一个抽象层,可以指定目标硬件

??在Cortex-M3\M4\M7系列MCU中,内核的调试组件有一个仪器跟踪宏单元(ITM)。ITM的主要用途是调试信息的输出(例如printf格式输出)。

??想在mdk中使用printf,需要同时重定义fputc函数 和 避免使用semihosting(半主机模式)。

??勾选microlib后,编译的时候就不把开启semihosting的文件包进去了(一位博主的理解)。

最终效果

image-20210904091514626

image-20210904091600891

源码:fputc实现

方式一

#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 you need here */ };
FILE __stdout;
FILE __stdin;

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

方式二

/* ITM_SendChar(ch) 为core_cm3.h中定义的内联函数,而头文件可以通过引用stm32f1xx.h包含进来 */
struct __FILE {   int handle; };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
  ITM_SendChar(ch);
  return(ch);
}

方式三

int fputc(int ch, FILE *f)
{
  USART_SendData(USART1, (uint8_t) ch);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}
  return ch;
}

反思自己的问题

??SWD模式的trace settings 很关键,之前看的那篇文章由于最关键界面的排版位置不对,没有注意。

??很长时间没用到Keil,导致将源文件添加到工程都一时间忘记了。

收获总结

??认为没啥难度的事情,那就该先实现了再说,遇到问题了再了解情况,再找文章实验,再了解,几篇文章下来只要有一篇实现目标,其它的也就能理解不足在哪儿了,此时掌握了多种实现方法。有句话是这么说的:人生没有白走的路,每一步都算数。

??其中最大的收获是随着了解的深入,问问题的方式不断发生转变,从多角度去探究,上网找答案,最后:山重水复疑无路,柳暗花明又一村。 这种真是,看着挺简单,不自己动手试试就不知道有多“简单”。在得到最终结果前,你不知道距离达到目标还有多远。曾经有好几次类似的经历,都无果而终,很可惜,就卡在那么一个地方,试了很多次(重复实验很多),最后不了了之,真是打击积极性,破坏成就感。不过这次我成功了,真是一种激励。

??弯路如果达到目的地了就没有白走,那些弯路让你对如何达到这个结果有更深刻的认识。甚至一条路走通之后,你还能找到其它几条通往这个目的地的路。豁然贯通的舒畅。
一个地方,试了很多次(重复实验很多),最后不了了之,真是打击积极性,破坏成就感。不过这次我成功了,真是一种激励。

??弯路如果达到目的地了就没有白走,那些弯路让你对如何达到这个结果有更深刻的认识。甚至一条路走通之后,你还能找到其它几条通往这个目的地的路。豁然贯通的舒畅。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:53:52  更:2021-09-08 10:55:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/3 13:51:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码