疑难杂症

Keil MDK5编译完成后不报错,但是不显示头文件

  1. 左侧Project栏里不显示编译成功后包含的头文件,如下图:
    在这里插入图片描述
  2. Project栏文件处单击右键,选择Show Include File Dependencies即可成功显示头文件(勾上对号后有可能不会立即生效,重启软件即可生效O(∩_∩)O):
    在这里插入图片描述
    在这里插入图片描述

对结构体变量使用结构体成员运算符.后不自动显示结构体成员

  1. MDK5在对结构体变量使用结构体成员运算符.时是会显示结构体成员的,如图所示:
    在这里插入图片描述
    但是有时候使用结构体成员运算符.时并不会出现结构体成员,导致这个问题的原因是没有将自己写的文件添加到工程之中,所以~~~

  2. 检查是否将自己书写的文件添加到工程中(很多时候都是只保存了自己书写的文件但是忘了添加到当前工程之中):
    在这里插入图片描述
    如图所示,工程中没有自己编写的文件则使用结构体成员运算符.并不出现结构体成员。

    将该文件添加到工程中后,再使用结构体成员运算符.就出现了结构体成员。

工程文件不可修改(文件符号上带一个黄色的钥匙)

  1. 文件上有一个黄色的钥匙标识,所有文件全都不可以修改,包括增删文件等等,如图所示:
    在这里插入图片描述
    经排查出现这种情况的原因是将该工程内的文件模式设为了只读,解决办法如下:

  2. 右键单击工程文件夹图标,选择属性,打开属性对话框:
    在这里插入图片描述

  3. 取消选中最下面那一栏的只读选项:
    在这里插入图片描述

  4. 单击确定,重新进入Keil工程,发现所有文件已经可以修改,不再有黄色钥匙的图标:
    在这里插入图片描述

硬件仿真时变量值不随程序的运行而刷新

  1. 在硬件仿真过程中,点击状态栏中的View按钮,在弹出来的窗口中查看最下部的Periodic Window Update前面是否有对号,如果没有对号则单击这个按钮,使之启用,此时Watch窗口中的变量的值就可以随着程序的运行实时刷新了。
    在这里插入图片描述

勾选了Reset and Run之后烧录程序到单片机中仍然不自动运行的解决办法

  1. 尽管在Flash Download页面勾选了Reset and Run选项(如图所示),将程序烧录到stm32里仍然不自动运行:
    在这里插入图片描述
    解决办法:
  2. 打开魔术棒按钮:
    在这里插入图片描述
  3. 进入Debug选项卡配置好需要的仿真器后点击Settings按钮:
    在这里插入图片描述
  4. 进入Flash Download选项卡按照下图所示的进行配置:
    在这里插入图片描述
  5. 进入Pack选项卡,如果Enable前面有对号,则去掉这个对号,将之设置为不选中,这样问题就迎刃而解了,烧录后的程序可以正常自动运行了:
    在这里插入图片描述

硬件仿真时无法查看变量的值,变量的值显示(cannot evaluate)的解决办法

  1. 变量的值显示(cannot evaluate),如下图所示:
    在这里插入图片描述

  2. 该变量是局部变量或者用static修饰的全局变量,ARM_KEIL MDK5的硬件仿真只能实时显示全局变量的值,局部变量或者用static修饰的全局变量是无法显示的,value处会显示cannot evaluate。

  3. 该变量是否被程序引用,这句话的意思是是说,这个变量有没有被程序执行到(被调用),也就是说如果你只是单纯的定义一个变量而没有在程序里使用这个变量(所谓使用这个变量使用包括赋值和这个变量作为运算对象参与运算),我们来看一个例子:
    在这里插入图片描述
    这个函数是在主函数while(1)循环里面被循环调用的,当我把8、9、10三行的语句注释时Serve_PWM_Data这个数组尽管是一个全局变量,也不能在硬件仿真时查看它的值,因为这个变量并没有被程序赋值或者作为运算对象进行处理,而去除任意一行或者多行的注释后,这个变量的值就能在硬件仿真里被查看。

汉字注释变成古文,字体显示朝左旋转90°

  1. 如下图所示:
    在这里插入图片描述
  2. 打开设置:在这里插入图片描述
  3. 在打开的设置选项卡中,依次展开至下列目录:
    在这里插入图片描述上图中Font显示的是这个软件当前设置的字体,可以看到字体是@仿宋,这就是问题出现的原因,所有字体前面带@的字体都会显示的时候变斜,将之改成没有@的字体就行了。
  4. 点击@仿宋,改成一个没有@的字体
    在这里插入图片描述
  5. 可以看到在改完字体后就已经显示正常了:
    在这里插入图片描述

注释中的汉字变成了问号,显示不出来

  1. 可以看到英文可以正常显示,而中文就不能正常显示。
    在这里插入图片描述
    解决办法:

  2. 打开设置:
    在这里插入图片描述

  3. 将这里的编码方式改为Chinese GB2312(Simplified)
    在这里插入图片描述

  4. 这样就可以显示正常了:
    在这里插入图片描述

按回车后光标缩进距离太大

  1. 可以看到这里前面的空格很多:
    在这里插入图片描述
    解决办法如下:

  2. 进入设置:
    在这里插入图片描述

  3. 打开设置后,Editor选项卡下面的Tab size就是指回车后光标缩进的值,将之改为2,并点击确定。在这里插入图片描述

  4. 可以看到回车后的缩进变短了:在这里插入图片描述

打开代码折叠功能(代码折叠按钮消失的解决办法)

  1. 一般在用Keil MDK软件写程序时,如果代码块内的代码太长,有时会把它折叠起来方便阅读以及快速翻页。但是我最近在写程序时发现代码折叠的按钮突然消失了在这里插入图片描述如下图所示:
    在这里插入图片描述
    本来这种地方是会有一个-点一下就能折叠的,但是它突然显示成这样了:
    在这里插入图片描述
    解决办法:

  2. 在代码编辑区的空白处右键单击,选择Outlining下的Show All Outlining,即可重新打开代码折叠按钮:
    在这里插入图片描述
    在这里插入图片描述

  3. 在代码编辑区的空白处右键单击,选择Outlining下的Hide All Outlining,就能关闭所有的代码折叠按钮:
    在这里插入图片描述
    在这里插入图片描述

小技巧

可以提升编程效率的快捷键

  1. 在Windows系统中很多快捷键在各个软件中是通用的,MDK5也不例外,比如:

Ctrl + C 复制
Ctrl + V 粘贴
Ctrl + X 剪切
Ctrl + A 全选
Ctrl + S 保存
Ctrl + F 查找
Ctrl + Z 撤回
Ctrl + Y 取消撤回

  1. Ctrl + L整行删除,该快捷键的用途是删除鼠标光标所在的那一行整行的内容,例如:
    在这里插入图片描述
    如图所示的452行,在按下Ctrl+L之后就被整行删除了:
    在这里插入图片描述

  2. 按下方向键(→ ←按键)时,是将光标以一个字符一个字符的距离进行移动,按下(Ctrl + → ←)时则是以一个名称的距离进行移动。这样可以进行更快速的移动,在选择结构体成员时也更轻松。注意:此处说的“一个名称的距离”是指在MDK5软件的规则下的一个变量名、函数名、结构体名等等,并不仅仅是一个单词,例如CAN_Init这个被视为一个名称,而不是两个单词。移动时会整个跳过CAN_Init而不是先跳过CAN再移动到_再移动到Init。

  3. Ctrl + ↑↓ ,不论光标在什么位置,都将页面向上或者向下移动一行的距离。

  4. Ctrl + Shift + ←→ 该快捷键可以在第二个快捷键的基础上,在以名称左右移动的同时,选中该名称。如:
    在这里插入图片描述

  5. Ctrl + E可以在配对的大括号中跳转,即当光标在一个大括号的位置时,按下Ctrl + E可以直接跳转到与光标所在位置的大括号配对的大括号处。如图:
    在这里插入图片描述
    光标在449行的大括号处,按下Ctrl + E光标就会跳转到与这个大括号配对的大括号所在处:
    在这里插入图片描述
    光标跳转到了配对的大括号处,将该语句块合并起来,可以看到这两个大括号正是互相配对的:
    在这里插入图片描述

  6. Ctrl + U将选中的区域的英文字母全部变成小写:
    在这里插入图片描述

  7. Ctrl + Shift + U将选中的区域的英文字母全部变成大写:
    在这里插入图片描述

  8. Alt + Shift + 方向键或者鼠标左键 该快捷键可以 以光标所在地进行自由选择(可以选择不同行的相同区域,而不会把其他不想选中的区域选中):
    在这里插入图片描述
    这简直是一个神快捷键,当我们想修改不同行的同一位置的时候,一行一行的修改过于麻烦,有了这个快捷键,就可以一次性修改不同行的同一位置。(该快捷键在Word中也可以正常使用)

  9. Ctrl + G快捷键可以将光标位置跳转到某一行:
    在这里插入图片描述

  10. Ctrl + i快捷键可以进行匹配式查找,就是一边输入字母,一边在该页面中查找是否有和已经输入的字母完全匹配的地方,而不用等到全部输入完字母之后再进行查找:
    在这里插入图片描述

  11. Ctrl + (Shift)+ F6该快捷键用于移动选项卡即下图所示的:
    在这里插入图片描述
    Ctrl + F6快捷键是从左往右移动,即从main.c选项卡移动到stm32f4xx_it.c选项卡,Ctrl + Shift+ F6是从右往左移动。

  12. 其实Keil MDK5有很多快捷键是给我们提示了的,比方说将鼠标移动到某个按钮处静止不动,就会显示出该按钮的名称和快捷键,或者在某些选项的旁边也会显示出来,如图:
    在这里插入图片描述
    在这里插入图片描述
    因此几个常用的按钮对应的快捷键是:F7编译、F8烧录程序到单片机中、Ctrl+F5进入debug模式、F12将光标跳转到定义处等等。

添加用户关键字

  1. 在MDK5软件中,关键字会显示为蓝色式样,如图所示:
    在这里插入图片描述
    但是我们用户自己设定的非编程语言自带的关键字则会显示为黑色字样,如图所示:
    在这里插入图片描述
    下面是修改方法:
  2. 单击MDK5的Configuration图标(就是那个小扳手)打开配置窗口:
    在这里插入图片描述
  3. 在弹出来的窗口中单击User Keywords:
    在这里插入图片描述
  4. 单击左侧窗口中的C/C++ Editor files选项,此时在右侧窗口中单击下图圈起来的按钮:
    在这里插入图片描述
  5. 可以看到右侧窗口已经出现光标,代表我们可以输入字符,输入的字符即被视为关键字的名称:
    在这里插入图片描述
  6. 单击OK按钮退出配置,可以看到刚刚填写的名称已经被MDK5视为关键字了,显示式样发生改变:
    在这里插入图片描述

修改配色和字体以及字号

  1. 左键单击软件的设置按钮(扳手状的按钮):
    在这里插入图片描述

  2. 在弹出来的选项框中选择Colors & Fonts选项卡:
    在这里插入图片描述

  3. 在左侧的Windows窗口中左键单击C/C++ Editor files选项:
    在这里插入图片描述

  4. 在右侧的Element窗口中选择需要修改配色的方案,比如想修改关键字的配色就选择Keyword,在最右侧的几个栏目中可以修改,其中Font可以修改字体的类型(楷体、微软雅黑之类的),Size是字体的大小,Style是修改字体的风格(加粗、斜体之类的),Colors中可以修改配色(Foreground是字体的颜色,Background是字体的背景的颜色):在这里插入图片描述

  5. 单击颜色右侧的这个图标,会弹出修改颜色的选项框:
    在这里插入图片描述
    在这里插入图片描述
    在左上角可以选择已经有的基本颜色,右下角可以自由设定颜色的各种属性设定好之后单击添加到自定义颜色就可以将这个颜色加入到左侧自定义颜色选项框中,之后就可以选中自定义的颜色。

  6. 全部修改好之后一路单击确定(或者OK按键)就可以成功保存修改的配色了,但是有时候会卡掉,导致修改颜色不成功,此时只需要多次修改就能成功修改了。

  7. 另外再加入一个小知识点:在Keil的根目录文件夹下的这个名为global.prop文件保存的就是Keil MDK5的配色方案,删除这个文件Keil MDK5软件就会恢复默认的配色方案。
    在这里插入图片描述

  8. 我在CSDN中也上传了我的这套配色文件(只把背景全修改为了护眼绿色),有喜欢的朋友可以直接下载。

硬件仿真

基本介绍

  1. Keil MDK5这个软件是提供硬件仿真功能的,所谓硬件仿真就是指将当前的程序实时的运行在你的设备中,并且可以检测程序中的变量的值,或者控制程序运行的流程。

  2. 单击Options for Target按钮,打开选项配置框:
    在这里插入图片描述

  3. 在弹出来的选项框中选择Debug选项卡,我们选中右侧的Use前面那个圆圈(这个页面左侧是软件仿真,右侧是硬件仿真,我们使用硬件仿真,所以选择右侧的Use选项)。之后单击3所示的下拉按钮,在弹出来的下拉框中选择你所使用的仿真器,笔者这里使用的是ST-Link。然后单击右侧的4所示的Settings按钮,这个页面剩下的右侧的配置按图中所配置的参数配置即可:
    在这里插入图片描述
    其中下拉列表显示如下:
    在这里插入图片描述

  4. 在弹出来的Settings选项页面中按照下图所示的进行设置,其中Port选项卡可以设置仿真器和开发板的连接方式,有JTAG和SWD两种方式。Clock选项卡下的Req选项框可以设置仿真时的通信频率,越高则程序下载和运行时的速度越快,但是速度越快越有崩溃的风险,一般选择默认或者比默认再低一些就好。
    在这里插入图片描述

  5. 单击Flash Download按钮,按下图所示的进行配置:注意画横线的地方要添加开发板的Flash大小,要不程序无法正常烧录:
    在这里插入图片描述
    之后一路点击确定或者OK,完成设置。

  6. 单击这个图标,或者按下Ctrl + F5来进入仿真界面,注意不是点击那个下拉框,而是点击那个d形状的按钮:
    在这里插入图片描述

  7. 仿真界面如图所示:
    在这里插入图片描述
    其中画横线的即下图所示的这一排按钮,从左至右每个按钮的各功能依次是:回到硬件仿真的程序最开始处(即回到现在烧录到开发板中的这个程序的最开始处)、运行程序、停止运行程序、执行程序一步(就是执行一条语句,如果这条语句有内嵌语句(比如说这条语句是一个函数调用语句)则会进入到函数体内部执行第一条语句)、运行完当前行(意思是说运行完程序即将运行的这一行的语句,不管这一行语句是什么,如果函数调用语句,则会直接执行完这个函数,并不会进入函数体内部进行单步调试)、运行完这个函数、运行到光标所在行(意思是从程序现在所处于的位置,运行到鼠标光标所在的地方)
    在这里插入图片描述

  8. 如果我们想恢复到最开始窗口显示的式样,则可以点击状态栏上的Window按钮,在弹出来的下拉列表中单击Reset View to Defaults之后在弹出来的选项中选择Reset按钮,如图1和图2和图3所示,就可以将显示的窗口恢复到默认状态了:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

查看变量的值

  1. 按照上面介绍的内容进入硬件仿真,如图:
    在这里插入图片描述
  2. 将光标移动到需要观察值的变量处,并不需要选中这个变量,只需要保证光标在变量内部就行,然后单击右键,如图:
    在这里插入图片描述
  3. 在弹出来的选项框中选择Add ‘temp’ to…然后在右侧弹出的选项中选择加入到Watch1或者Watch2中,这里笔者选择的是加入Watch1,如图:
    在这里插入图片描述
    单击添加之后会在下方出现一个Watch1窗口,如图:
    在这里插入图片描述
    我们可以把不需要的其他窗口关闭,然后拖动Watch1窗口上部的蓝色的地方,将之放置到合适的位置,如图:
    在这里插入图片描述
  4. 单击左上角的运行按钮,使程序按照自己希望的方式运行,这样右侧的Watch1窗口的变量的值就会随着程序的运行而改变,笔者这里是将temp变量自增,在执行一行程序之后,该变量的值变为了1,如图所示:
    在这里插入图片描述
    此时这里是以十六进制显示的这个变量,我们可以在右侧Watch1窗口中这个变量名称的那个灰色的栏目处右键单击,单击那个显示对号的Hexadecimal Display按钮,将那个显示对号的Hexadecimal Display按钮的对号去掉,如图:
    在这里插入图片描述
    去掉之后就是以十进制显示变量的值了:
    在这里插入图片描述
    注意: 这个Watch窗口只能直接查看全局变量的值,函数内的局部变量或者是用static修饰的变量是无法值显示值的需要多进行一步操作:如下图所示,当将函数内的局部变量或者用static修饰的变量添加到watch窗口后显示cannot evaluate
    在这里插入图片描述
    笔者初步判断是因为程序没有运行到定义这个变量的地方,所以如果是局部变量的话只要在定义这个变量的地方打一个断点,如果是static修饰的全局变量的话则在定义这个全局变量的文件内任何一处打一个断点,点击运行程序按钮,就能正确显示变量的值,同时可以修改这个变量的值:
    在这里插入图片描述
    之后再取消断点就可以正常显示了:
    在这里插入图片描述

实时查看程序运行的时间

  1. 单击Options for Target按钮,打开选项框,进入到Debug选项卡,点击右侧的Settings按钮:
    在这里插入图片描述
  2. 在弹出来的选项框中选中Trace选项卡,将下图所示的名为Core Clock的栏目设置为你的MCU的主时钟的频率,比如笔者这里使用的STM32F407IGTx系列,主频是168MHz,就输入168,同时记得勾选中右侧的Trace Enable,然后一路单击确定或者OK,回到主界面:
    在这里插入图片描述
  3. 按照前几篇博客的内容进入硬件仿真,点击运行按钮使程序运行,下图标红的地方就显示着程序运行的时间:
    在这里插入图片描述
    在这里插入图片描述
    这个时间的单位是秒,如果我们点击运行按钮,那么显示的就是程序持续运行时经过的时间,如果我们进行单步调试或者只运行一个函数,那么这个时间显示的就是运行完这一步或者这一个函数后的时间,将这个时间减去运行这一步或者这一个函数前的时间,就得到了运行这一步或者这一个函数所需要的时间。

官网下载Keil MDK5最新版的方法

  1. 去Keil的官网https://www.keil.com 之后点击如图所示的Download按钮:
    在这里插入图片描述
  2. 在弹出来的窗口中点击Product Downloads:
    在这里插入图片描述
  3. 点击MDK0-ARM按钮,可以在这个按钮的下部看到这个软件在2019年9月更新到了5.29版:
    在这里插入图片描述
  4. 在弹出来的界面中输入自己的信息后点击最下方的Submit按钮,会弹出如下图所示的界面,点击该页面中的MDK529.EXE按钮就会自动开始下载Keil MDK5-ARM软件了,如果没有自动开始下载的话可能是被浏览器阻止了,此时只需要根据浏览器的提示信息点击确定下载即可。

在这里插入图片描述

Keil MDK5的软件包的下载方式

  1. ARM-Keil MDK5这个软件是使用了软件和支持包互相分离的形式,即安装软件时安装的是一个主体,而我们在使用这个软件进行编程的时候则需要根据芯片型号安装对应的软件支持包,使用什么芯片就安装什么支持包,这样也减小了这个软件安装时的体积,少占用了很多空间。

  2. 去https://www.keil.com/dd2/Pack/这个官网下载对应的支持包,可以看到这里有很多种型号的支持包,我们用到哪种就下载哪种,每个芯片型号的下面又有很多版本的支持包,我们可以下载最新的也可以下载之前版本的。
    在这里插入图片描述
    在这里插入图片描述
    点击Download就可以下载了,下载之后双击打开就可以进行安装。

  3. Keil MDK5软件是自带更新固件库包的功能的,如下图所示,打开Pack Installer,弹出来的界面如下:
    在这里插入图片描述在这里插入图片描述
    其中左侧Devices是这个软件支持的芯片型号,单击左侧的芯片型号,右侧的Packs是这个型号的芯片所需要的固件库包,比方说我点击左侧STM32F4,那么右侧就会弹出来针对STM32F4系列芯片所需要的的固件库包,我们可以根据需要选择下载对应的固件库包,点击Install就可以开始下载了。
    在这里插入图片描述
    如下图所示,最下角有个蓝色的进度条,表示的就是下载固件库包的进度。关于右侧显示的英文字母,Up to data代表是最新版本,Install代表未下载,updata代表可以更新。
    在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐