一、外设寄存器窗口
1、如何打开
如下图所示,开启debug模式后,可在view->system view中开启相应外设的寄存器窗口,以查看片内外设的寄存器的具体值。
2、有什么用
以can外设为例
可以通过观察MCR与MSR寄存器以查看CAN外设的工作模式,以检查初始化配置是否正确。
可以通过观察IER寄存器以查看CAN中断开启状况。
可以通过观察RDTxR寄存器以查看CAN邮箱情况。
最重要的是可以通过观察ESR寄存器以查看外设错误情况。
配合对应的芯片开发手册以查看寄存器及其每一位的意义,可以解决90%以上的单纯的片内外设bug,学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步,一定要善于使用这个工具,而不是外设出了问题时,一点点的通过表层外设现象排蛊。
下附F4开发手册
暂时无法在飞书文档外展示此内容
二、虚拟串口
开启DEBUG模式后在此处打开对应窗口
相当于一个无法发消息的串口助手,但省去了硬件接线,片内串口的TX消息会直接打印在词窗口,可以在没有usb转ttl的时候应急用。
三、核心寄存器
此窗口默认打开,也是一个重要的窗口,这些寄存器涉及单片机的工作原理,后续会单独开一篇去讲,这里简单提一下其几个用法,感兴趣的可以自己去查一查具体用法。
sp寄存器可以回溯栈以查看函数调用关系,Mode寄存器可以查看单片机目前处于Thread模式还是Handler模式,Stack寄存器可以查看现在使用的是MSP还是PSP。
四、内核错误报告
1、简介
hardfault无疑是在调试过程中遇到的非常麻烦的问题,如果在使用rtos或是函数指针时没有好的书写习惯,那么会频繁地进入hardfault。同时,由于cortex核的设计,有很多因素会触发hardfault。如果使用传统的断点调试寻找原因,这个过程无疑是痛苦且漫长的,因此,这里介绍一种更简单,高效地判断hardfaullt错误的原因的方法。
2、错误类型
ARM—Cortex内核发生的错误异常默认都会触发HardFault异常,此外,Cortex-M3与M4还有三个可配置的错误异常处理:
MemMange(存储器管理)错误
BusFault(总线)错误
UsageFault(使用)错误
要触发这些异常,需要将其使能,且其优先级要大于硬件异常处理的优先级
3、错误处理
当异常发生后,其处理逻辑见下图所示
相应的错误异常会触发相应的IRQ
如果是使用的CubeMX生成的工程,可以在stm32fxxx_it.c中找到其自动生成的错误处理函数,当发生相应错误时,芯片会通过中断向量表跳转至此处执行,用户可以在其中编写相应的操作。
如果用户不在这些服务函数中做任何处理。那么错误发生后将会将程序堵死在while(1)中,防止发生意外。需要注意的是,在CubeMX中,以上四个错误异常的中断优先级默认都是最高优先级,但HardFault的优先级无法更改。
因此,如果发生异常,程序将会直接进入HardFault_Handler中进行处理。
4、如何判断发生异常的原因
上文说到,一般情况下,所有的异常都会跳转进HardFault_Handler进行处理,那么当进入HardFault_Handler后,又该如何反向找出发生错误的原因呢?
我们可以通过错误状态寄存器(CFSR)的内容去判断当前到底是发生了什么类型的错误。
其每一位的具体含义见下图所示
这么一位位看寄存器十分麻烦,且此寄存器只有在特权模式下才能够被访问。其实keil提供了一个更加便捷的查看异常发生原因的方法。
当在Debug模式下时,可以打开keil自带的Fault Reports
相当于自动帮我们分析了CFSR的内容,通过查看此窗口,我们能够清晰的查看错误发生的原因。
5、例子
以除零错误为例,当我们执行了除零操作时,软件会自动跳转到HardFault,此时打开FaultReports面板
可以看见Usage Faults的DIVBYZERO位和HardFaults的FORCED位都被置1,查表可知
是由于总线错误,存储器管理错误或使用错误导致了HardFaults。
而又是由于除零操作引起了Usage Faults
五、离线断点
1、为什么需要离线断点
当一个项目复杂后,可能会遇到一些正常运行时会出现,而进入debug模式后却无法复现的bug,这是由于cortex核的调试属于侵入式调试,一定程度上会影响程序的运行,因此,这是需要使用离线断点的方式实现非侵入式调试。
2、如何实现
a、离线断点函数
在cmsis_armcc.h文件中,有一个__BKPT(value) 函数,其作用相当于debug模式下的断点,当程序运行到此处时,会将程序堵塞。
b、查看程序状态
当进入断点后,想要查看程序的状态,仍然需要接入调试器进入Debug模式,但进入之前需要一些额外的配置。
取消勾选Load Application at Startup,取消后进入Debug模式不会加载启动文件,即不会重新开始运行,但同时axf文件不会被编译进keil,想要将axf文件与keil相关联还需额外配置。
取消勾选Reset after Connect
取消上述配置后进入Debug模式,会发现无法从汇编窗口跳转到相应的语句,这是由于先前取消勾选Load Application at Startup,这时需要再keil的串口中运行指令
LOAD %L INCREMENTAL
即可实现关联
附加载指令表