Table of Contents
前言
这一篇博客主要讲解STM32F1开发板如何进行调试,分别是硬件调试(STLINK)调试和软件调试。
调试原理
STM32的调试原理核心是比较复杂的,但是我们了解的东西可以简单一些。首先STM32支持JTAG和SWJ调试,其中JTAG需要五个接口,SWJ仅需要两个接口,所以在之后的大部分调试我们优先选择SWJ进行调试,如下图是STM32中文参考手册的M3调试框图。蓝框为JTAG调试,红框为SWJ调试端口。
如下图所示,SWJ调试只需要PA13和PA14两个引脚即可实现调试功能。
所以在一般情况下使JTAG-DP接口禁止,SW-DP接口允许
而如何实现使JTAG-DP接口禁止,SW-DP接口允许,需要用上一个GPIO的函数
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
FunctionalState NewState设置为ENABLE,由下面代码可知GPIO_Remap设置为 GPIO_Remap_SWJ_JTAGDisable。
#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*!< JTAG-DP Disabled and SW-DP Enabled */
软件调试
首先按如图设置Debug选项卡。
接下来,我们点击开始/停止仿真按钮,开始仿真,出现如图所示的界面。
对于Debug工具条无论网上还是书上都有很很详细的讲解,这个地方我就只贴一张图。比较重要的是逻辑分析窗口(电平高低),观察窗口(观察变量的值和C语言的观察窗口一样)和串口打印窗口。
调试的功能键和C语言调试基本相同。如果要查看某个变量的值只需选中加入到watch窗口即可
串口逻辑同理,串口输出信息如下图所示:
对跑马灯可以进行逻辑分析,逻辑分析是只有软件调试才有的功能,首先打开逻辑分析仪,打开之后如下图所示。
接下来添加要分析的端口,比如我们要分析PE5和PB5,只需在右上角点击添加输入PORTB.5和PORTE.5即可,Type调整为Bit,颜色自定。
然后设置一个断点,即可开始分析,Zoom用来设置坐标轴的单位,将鼠标移至图中还可以得到分析的相应信息。
除此之外,在工具栏中的Peripherals中还可以看到更多的关于寄存器的信息,比如ODR寄存器用来设置高低电平的,就可以看到ODR寄存器每一位的状态。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190812223510521.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjE5NjkyOA==,size_16,color_FFFFFF,t_70)
硬件调试
首先是要进行设置,我这里可能说的不全面,详细的设置方法参考《STM32F1开发指南-库函数版本》3.4小节和6.4小节。
首先在Debug板块中进行如下设置,然后再进入Utilities将红框勾选。
之后回到Debug,再ST-LINK旁边点击Setting,进入Flash Download,注意蓝框中的芯片要对应是连接的芯片,红框如图设置。
之后要用ST-LINK连接开发板和电脑进行下一步设置。PORK选择SW,其他的根据需要修改,然后开始连接开发板开始调试即可,点击。
先编译下载,再调试。
之后可以打开串口调试助手,一直让程序run下去,然后串口调试助手就可以看到一直在打印t的值,调试程序见后文。
值得注意的是,串口的选择不要选错COM口了,否则会看不到结果,还要要记得点开启串口。
调试程序
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
int main(void)
{
u8 t=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化为115200
while(1)
{
printf("t:%d\r\n",t);
delay_ms(500);
t++;
}
}
参考资料
《STM32F1开发指南-库函数版本》3.4小节和6.4小节
《STM32中文参考手册V10》29章