发新帖本帖赏金 150.00元(功能说明)我要提问
返回列表
[程序源码]

分享一个自编的单片机调试小工具并简单的谈谈其编程思路

[复制链接]
911|8
手机看帖
扫描二维码
随时随地手机跟帖
纪国圣|  楼主 | 2022-4-16 10:12 | 显示全部楼层 |阅读模式
本帖最后由 纪国圣 于 2022-4-16 21:51 编辑

#申请原创#  
一、概述
在平时编写STM32单片机代码时,我们经常会遇到某一个函数或某一个变量需要反复调试的情况,而常用的方法只能是在源码修改并下载至单片机调试。反复这样不仅麻烦,而且反复烧写单片机对其FLASH也有影响,因此就考虑编写一款小工具,可以实现:
1)通过串口控制单片机执行我们期望的函数,同时函数参数最大支持5个,其参数类型支持char、short、int、float及其无符号类型和相应的指针,不支持long及double。
2)对于含有对字符串及数组操作的函数,需要通过数组传值后,在调用函数时写入该变量地址才能实现对这些变量的操作。支持函数返回值得显示。
3)支持对全局变量进行任意的修改。
4)支持十进制与十六进制切换.
5)通讯超时自动重传或关闭串口。
建议配合KEIL一起使用,效果更好。
本软件使用C#编写,运行环境为NET 4.5。
先让大家看看效果,感兴趣的话可以继续往下看:
1.上位机调试设置
效果1.gif
2.函数调用
效果2.gif
3.全局变量的写入
效果3.gif
效果4.gif
4.通讯超时处理
效果5.gif
二、上位机的处理
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        Size  Object(Section)

    ../Core/Src/gpio.c                       0x00000000   Number         0  gpio.o ABSOLUTE
    ../Core/Src/main.c                       0x00000000   Number         0  main.o ABSOLUTE
    ../Core/Src/stm32f1xx_hal_msp.c          0x00000000   Number         0  stm32f1xx_hal_msp.o ABSOLUTE
    ../Core/Src/stm32f1xx_it.c               0x00000000   Number         0  stm32f1xx_it.o ABSOLUTE
    ../Core/Src/system_stm32f1xx.c           0x00000000   Number         0  system_stm32f1xx.o ABSOLUTE
    ../Core/Src/tim.c                        0x00000000   Number         0  tim.o ABSOLUTE
    ../Core/Src/usart.c                      0x00000000   Number         0  usart.o ABSOLUTE
    ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c 0x00000000   Number         0  stm32f1xx_hal.o ABSOLUTE
    ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c 0x00000000   Number         0  stm32f1xx_hal_cortex.o ABSOLUTE
    ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c 0x00000000   Number         0  stm32f1xx_hal_dma.o ABSOLUTE
    ../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c 0x00000000   Number         0  stm32f1xx_hal_exti.o ABSOLUTE

    Global Symbols

    Symbol Name                              Value     Ov Type        Size  Object(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         0  anon$obj.o ABSOLUTE
    __ARM_use_no_argv                        0x00000000   Number         0  main.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         0  startup_stm32f103xe.o ABSOLUTE
    __Vectors                                0x08000000   Data           4  startup_stm32f103xe.o(RESET)
    __Vectors_End                            0x08000130   Data           0  startup_stm32f103xe.o(RESET)
    __main                                   0x08000131   Thumb Code     8  __main.o(!!!main)
    in                                       0x2000001c   Data           4  main.o(.data)
    uin                                      0x20000020   Data           4  main.o(.data)
    uwTick                                   0x20000024   Data           4  stm32f1xx_hal.o(.data)
    uwTickPrio                               0x20000028   Data           4  stm32f1xx_hal.o(.data)
    uwTickFreq                               0x2000002c   Data           1  stm32f1xx_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
        52          8          0          0          0          0   __scatter.o
        28          0          0          0          0          0   __scatter_zi.o
        18          0          0          0          0         80   exit.o
         6          0          0          0          0        152   heapauxi.o
         0          0          0          0          0          0   indicate_semi.o
         2          0          0          0          0          0   libinit.o
         2          0          0          0          0          0   libinit2.o
         2          0          0          0          0          0   libshutdown.o
         2          0          0          0          0          0   libshutdown2.o
         8          4          0          0         96         68   libspace.o
        78          0          0          0          0         80   rt_memclr_w.o
         2          0          0          0          0          0   rtexit.o
        10          0          0          0          0          0   rtexit2.o
        12          4          0          0          0         68   sys_exit.o
        74          0          0          0          0         80   sys_stackheap_outer.o
         2          0          0          0          0         68   use_no_semi.o
       804         16          0          0          0        272   daddsub_clz.o
        90          4          0          0          0         92   dfixu.o
       156          4          0          0          0         92   dnaninf.o
        12          0          0          0          0         68   dretinf.o
       430          8          0          0          0        168   faddsub_clz.o
        62          4          0          0          0         84   ffixu.o
       140          4          0          0          0         84   fnaninf.o
        10          0          0          0          0         68   fretinf.o
         0          0          0          0          0          0   usenofp.o

    ----------------------------------------------------------------------
      2092         56          0          0         96       1592   Library Totals
         6          0          0          0          0          0   (incl. Padding)

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

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

       382         16          0          0         96        664   c_w.l
      1704         40          0          0          0        928   fz_ws.l

    ----------------------------------------------------------------------
      2092         56          0          0         96       1592   Library Totals

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

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


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

     10794        578        362        596      35164     577922   Grand Totals
     10794        578        362        532      35164     577922   ELF Image Totals (compressed)
     10794        578        362        532          0          0   ROM Totals

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

    Total RO  Size (Code + RO Data)                11156 (  10.89kB)
    Total RW  Size (RW Data + ZI Data)             35760 (  34.92kB)
    Total ROM Size (Code + RO Data + RW Data)      11688 (  11.41kB)

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


仔细观察可以发现.map文件主要由以下几个部分组成:
Component: ARM Compiler 5.06 update 6 (build 750) Tool: armlink [4d35ed]

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

Section Cross References

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

Removing Unused input sections from the image.

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

Image Symbol Table

    Local Symbols

    Symbol Name                              Value     Ov Type        Size  Object(Section)
        
        

    Global Symbols

    Symbol Name                              Value     Ov Type        Size  Object(Section)

   

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

Memory Map of the image


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

Image component sizes



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


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


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

    Total RO  Size (Code + RO Data)               
    Total RW  Size (RW Data + ZI Data)            
    Total ROM Size (Code + RO Data + RW Data)      

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



而我们最关注的信息如函数和全局变量的地址与大小都在.map文件中的Image Symbol Table->Global Symbols。知道了这些地址,我们只需将其感兴趣的函数与变量地址发送给单片机,单片机通过指针就可以执行相应的函数了。整个上位机正是基于这个原理而编写的。具体流程如下图所示:
关系图.png 流程图.zip (27.26 KB)

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 150.00 元 2022-04-21
理由:恭喜通过原创文章审核!请多多加油哦!

评论
21小跑堂 2022-4-21 16:06 回复TA
功能强大,操作简单,属于嵌入式开发者的福音,希望作者可以详细描述下具体使用功能,使用的过程描述较混乱,仅看**描述较难看明白如何使用。**对于上位机的描述较为清晰,但使用该功能可能比开发改功能的人更多。 
纪国圣|  楼主 | 2022-4-19 07:31 | 显示全部楼层
欢迎大家提出修改建议。

使用特权

评论回复
qiangtech| | 2022-4-19 09:02 | 显示全部楼层
非常详细,非常有创意。下了功夫。

使用特权

评论回复
gyh974| | 2022-4-19 15:28 | 显示全部楼层
楼主研究得很详细啊

使用特权

评论回复
gyh974| | 2022-4-19 16:22 | 显示全部楼层
function文件和data文件在哪里可以生成

使用特权

评论回复
纪国圣|  楼主 | 2022-4-19 17:02 | 显示全部楼层
gyh974 发表于 2022-4-19 16:22
function文件和data文件在哪里可以生成

准备两个txt文件,然后从.h文件拷贝你需要的函数与变量声明至这两个txt文件。其中存储变量声明的文件后缀名改为data;存储函数声明的文件后缀名改为function。

使用特权

评论回复
纪国圣|  楼主 | 2022-4-23 10:58 | 显示全部楼层
可能我专注于介绍如何开发该功能,没有详细介绍如何使用,所以这里再简述一下如何使用:
一、下位机:
1.添加debug文件:
如下图所示,先找到工程中的Debug文件夹并拷贝至你的工程中,之后添加Debug文件夹中的.c文件至keil工程:
使用方法1.PNG
2.添加相应的头文件路径:
使用方法2.PNG
3.在Debug_Function.c文件中的void Debug_Init(void)函数内添加串口与定时初始化函数:
使用方法3.PNG
4.在Debug_Revice.c文件中添加串口与定时器中断处理函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)                                                //接收中断
{
                unsigned char i = 0;
       
                HAL_TIM_Base_Stop_IT(&htim3);
                __HAL_TIM_SET_COUNTER(&htim3, 0);
    data[data_length] = recv_data;
       
                data_length++;
       
                if(data_length < MAX_RECIVE_LENGTH)
                {
                        HAL_TIM_Base_Start_IT(&htim3);
                }
                else
                {
                        data_length = 0;
                       
                        data_recived = 1;
                       
                        for(i = 0;i < MAX_RECIVE_LENGTH;i++)
                        {
                                r_data[i] = data[i];
                        }
                }
               
    HAL_UART_Receive_IT(&huart1, &recv_data, 1);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)                                                                        //超时中断,超时时间为5ms,一旦超时就发送8字节0xFF
{
        unsigned char i = 0;
       
        HAL_TIM_Base_Stop_IT(&htim3);
        __HAL_TIM_SET_COUNTER(&htim3, 0);
       
        data_length = 0;
       
        for(i = 0;i < PARAMENT_MAX_LENTH;i++)
        {
                returndata[i] = 0xFF;
        }
               
        crc = crc16(returndata, PARAMENT_MAX_LENTH);       
        returndata[PARAMENT_MAX_LENTH] = crc >> 8;
        returndata[PARAMENT_MAX_LENTH + 1] = crc;
  HAL_UART_Transmit(&huart1, returndata, 10, 0xFF);
}
各位可根据自己的MCU做适当修改
5.将Recived_Command_Handle();放在可以周期调用的地方,如main的while(1)内或定时器的中断内。
至此,下位机的移植准备工作就完成了。
二、上位机
1.文件.data与.function的编写
首先准备两个.txt文件。
对于
.data文件,大家只需从声明中拷贝置一个.txt文件,然后将后缀名改为.data即可:
使用方法4.PNG
同样的,对于.function文件,大家只需从 中拷贝置另一个.txt文件,然后将后缀名改为.function即可:
使用方法5.PNG
2.文件.data与.function的特别说明申明
在实际开发中,会应用到优化,这时就会出现某个已定义的函数或变量被优化而未分配地址的情况,这时候如果在.function文件添加函数.function文件,其地址只会默认为0,下位机不会执行该函数。变量也是同理。大家在使用中一定要注意函数或变量被优化。
3.超时时间的设置
这里的超时时间指的是发送命令字至接收到返回值的间隔。无论函数是否有返回值,都会返回给上位机一个返回值。如果上位机发送命令字后,在超时时间后没有收到返回值,则认为数据链路出现故障而断开串口。对于一些运行需要较长时间的函数可能会误触发该检测机制,所以需要设置较长的超时时间。
4.数组数据设置
添加一个.txt文件,然后直接添加数据即可。注意每行只能有一个数据。之后将.txt改为.dat。对于超出数组长度的数据会被忽略。
5.使用操作流程
这里再贴一遍操作流程:
1)串口与配置文件设置
效果1.gif
2)函数调试
效果2.gif
3)数据添加
效果3.gif


使用特权

评论回复
纪国圣|  楼主 | 2022-4-23 11:28 | 显示全部楼层
上传一份最新得文件:
上位机源码:
上位机.zip (125.47 KB)

使用特权

评论回复
发新帖 本帖赏金 150.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

401

帖子

4

粉丝