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

2022年01月13日 阅读数:8
这篇文章主要向大家介绍《程序是调试出来的》嵌入式Keil5的调试技巧,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Keil5的调试技巧

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

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

1.注释//

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

  //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),甚至能够观察数组每一个元素的值变化,软硬结合调试的方式会发现变量的值在不断的变化。
窗口的位置能够根据本身喜爱移动和缩放ui

在这里插入图片描述

3.4其余的还有一些串口窗口也是咱们常常调试程序的手段。
咱们经常用printf函数来打印一些信息来帮助咱们调试。写C语言时,打印信息是直接显示在PC命令行窗口上,但注意在单片机调试中则不行,须要串口重定向,原理相同,具体代码请百度(STM32和MSP432的串口重定向代码不一样)命令行

在这里插入图片描述

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

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

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