《程序是调试出来的》嵌入式Keil5的调试技巧

Keil5的调试技巧

    调试手段是教不会的,而是自己亲身实践出来的。那笔者撰写这篇文章的意义何在?一个人的发展始终会受限于自己的眼界,会当凌绝顶,一览众山小,笔者想要带你们览下群山风景,至于最终能不能攀登上来就看你们各自的本事和毅力,本文只是起到一个抛砖引玉的作用罢了。

    在笔者的经历中,用到Keil5调试的板子当属STM32单片机,当然,Ti芯片的集成调试环境CCS这方面也不错,当时的快速查看函数定义和显示函数调用层次比Keil5更胜一筹。本文主要结合Keil5工具讲一下调试技巧。当初学到一定阶段,苦于找不到问题之处及如何验证自己的想法而烦恼不已,后来偶得机缘,幸得良师指点,通宵调试加上后天实践才有了自己一些浅谈技巧,后来我有了想写下这篇博客的想法。

1.注释//

    此方法简单且效果明显,十分的好用。当你不知道这段代码的作用,先别急着看源码,不如注释掉,编译下载到开发板看看效果,这一招注释//我屡试不爽虽谈不上高深,却胜在实用

  //Gui_DrawFont_GBK16(9,5,BLUE,GRAY0,"AD TEST: ");
	Gui_DrawFont_GBK16(10,25,BLACK,GRAY0,"Light:");
    Gui_DrawFont_GBK16(115,25,BLUE,GRAY0,"%");
	DisplayButtonUp(5,25,80,45); //x1,y1,x2,y2
	DisplayButtonUp(85,27,125,45); //x1,y1,x2,y2 
2.既然板子在手,不如软硬结合

    调试以笔者而言,简单分为软件调试和硬件调试及软硬结合调试

  • 硬件调试:简单下载程序,观察板子现象,常常与第一条技巧注释结合使用,如果程序写的是这个现象,下载板子上亦是这个现象,则程序正确。
  • 软件调试:在没有开发板得情况下,利用模拟环境(Keil5,CCS都具备)进行调试获得结果,脑补出板子现象。例如:假设板子LED是高电平点亮,软件中我们能知道这个值为1,则我们认定(脑补)LED灯点亮。
  • 软硬结合调试:程序在集成环境中(如Keil5/CCS)运行,同步测试开发板,常通过单步调试,“一步一程序,对应一步一现象”。现在笔者常用的便是此种细腻的方法,归根结底是此方法可简单使用,亦可加入各种调试手段融入其中,使其极具调试性,快速找到问题所在。———–>既然板子在手,不如软硬结合
  • 还有一点,算是笔者看程序的喜好,接手别人项目,看源码时,总喜欢在main函数中用单步调试来快速理清程序的脉络。毕竟“一动不动的看”容易打瞌睡,精神不集中。不如“当成调试程序的看源码”,看看程序一步步动起来,眼光也跟着动,慢慢的就’‘钻进去了’‘,专注起来。
3.善用调试小工具

    Keil5集成开发环境中给了许多的调试工具查看窗口,其实调试这方面有很多值得注意的,但确实不是拿来直接说教的,任何教学手段不如你的亲身实践,带我学习嵌入式的大学老师,给我的建议就是“多折腾”

3.1 这八个基本调试按键应该都很熟悉吧,如何不知道如何进入调试及这些按钮含义请自行百度,调试怎么能不动手呢。

在这里插入图片描述

3.2 断点的设置要学会,把断点设置到你认为当前问题所在之处,运行程序来验证

在这里插入图片描述

/*
核心板的PA1连接到WIFI模块的A2
状态:PC8指示灯闪烁提示系统运行
屏幕上显示光照百分比
屏幕接线:
GND   电源地
VCC   接5V或3.3v电源
SCL   接PA5(SCL)
SDA   接PA7(SDA)
RES   接PB0
DC    接PB1
CS    接PA4 
BL	  接PB10
*/

#include "stm32f10x.h"  
#include "main.h"      
#include "delay.h"      
#include "usart1.h"    
#include "timer2.h"     
#include "led.h"       
#include "global.h"     
#include "stdio.h"
#include "math.h"
#include "string.h"
#include "LCD_calculate.h"
#include "Lcd_Driver.h"
#include "usart1.h"     
 #include "adc.h"

int main(void) 
{	
	u8 adcx=0; 
	char txt[20];
	Delay_Init();                   //延时功能初始化              
	Usart1_Init(9600);              //串口1功能初始化,波特率9600
	LED_Init();	                    //LED初始化
  TIM2_Init();                    //定时10mm
	Lcd_Init();
	Lcd_Clear(RED);               //清屏
	LCD_LED_SET;                    //通过IO控制背光亮	
	Adc3_Init();
  Lsens_Init();
	Gui_DrawFont_GBK16(9,5,BLUE,GRAY0,"AD TEST: ");
	Gui_DrawFont_GBK16(10,25,BLACK,GRAY0,"Light:");
    Gui_DrawFont_GBK16(115,25,BLUE,GRAY0,"%");
	DisplayButtonUp(5,25,80,45); //x1,y1,x2,y2
	DisplayButtonUp(85,27,125,45); //x1,y1,x2,y2  //TO
	while(1)                      
	{		
		if(timecount>30)	 //300毫秒刷新一次
		{		
				timecount=0;
			  adcx=Lsens_Get_Val();
				sprintf(txt, "%d", adcx);
				Gui_DrawFont_GBK16(90,25,BLUE,GRAY0,txt);	
				LED1=!LED1;
		}		
	}
}

3.3 会用窗口来观察变量的值变化(如图adcx),甚至可以观察数组每个元素的值变化,软硬结合调试的方式会发现变量的值在不断的变化。
窗口的位置可以根据自己喜好移动和缩放

在这里插入图片描述

3.4其他的还有一些串口窗口也是我们经常调试程序的手段。
    1.我们常常用printf函数来打印一些信息来帮助我们调试。写C语言时,打印信息是直接显示在PC命令行窗口上,但注意在单片机调试中则不行,需要串口重定向,原理相同,具体代码请百度(STM32和MSP432的串口重定向代码不同)
    2.SEGGER-RTT调试(代替串口printf输出)的使用方法https://blog.csdn.net/yanyuzuixin/article/details/68953131

在这里插入图片描述

4.休息一下,出去走走,理清程序思路

    当上面方法没有找到问题所在时,先不要着急,如果情绪变得越来越烦躁,建议即刻停下工作,出去走走,先让自己的脑子冷静下来---->脑袋很混乱,你发现和解决问题的能力会严重下降,不如出去看看风景!

该文章为原创,转载请注明出处和作者

  • 74
    点赞
  • 249
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式历练者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值