单片机裸机程序——调试手法

目 录

  • 什么是裸机程序
  • 一、硬件调试
  • 二、串口调试
  • 三、指示灯调试
  • 四、仪器调试


什么是裸机程序

代码量比较少,不带操作系统的单片机程序就是所说的裸机程序。

裸机程序里可以看到直接对处理器(所说的MCU)的寄存器、内存、I/O端口等进行读写操作。


一、硬件调试

假如你是在Keil或IAR等开发软件上开发程序,大部分处理器支持使用专用下载器进行Debug,比如J-Link,ST-Link等仿真器/下载器。

调试过程中通常采用设置断点、单步执行、查看寄存器、变量内存值等方法,可以直观看到运行过程中的实时数据,快速排查问题,提高开发效率。

二、串口调试

如果条件有限,比如手上没有仿真器或处理器不支持硬件调试,那么可以采用串口打印自定义信息进行调试,看看程序运行情况,卡在哪里,实际数据等。

串口打印可以使用标准库函数 printf,查看变量的值,但是它比较占用内存空间。

printf("temp:%d\r\n",i_temp); //标准库打印函数,占用内存较大

串口打印还可以使用自定义串口函数,比如uart0_send_bytes(…),打印字符串或ASCII值,占用内存小。

void uart0_send_bytes(uint8_t *buff, uint32_t length); //占用内存小

实例:

//宏定义
#define LOG_STR(strs) uart0_send_bytes(strs,sizeof(strs)-1)

//串口发送一个字符
void uart0_send_byte(char c)
{
	uint16_t timeout;
	timeout = 65535;
	S0BUF = c;
#ifdef UART0_TX_INT_MODE        	//中断方式
	while(!tx_flag);
	tx_flag = 0; 
#else //查询方式
    while(!(TI0))               	//等待数据发送完成
	{
		if((timeout--) == 0)      	//超时等待退出
        {
			break;
        }
	}
	TI0 = 0;                   		//清除发送完成标志位
#endif
}
//串口发送字符串
void uart0_send_bytes(uint8_t *buff, uint32_t length)
{
	while(length--)
	{
		uart0_send_byte(*buff++);
	}	
}
//使用宏打印log
LOG_STR("start run\r\n");

两种串口打印方式各有所用。

三、指示灯调试

硬件上预留有指示灯,代码运行过程中,在要观察的代码行之间加入控制指示灯亮或灭的代码,指示程序的不同阶段或状态。

四、仪器调试

在出现数据错误、不稳定或死机等奇怪问题时,需要查看原始信号是否正常,可以使用示波器、逻辑分析仪、万用表等设备,观擦硬件中的电信号,如时钟信号、脉冲信号等是否存在失真,电压异常等问题,排除根本原因。

示波器检测电压信号其实很简单,夹子接参考电压,探头接被测信号。波形的横向是时间,要看清楚它每格表示的时间长度是多少,纵向是电压值,同样看清楚它每格表示的电压是多少,两者结合就知道电压随时间的变化情况了,对从实际信号来分析问题非常实用。
单片机裸机程序——调试手法_第1张图片

你可能感兴趣的:(单片机,嵌入式硬件)