STM32 跑开发板跟写小说差不多,先得把稿子(代码)拿在手里,再拿笔去描边。别急着背 документация,直接对着那块捂热的板子动手。先把板子插上,别总想着找 WiFi 要么看啥官网教程,直接点亮 LED 灯就着。手指头头按一下复位键,屏幕上的点突然亮了,那一刻你才认定这玩意儿是个玩意儿。 Keil 打开是个界面,别一启动就盯着 Title Bar 看那些乱七八糟的字。左边是文件列表,右边是代码,下面才是 Variables 和 Variables 查看器。打开工程文件,不要管里面那些宏定义,直接拉到 Variables 这一栏。
看看到底变量有多少,能不能在 2 秒钟内尝出味儿来。
比如把 LCD 型号改成 12864,颜色改成 1,字体改成 1,然后启动,屏幕上先蹦出个"LCD12864 View",这就叫有反应。再试试看,把 12864 改成 1,颜色改成 2,字体改成 1,这时候屏幕不是显示"LCD12864 View"就是"LCD 1 View",就连可能显示啥怪的乱码,这就说明你的硬件配置跟代码对不上,要么库文件没装对。
这时候别慌,先关掉 Keil,拔掉线,重新插个线,要么换个硬件端口,有时候物理连接的难题比代码还费事。 接着捏起代码,别管那些 ifdef 和 ifndef。把那些虚线框都擦掉,直接写下来。Keil 是个老古董,它不喜爱你直接写底层寄存器,它希望你用变量,但它有时候不懂你的变量名,要猜给你看。
比如你定义了一个 bsw 寄存器,Keil 会问你这是哪个寄存器的管住。
这时候大约率得去命令行里查一下,要么干脆直接写死值。
要是硬编码,记得加上个注释“固定值”,不然赶明儿被导师问起,你就是个黑盒。 调试工具这块,Keil 默认套的是 GE 工具链,别想着换其他第三方插件搞复杂,它自带的 Debug 功能就够用了。别急着点“Run 调试”,先跑个空跑。把变量值给改个大号,比如把 200 改成 1000,反正要让它变,别让它不动。
要是 IDE 提示你找不到文件,别皱眉,可能是路径不对,直接点那个“Go to File”的路径栏,输入盘符,然后找工程目录。
有时候路径里有个空格,搞巧劲,把空格改成中文字,比如“C 盘”,有时候代码就能认了。 进入调试模式,别直接点 Run。先点“Debug”菜单里的“Option”要么类似的设置,把“Run on Starter Board”改成“Run on Bootloader”,这一步是为了跳过 Bootloader,直接进系统。
要是 IDE 提示找不到 Bootloader,那就别管它,直接点“Run on Starter Board”,大量时候它只是让你多等一会,要么提示设定 Bootloader 的路径。
要是启动卡住了,别急着点复位,看看能不能让它的“Reset”按钮亮起来,要么用键盘敲个"C"(有些硬件赞成),让它自己重启。 要是程序真跑出来了,别急着看寄存器。
看寄存器是调试老手的事,新手好办在那儿灌油。先看看屏幕,屏幕是硬件的镜子,没反应就说硬件有难题。
要是屏幕有字,说明硬件通了,程序也跑进去了。
这时候再去看变量,变量能变才说明程序在跑,不能变说明程序在跑,但变量值不对,说明程序逻辑错了。
比如你把 1 改成 2,屏幕显示的不是 2 就是错的,这时候得把值改回去,要么把程序逻辑改对。 别总想着跑多少次就完美了,有时候跑不死,有时候跑得快,有时候跑得慢。
比如跑得快可能是缓存对齐得好,也可能是指令流水线走通了,但这不代表代码没难题。
比如跑不死,可能是接口没对上,也可能是引脚电压不够。
这时候得做个变量,看看程序能不能管住 LED 灯,能不能管住串口,能不能管住按键。
要是能,说明逻辑根本对上了;要是不能,说明逻辑是错的,要么引脚接错了。 最终,别忘了一件事,调试是个坑。
有时候跑通了一个功能,发现另一个功能不中,折腾半天发现是变量定义的难题,这时候别急着改代码,先查变量定义,看看是不是把宏定义搞错了。
有时候变量定义那一栏是空的,就连没有变量,这时候就别问了,直接去变量定义的地方看看,要么干脆重写变量定义,确保一开头就能定义好所有需求的变量,别到时候真到关键时刻变量没定义好。 总而言之,调试就是跟硬件对话,有时候硬件在讲话,有时候代码在讲话,有时候是两者都没讲话。别总想着找啥完美的解决方案,有时候就是好办的改个设置,换个串号,要么把那个"12864"改成"1"就能搞定。
记住,代码是死的,硬件是活的,调试就是让死的代码和活的硬件握手的过程。别怕报错,报错是它给你指路,路走不通了再走。