一个单片机调试小工具的编程思路

发布者:innovator7最新更新时间:2024-03-20 来源: elecfans关键字:单片机  编程思路 手机看文章 扫描二维码
随时随地手机看文章

一、概述

在平时编写STM32单片机代码时,我们经常会遇到某一个函数或某一个变量需要反复调试的情况,而常用的方法只能是在源码修改并下载至单片机调试。反复这样不仅麻烦,而且反复烧写单片机对其FLASH也有影响,因此就考虑编写一款小工具,可以实现: 

1)通过串口控制单片机执行我们期望的函数,同时函数参数最大支持5个,其参数类型支持char、short、int、float及其无符号类型和相应的指针,不支持long及double。

2)对于含有对字符串及数组操作的函数,需要通过数组传值后,在调用函数时写入该变量地址才能实现对这些变量的操作。支持函数返回值得显示。

3)支持对全局变量进行任意的修改。

4)支持十进制与十六进制切换.

5)通讯超时自动重传或关闭串口。建议配合KEIL一起使用,效果更好。本软件使用C#编写,运行环境为NET 4.5。先让大家看看效果,感兴趣的话可以继续往下看: 

  1. 上位机调试设置a069ca6bbac98595d2301a07b5581387_wKgZomTm_kqAaingAAQba2OnCjg192.png?imageView2/2/w/5502.函数调用6b4c6e6ec68df122715b9c743a096183_wKgZomTm_kqATeU1AALnFrJ4uxA588.png?imageView2/2/w/550

    3.全局变量的写入115c20e72038d2f06a1c0bee59f78b70_wKgZomTm_kqATwCPAAfQ_XaRxU0198.png?imageView2/2/w/550 4.通讯超时处理fa919c3aedef3fc2092cc19155fa8998_wKgZomTm_kuARhzHAANWcIDcGbc798.png?imageView2/2/w/550


二、上位机的处理 2.1 原理 在使用keil编译STM32后,我们会在.hex文件的同一个文件夹中发现一个.map文件。这个.map文件包含了源码中函数与全局变量的地址、大小、优化等信息。这里贴一个简化的.map文件给大家看一下:


Component: ARM Compiler 5.06 update 6 (build 750) Tool: armlink [4d35ed]


==============================================================================


Section Cross References


  startup_stm32f103xe.o(STACK) refers (Special) to heapauxi.o(.text) for __use_two_region_memory


  startup_stm32f103xe.o(HEAP) refers (Special) to heapauxi.o(.text) for __use_two_region_memory


  startup_stm32f103xe.o(RESET) refers (Special) to heapauxi.o(.text) for __use_two_region_memory


  startup_stm32f103xe.o(RESET) refers to startup_stm32f103xe.o(STACK) for __initial_sp


==============================================================================


Removing Unused input sections from the image.


  Removing main.o(.rev16_text), (4 bytes).


  Removing main.o(.revsh_text), (4 bytes).


  Removing main.o(.rrx_text), (6 bytes).


  Removing gpio.o(.rev16_text), (4 bytes).


  Removing gpio.o(.revsh_text), (4 bytes).


384 unused section(s) (total 34104 bytes) removed from the image.


==============================================================================


Image Symbol Table


  Local Symbols


  Symbol Name          Value Ov Type  SizeObject(Section)


  ../Core/Src/gpio.c       0x00000000 Number   0gpio.o ABSOLUTE


  ../Core/Src/main.c       0x00000000 Number   0main.o ABSOLUTE


  ../Core/Src/stm32f1xx_hal_msp.c    0x00000000 Number   0stm32f1xx_hal_msp.o ABSOLUTE


  ../Core/Src/stm32f1xx_it.c     0x00000000 Number   0stm32f1xx_it.o ABSOLUTE


  ../Core/Src/system_stm32f1xx.c   0x00000000 Number   0system_stm32f1xx.o ABSOLUTE


  ../Core/Src/tim.c        0x00000000 Number   0tim.o ABSOLUTE


  ../Core/Src/usart.c        0x00000000 Number   0usart.o ABSOLUTE


  ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c 0x00000000 Number   0stm32f1xx_hal.o ABSOLUTE


  ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c 0x00000000 Number   0stm32f1xx_hal_cortex.o ABSOLUTE


  ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c 0x00000000 Number   0stm32f1xx_hal_dma.o ABSOLUTE


  ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c 0x00000000 Number   0stm32f1xx_hal_exti.o ABSOLUTE




  Global Symbols




  Symbol Name          Value Ov Type  SizeObject(Section)




  BuildAttributes$THM_ISAv4$P$D$K$B$S$PE$A:L22UL41UL21$X:L11$S22US41US21$IEEE1$IW$USESV6$~STKCKD$USESV7$~SHL$OSPACE$ROPI$EBA8$UX$STANDARDLIB$REQ8$PRES8$EABIv2 0x00000000 Number   0anon$obj.o ABSOLUTE


  __ARM_use_no_argv        0x00000000 Number   0main.o ABSOLUTE


  __ARM_exceptions_init       - Undefined Weak Reference


  __alloca_initialize       - Undefined Weak Reference


  __arm_preinit_          - Undefined Weak Reference


  __cpp_initialize__aeabi_      - Undefined Weak Reference


  _terminate_alloc        - Undefined Weak Reference


  _terminate_user_alloc       - Undefined Weak Reference


  _terminateio          - Undefined Weak Reference


  __Vectors_Size         0x00000130 Number   0startup_stm32f103xe.o ABSOLUTE


  __Vectors          0x08000000 Data   4startup_stm32f103xe.o(RESET)


  __Vectors_End          0x08000130 Data   0startup_stm32f103xe.o(RESET)


  __main           0x08000131 Thumb Code 8__main.o(!!!main)


  in             0x2000001c Data   4main.o(.data)


  uin            0x20000020 Data   4main.o(.data)


  uwTick           0x20000024 Data   4stm32f1xx_hal.o(.data)


  uwTickPrio           0x20000028 Data   4stm32f1xx_hal.o(.data)


  uwTickFreq           0x2000002c Data   1stm32f1xx_hal.o(.data)








==============================================================================




Memory Map of the image




Image Entry point : 0x08000131




Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00002de8, Max: 0x00080000, ABSOLUTE, COMPRESSED[0x00002da8])




  Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00002b94, Max: 0x00080000, ABSOLUTE)




  Exec Addr  Load Addr  Size   Type Attr  Idx  E Section Name  Object




  0x08000000 0x08000000 0x00000130 Data RO    3  RESET     startup_stm32f103xe.o


  0x08000130 0x08000130 0x00000008 Code RO   2955* !!!main     c_w.l(__main.o)


  0x08000138 0x08000138 0x00000034 Code RO   3143  !!!scatter    c_w.l(__scatter.o)


  0x0800016c 0x0800016c 0x0000003a Code RO   3141  !!dczerorl    c_w.l(__dczerorl.o)


  0x080001a6 0x080001a6 0x00000002 PAD


  0x080001a8 0x080001a8 0x0000001c Code RO   3145  !!handler_zi  c_w.l(__scatter_zi.o)






  Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08002b94, Size: 0x00008bb0, Max: 0x00010000, ABSOLUTE, COMPRESSED[0x00000214])




  Exec Addr  Load Addr  Size   Type Attr  Idx  E Section Name  Object




  0x20000000 COMPRESSED 0x00000010 Data RW   18  .data     test.o


  0x20000010 COMPRESSED 0x00000014 Data RW   78  .data     main.o


  0x20000024 COMPRESSED 0x00000009 Data RW   1481  .data     stm32f1xx_hal.o


  0x2000002d COMPRESSED 0x00000003 PAD


  0x20000030 COMPRESSED 0x00000004 Data RW   2832  .data     system_stm32f1xx.o


  0x20000034 COMPRESSED 0x00000004 PAD


  0x20000038 COMPRESSED 0x0000021c Data RW   2910  .data     debug_revice.o






==============================================================================




Image component sizes






  Code (inc. data) RO Data  RW Data  ZI Data  Debug Object Name




   172    6    0    0    0   3002 debug_function.o


   580   98    0  540   2104   3763 debug_revice.o


  36    4    0    0    0  767 gpio.o


   288   24    0   20   50 486558 main.o


  64   26  304    0  32768  820 startup_stm32f103xe.o


   152   32    0    9    0   5977 stm32f1xx_hal.o


   304   22    0    0    0  29503 stm32f1xx_hal_cortex.o


   510   10    0    0    0   1927 stm32f1xx_hal_dma.o


   832   40    0    0    0   2092 stm32f1xx_hal_gpio.o


  84    8    0    0    0  918 stm32f1xx_hal_msp.o


  1784  110    0    0    0   6112 stm32f1xx_hal_rcc.o


  1260   44    0    0    0   9974 stm32f1xx_hal_tim.o


   160   22    0    0    0   2453 stm32f1xx_hal_tim_ex.o


  1844   10    0    0    0  11460 stm32f1xx_hal_uart.o


  66   12    0    0    0   4980 stm32f1xx_it.o


   2    0   24    4    0   1155 system_stm32f1xx.o


   134   10    0   16    0   6385 test.o


   192   18    0    0   72   1702 tim.o


   220   26    0    0   68   1778 usart.o




  ----------------------------------------------------------------------


  8702  522  362  596  35068 581326 Object Totals


   0    0   32    0    0    0 (incl. Generated)


  18    0    2    7    6    0 (incl. Padding)




  ----------------------------------------------------------------------




  Code (inc. data) RO Data  RW Data  ZI Data  Debug Library Member Name




  58    0    0    0    0    0 __dczerorl.o


   8    0    0    0    0   68 __main.o


   0    0    0    0    0    0 __rtentry.o


  12    0    0    0    0    0 __rtentry2.o


   6    0    0    0    0    0 __rtentry4.o

[1] [2] [3] [4] [5]
关键字:单片机  编程思路 引用地址:一个单片机调试小工具的编程思路

上一篇:MMC中断的特点及解决方案
下一篇:SAR ADC内部结构

推荐阅读最新更新时间:2026-03-04 07:36

高手谈谈单片机编程思路
我曾经做过两年的单片机产品,在对单片机编程的过程中逐渐形成了一个大体固定的整体框架,也可以说是编程思路。现提出来供大家参考。 首先,对外围芯片进行分类,属同一功能或同一芯片的程序采用模块化的形式,用固定的几个函数实现,一般不同芯片之间的函数功能尽量不重叠,也不要使用一个函数覆盖几个芯片,以便于后期的调试,如果涉及到芯片之间通讯的,可以单独列出,使用专门的函数进行处理; 其次,将单片机中需要完成的工作按轻重缓急进行分类,一般我会设置两个定时中断,其中一个定时时间大致在20mS左右,用来处理一些按钮防抖处理、时间日期计算、对输入处理后产生对应标志位、器件刷新等一些实时性要求不是很高,但必须有时间要求的事物处理,另外设立一个定时
[单片机]
如何学好PLC编程思路和办法
今天,小编为大家收集了一些关于如何学好PLC编程的思路和办法,希望大家收下这波安利后,能对PLC编程有个大概的学习思路,自己独立应用PLC完成编程。 1、基本的硬件知识 编程之前,需要了解一些基本的硬件知识,最好从硬件的选型和画图入手,等把输入输出的类型,模拟量的选型等搞清楚之后,再开始编程会简单点。熟悉基本的硬件电路,你就会发现原来梯形图和这些硬件电路是可以很好对应起来的。 2、了解PLC编程的方式 线性编程、模块化编程、结构化编程。对于西门子plc,以结构化编程为主,但可以使用线性编程和模块化编程,对于结构化编程,需要有一定的结构化编程思想。 如果你想比较快掌握西门子PLC,建议首先学习线性编程或模块化编程。在学习过程中慢
[嵌入式]
stm32发送中断编程思路
查询方式:发送数据——先发后查; 接收数据——先查后收。 中断方式:发送数据——发送、等待中断、中断中发送; 接收数据——等待中断、在中断中接收。 发送一个字符串 查询发送:发送完一个字节,等待发送完,继续发送下个字节,直到整个字符串发送完 在这期间一直占用CPU 中断发送:发送完一个字节CPU响应中断将下个字节放到外设寄存器,直到整个字符串发完 只有在中断时占用CPU资源 串口发送中断我只用过一次: 只要将第一个字节送进串口发送数据寄存器,就可以在串口发送中断里依次把剩余的字节都发送完,省去了等待每一个字节发送完的时间。 不过这是在AVR中用的。STM32的
[单片机]
英飞凌汽车MCU的战略:从TriCore到RISC-V的架构演进
英飞凌在汽车微控制器(MCU)领域持续稳居全球领导地位,2024年市场份额达32%,并在软件定义汽车(SDV)时代提前布局未来。 我们参加了英飞凌的技术研讨会,在这次小范围交流中,英飞凌科技汽车业务大中华区高级市场经理刘琳从产品架构演进、应用布局及生态战略三个维度,解析英飞凌如何通过AURIXTM系列的持续演进与RISC-V架构的引入,构建面向全场景的车规级MCU体系,阐述了这家MCU龙头企业的思考。 Part 1 汽车MCU中的经典: AURIXTM系列的演进 英飞凌长期以来在汽车电子控制系统中占据核心地位,AURIXTM系列MCU,以TriCoreTM架构为基础,通过在实时性能、安全性与可靠性上的深
[汽车电子]
英飞凌汽车<font color='red'>MCU</font>的战略:从TriCore到RISC-V的架构演进
嵌入式通信架构演进:从MCU+AT模式到OpenCPU的必然性分析
基于上篇对AT架构痛点及Open升级路径的探讨,本文下篇将深入分析OpenCPU架构的技术实现与落地实践。通过详细解析资源统一调度、协议栈内嵌以及开发工具链优化,并结合实际硬件平台与应用场景,阐述OpenCPU如何突破传统架构的局限,同时探讨其在边缘计算、智慧能源等新兴领域的应用方向,以完整呈现技术升级的价值闭环与未来趋势。 上一篇讲到,在我们直面传统设备“MCU+AT”无法根治的架构性疲劳之后,行业开始转向一种新的方式OpenCPU,其本质是把模组变为可运行用户逻辑的主机。 OpenCPU真的能突破重重障碍,实现从“外部控制”到“一体自治”的全面跃迁吗? 第四章:OpenCPU相较MCU
[嵌入式]
嵌入式通信架构演进:从<font color='red'>MCU</font>+AT模式到OpenCPU的必然性分析
两轮车手机镜像投屏:恩智浦i.MX RT1170 MCU赋能更智能、更安全的数字互联仪表板
以MCU为核心的平台为入门级数字互联仪表板(DCC)增添智能手机镜像投屏功能。目前,可集成于仪表板的骑行者必备功能日益丰富,RT产品路线图还将纳入更多先进特性。 更智能的骑行,更简化的技术 骑行者现在可以便捷地在仪表板上直接使用智能手机应用,而无需承担完整娱乐中控系统的成本或复杂性。凭借恩智浦i.MX RT1170 MCU赋能,入门级数字互联仪表板正在迎来一次重大升级。通过智能手机的无缝手机镜像投屏,两轮车现在能够以精简、高性价比的方案提供直观、方便骑行者使用的功能,如导航、音乐和通话等。i.MX RT1170 MCU推动了这场变革,实现了更智能、更互联的骑行体验。 安全与简便兼得 手机镜像投屏的好处立竿见影且具
[手机便携]
两轮车手机镜像投屏:恩智浦i.MX RT1170 <font color='red'>MCU</font>赋能更智能、更安全的数字互联仪表板
Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
公司通过芯片、软件、工具、生产就绪型应用以及不断壮大的合作伙伴生态系统的支持,简化并加速边缘AI系统开发 人工智能(AI)与机器学习(ML)创新的下一个重要突破,是将ML模型从云端迁移至边缘,以满足当今工业、汽车、数据中心及消费级物联网(IoT)网络对实时推理与决策应用的需求。Microchip Technology (微芯科技公司)推出全栈解决方案扩展其边缘AI产品线,利用单片机(MCU)和微处理器(MPU)简化生产就绪型应用的开发。这些器件最接近位于边缘的众多传感器,可收集传感器数据、控制电机、触发警报和执行器等。 长期以来,Microchip的产品都是嵌入式设计的主力军,这些全新的解决方案将MCU和MPU转化为了
[单片机]
Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能<font color='red'>MCU</font>和MPU实现  智能实时决策
MIKROE与瑞萨签署多年MCU嵌入式开发工具支持协议
设计人员通过瑞萨远程板场可在新MCU发布首日免费开始编程和编码 2026年1月28日: 作为一家通过提供基于成熟标准的创新式硬件、软件产品来大幅缩短开发时间的嵌入式解决方案公司,MIKROE与总部位于东京的全球半导体解决方案提供商瑞萨电子签署了一项为期多年的微控制器(MCU)开发工具支持协议。根据该协议,MIKROE为瑞萨最受欢迎的500个MCU以及即将发布的新产品提供开发工具,并建立瑞萨首个Planet Debug远程板场,使世界各地的开发人员能够在无需投资任何硬件的条件下,即可远程调试代码。 【图为:MIKROE首席执行官Nebojsa Matic在瑞萨Planet Debug远程板场】 MIKROE的NECT
[嵌入式]
MIKROE与瑞萨签署多年<font color='red'>MCU</font>嵌入式开发工具支持协议
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved