赞
踩
目录
对于单片机的编程而言,经常会遇到一个很大的问题,就是程序调试,单片机不像电脑,电脑有一个很大的屏幕,想看什么变量、参数,直接打印到屏幕就可以了,但是单片机不一样,很多时候由于成本和电路结构的限制,它并不会有一个像电脑屏幕那样强大的显示屏,这就对我们的调试造成了困难,例如,如果学习C语言,但是不允许使用printf这个打印函数,那C语言就根本没法学习了,所以,如果单片机没有任何可以显示参数的东西,那单片机也没办法学习。
三种常用的调试方法
串口调试:
通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息。
串口调试的优点是可以借助强大的电脑来调试,电脑端的软件,不仅可以显示单独的参数,而且可以显示曲线、图形、图像等,还可以自己做一个软件,来实现一个强大的用户交互界面。
串口调试的缺点是调试的时候需要带着电脑,而且通常的串口助手只能以信息流的方式呈现数据,就是只能一行一行的打印,如果有很多不断变化的数据需要显示,那就只能在电脑上刷屏显示,这样用起来就不太方便。
显示屏调试:
直接将显示屏连接到单片机,将调试信息打印在显示屏上。
显示屏调试的优点是对于不断变化的数据,可以覆盖刷新显示,而且显示屏可以始终接在单片机上,显示方式很直接,如果我们做一个稍微复杂的东西,都会需要有一个人机交互的界面,这样就可以直接把显示屏当作产品的一部分。
显示屏的缺点就是显示屏幕太小,显示内容有限,没有电脑软件那么强大的功能。
Keil调试模式:借助Keil软件的调试模式,可使用单步运行、设置断点、查看寄存器及变量等功能。
OLED(Organic Light Emitting Diode):有机发光二极管
OLED显示屏:性能优异的新型显示屏。具有如下特点:
功耗低:因为OLED每一个像素都是一个单独的发光二极管,不像LCD那样需要有背光,所以OLED屏幕会比较省电。
响应速度快:这个特性可以使OLED有更高的刷新率,总线时序快,也可以避免阻塞我们的程序。
宽视角:因为OLED屏幕上是自发光的,所以在任何角度看,显示内容都是清晰的。
轻薄柔韧:在手机上的折叠屏、柔性屏等,用的就是OLED显示屏。
本次课程使用的0.96寸OLED模块:小巧玲珑、占用接口少、简单易用,是电子设计中非常常见的显示屏模块。
供电:3~5.5V
通信协议:I2C(4针脚),SPI(7针脚)
分辨率:128*64
4针脚OLED硬件电路如上图所示,GND接GND,VCC接3.3V,给OLED供电,剩下的是SCL和SDA是I2C的通信引脚,需要接在单片机I2C通信的引脚上,由于驱动函数模块用的是GPIO口模拟的I2C通信,所以这两个端口就可以接在任意的GPIO口上。
7针脚OLED电路图如上所示, GND接GND,VCC接3.3V,给OLED供电,剩下的引脚是SPI通信协议的引脚,如果是GPIO口模拟的通信协议,那也是接在任意的GPIO口上就行了。
OLED实物图
OLED屏幕坐标图
驱动函数
OLED_Clear(); //将OLED清屏
OLED_ShowChar(1, 1, 'A'); //显示一个字符
一个参数起始行,第二个参数起始列,第三个参数是要显示的字符。
OLED_ShowString(1, 3, "HelloWorld!"); //显示字符串
一个参数起始行,第二个参数起始列,第三个参数是要显示的字符串。
如果想要OLED清除部分数据,只需要在对应的位置显示空格即可。
OLED_ShowNum(2, 1, 12345, 5); //显示无符号十进制数字
一个参数起始行,第二个参数起始列,第三个参数是要显示的数字,第四个参数是数字的长度。
OLED_ShowSignedNum(2, 7, -66, 2); //显示有符号十进制数字
一个参数起始行,第二个参数起始列,第三个参数是要显示的数字和正负号,第四个参数是数字的长度。
OLED_ShowHexNum(3, 1, 0xAA55, 4); //显示16进制数字
一个参数起始行,第二个参数起始列,第三个参数是要显示的数字,第四个参数是数字的长度。
OLED_ShowBinNum(4, 1, 0xAA55, 16); //显示2进制数字
一个参数起始行,第二个参数起始列,第三个参数是要显示数字的十六进制,第四个参数是数字的长度。
记得将PB7用跳线接到边上的正极,PB6接边上的负极。
Stm32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响。
在江科大给的资料中,程序源码的位置能找到OLED模块的驱动函数,选择4针脚版本的,然后复制到新建工程文件夹4.1 OLED显示屏中的Hardware文件夹中。
然后在Keil软件中,右键Hardware文件夹,选择第三个添加文件至Hardware,然后文件类型选择所有文件类型,Ctrl选中红框内的三个文件,再点击Add添加,即完成在Keil软件中添加OLED驱动函数。
添加完成后,还需要对部分代码进行修改,打开OLED.c文件,找到下面代码,之前的硬件接线图中,我们将OLED的SCL口接到了PB8,SDA口接到了PB9,则后面的引脚选择都得改成GPIOB, GPIO_Pin_8和GPIO_Pin_9,包括后面的OLED初始化函数都得改成对应的引脚。
在OLED.Font.h文件中,存放的是OLDE的字库数据。由于OLED显示屏没有自带字库,因此想要显示图形,还得先定义字符的点阵数据,OLED.c文件的显示函数会用到这些数据。
主函数
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- #include "OLED.h"
-
-
- int main(void)
- {
- OLED_Init();
-
- OLED_ShowChar(1, 1, 'A');
- OLED_ShowString(1, 3, "HelloWorld!");
- OLED_ShowNum(2, 1, 12345, 5);
- OLED_ShowSignedNum(2, 7,-66, 2);
- OLED_ShowHexNum(3, 1, 0xAA55, 4);
- OLED_ShowBinNum(4, 1, 0xAA55, 16);
- while(1)
- {
-
- }
- }

如上图所示,首先点击工程选项,然后点击Debug这里,可以对调试选项进行配置, 默认是选择右边红色框内这一项,这个是在硬件上在线仿真,需要把STLINK和stm32都连接好,如果不想连接硬件,也可以选择左边黄色框内,选择使用仿真器的这个选项,这样就是电脑模拟stm32的运行了。
我们这里使用硬件在线仿真,在进入调试模式之前,需要连接好stm32。然后点击下图中的放大镜里面带个d的图标,进入调试模式。
红色框内,即主窗口就是我们编写的C语言程序,上面黄色框内的窗口,就是C语言翻译成的汇编语言,能够看到每一句C语言实际上执行了哪些操作,左边蓝色框内的窗口是寄存器组和状态标志位等信息,这个是单片机硬件底层很重要的东西,如果用汇编语言,这些东西都是必须要非常清楚的,但是如果用的C语言,那这些东西就不需要管。
接下来看工具栏的作用,左起第一个红色框内的是复位,第二个黄色框内的是全速运行,第三个蓝色框内的是停止全速运行 。
接下来,左起第一个红色框内的是单步运行,第二个黄色框内的是跳过当前单步运行,第三个蓝色框内的是跳出当前函数单步运行,第四个绿色框内的是调到光标指定行单步运行。
在主窗口中,左边蓝色和黄色两个箭头连在一起的就是下一句将要执行的代码,我们还可以在深灰色区域左键设置断点,然后点击全速运行,程序就会一直运行,直到断点停下,如果没有断点,程序全速运行,就不会停下来,点击停止全速运行按钮,程序才会停下来。
接下来继续看窗口功能,第一个红色框内的是命令窗口,我们点击它可以打开和关闭命令窗口,命令窗口在软件的左下角位置。
第二个黄色框内的是反汇编窗口,也是可以打开和关闭的,即主窗口上面的窗口。
第三个蓝色框内的是符号窗口,打开后会显示在主窗口的右边,在这里我们可以实时查看程序中所有变量的值。
继续看工具栏,第一个红色框内的是串口显示,第二个黄色框内的是逻辑分析仪。
我们还可以点击这个外设菜单栏,选择第一个系统资源查看,这里就能看到所有的外设寄存器了,比如我们选择GPIOA,点击,就会在主窗口的右边显示GPIOA外设的所有寄存器,点击ODR寄存器,这里ODR0就是PA0的输出数据寄存器。
Stm32实时执行程序,Keil软件实时显示外设寄存器状态,还能随时控制程序的开始、停止、单步运行,所以当我们遇到一个比较难调试的程序时,如果不清楚程序时如何执行的,或者想看一大堆变量却不方便显示的,或者想看一下寄存器是不是配置正确了,都可以考虑使用Keil自带的调试模式。
最后再说明一下,如果想修改程序的话,是不能直接在这个调试模式下修改的,修改程序得先退出调试模式,重新编译,再进入调试模式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。