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

发布时间:2024-03-20  

一、概述

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

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

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

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

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

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

  1. 上位机调试设置a069ca6bbac98595d2301a07b5581387_wKgZomTm_kqAaingAAQba2OnCjg192.png2.函数调用6b4c6e6ec68df122715b9c743a096183_wKgZomTm_kqATeU1AALnFrJ4uxA588.png

    3.全局变量的写入115c20e72038d2f06a1c0bee59f78b70_wKgZomTm_kqATwCPAAfQ_XaRxU0198.png 4.通讯超时处理fa919c3aedef3fc2092cc19155fa8998_wKgZomTm_kuARhzHAANWcIDcGbc798.png


二、上位机的处理 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

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    也会进入AT状态。但是指示灯依然是快闪(1秒2次)。 3.模块配对成功,此时STA双闪(一次闪2下,2秒闪一次)。 6、设置过程中遇到的两个问题 正常情况下,按照上面的配置,基本上都能成功。但如......
    浅析STM32调试过程中的几个相关问题;总的来讲,单片机调试是单片机开发工作必不可少的环节。不管你愿不愿意,调试过程中总会有各种不期而遇的问题出现在我们面前来磨砺我们。这里分享几点STM32调试过程中......
    方式上,均需要开发人员注意硬件接口的正确性和稳定性,程序调整等方面,以确保调试成功。 此外,在进行单片机调试时,还需要了解单片机编程知识,如基本指令和控制语句、数据类型与运算符、数组、函数和指针等,以便在出问题时可以快速定位问题......
    应届生面试单片机工作常见被问到的问题有哪些?;作为应届生寻求单片机工作的职位,面试是不可避免的过程。在面试过程中,面试官可能会问得深入和具体,主要聚焦于单片机应用和开发。下文将针对应届生面试单片机工作时常见的被问到的问题......
    测试方便,各位也可以画一个PCB板,这样就可以避免使用一堆杜邦线进行连接,也可以避免调试过程中遇到一些不必要的问题,底板的原理图可以参考下图所示。 因为我们要选择串口模式,所以实际使用过程中,CON1......
    斯仪表提供的微小电阻测试方案,通过使用普赛斯高精度源表,以及纳伏2182A(1nV灵敏度)组合成为完备的测试解决方案,完美解决了在微小电阻测试过程中经常遇到的问题,使电阻测量灵敏度高达 10nW。再配......
    如何成为高级硬件工程师?; 前言 ARM嵌入式和单片机学习有着密不可分的关系,在学习单片机的过程中......
    的内容基本上就是想查看的变量值、代码的执行位置跟踪、算法或者某些运算的结果等等。这些输出,仅用于调试阶段,而在人机调试过程中,使用计算机的串口助手软件进行交互,则输出的数据应该便于识读和判断。 1. C库函数printf格式......
    Keil环境中点击仿真按钮就可以实现联合仿真调试 总结: 我们在学习单片机写程序的过程中,没有人可以做到写出的程序没有一点问题,有效的调试手段恰恰是快速解决问题的方式方法,多个办法多条路;特别......
    经验分享 | STM32CubeMX + STM32F1系列开发时遇到的四个问题及解决方案分享;这四个问题是我在使用STM32F103C8T6 + STM32CubeMX做项目时遇到的,给大......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>