目录

编译工程

调试

工程

中文显示

设置TAB四个空格

常用技巧

KEIL5打开KEIL4工程

新版启动文件


编译工程

工程项目中有很多文件,简单的分为3类:工程文件、源文件、目标文件
工程文件就是Keil软件工作需要的文件,和我们写程序没关系
源文件就是我们写的源代码,就是我们编程编出来的
目标文件是Keil中的编译器等工具把我们源文件编译后生成的文件,最终向单片机中烧录时需要目标文件来烧录进去。

我们工程刚创建好(空工程)时只有工程文件,此时我们要去编写添加源代码,代码写好后就有了工程文件和源文件,此时点编译操作就可以得到目标文件。

更多文件类型介绍详见:Keil系列教程10_文件类型及相关描述 | EmbeddedDevelop

编译的时候有可能会报错(Errors)和报警告(Warnnings),错误就是有很严重的问题,此时编译无效并不能生成最终需要的可烧录的程序文件,必须去排除错误重新编译才可以;警告是轻微问题,有时候可以忽略有时候不行,具体要凭经验。

建议编译时直接点快捷图标栏里面的Rebuild进行编译。

注意:keil中找不到STC系列的51单片机,所以通常选择AT系列的51单片机,二者是兼容的,不过也可以看出国外软件对国内单片机的不友好。

Keil在打开或者新建一个新工程时,最好先点击关闭当前的工程。

如果不想要当前的工程,那么直接将所在文件夹全部删除即可。

调试

使用keil时,发现一个问题,在基础学习时,都是用printf来查看输出,用以判断程序结果是否正确。但是到了keil中,没有输出界面,不能通过输出语句来查看变量。

那么,怎么知道自己的程序对不对呢?

调试基础知识

箭头和断点:

蓝色箭头表示光标所在的行(只在有程序指令的行范围内);

黄色箭头表示当前正在执行的行;

红色表示断点,只有高亮显示的块内是可以打断点的,在非高亮显示行打不了断点,比如变量定义的行就不能打断点。

已经运行过的代码行,显示为绿色,还没有执行的代码行,显示为灰色。

仿真器和调试器

为了方便地调试程序,我们往往会使用仿真器或者调试器。

在keil中,可以使用调试功能来调试程序,但是,也只能通过keil平台来调程序,无法实际看到开发板上的现象。像这样的调试,叫做仿真调试。

那什么是调试器(一般统称为仿真器)呢?

我们把程序烧录到开发板中的时候,看到的就是最终结果。那么,我怎么能让已经烧录到开发板中的程序可以一步一步地走呢?这样的调试,再结合keil中的正确配置,就可以让开发板中的程序一步一步地走,还能看到实际的现象。

这就是调试器起到的作用。

为了方便嵌入式调试,就定义了一种JTAG接口,是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议。标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。

只要器件支持JTAG,就可以使用该接口来调试嵌入式程序。

STM32就提供了JTAG接口。

参考:什么是JTAG?_贾167的博客-CSDN博客_jtag

另外,还有其他的接口协议,比如SWD(Serial Wire Debug),SWD是一种串行调试接口,与JTAG相比,SWD只需要SWCLK和SWDIO两根线,减少了对单片机GPIO口的占用。

参考:SWD接口说明_weixin_42204437的博客-CSDN博客_swd接口

STM32 STLink驱动下载方式:

STM32烧写程序:ST-link驱动下载和安装_根号五的博客-CSDN博客_stlink驱动下载

官网下载:STSW-LINK004 - STM32 ST-LINK utility (replaced by STM32CubeProgrammer) - STMicroelectronics

SWD 模式比 JTAG 在高速模式下面更加可靠。 在大数据量的情况下面 JTAG 下载程序会失败, 但是 SWD 发生的几率会小很多。基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的,只要你的仿真器支持。

现在市场上,已经有了很多实现了该接口的调试器,常见的有下面三种:

  • JLINK V8 V9
  • STLINK
  • 普中ARM仿真器

市面上的常用仿真器对 SWD 模式支持情况

  • JLINKV6 支持 SWD 仿真模式, 速度较慢。
  • JLINKV7 比较好的支持 SWD 仿真模式, 速度有了明显的提高,速度是 JLINKV6 的 6 倍。
  • JLINKV8 非常好的支持 SWD 仿真模式, 速度可以到 10M。
  • ULINK1 不支持 SWD 模式。
  • 盗版 ULINK2 非常好的支持 SWD 模式, 速度可以达到 10M。
  • 正版 ULINK2 非常好的支持 SWD 模式, 速度可以达到 10M。

JLink仿真器

德国SEGGER公司推出基于JTAG的仿真器。简单地说,是给一个JTAG协议转换盒,即一个小型USB到JTAG的转换盒,其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议。它完成了一个从软件到硬件转换的工作。

ULINK仿真器

现在普遍用到的是ULINK2,它是ARM公司最新推出的配套RealView MDK使用的仿真器,是ULink仿真器的升级版本。ULINK2不仅具有ULINK仿真器的所有功能,还增加了串行调试(SWD)支持,返回时钟支持和实时代理等功能。开发工程师通过结合使用RealView MDK的调试器和ULINK2,可以方便的在目标硬件上进行片上调试(使用on-chip JTAG,SWD和OCDS)、Flash编程。并且仅可以在Keil软件上使用

ST-LINK

ST公司推出的专门针对意法半导体STM8和STM32系列芯片的仿真器。买的STlink在STM8和STM32的下载接口旁边分别刻有SWIM和SWD,所以,推测STM8基于SWIM协议,STM32基于SWD协议。

小结

JLINK是通用的,支持常见的ARM。

Ulink是MDK专用的,也基本上支持所有的ARM,价格比较JLINK贵。

ST-Link是ST公司的基本只支持ST的芯片。

JLINK使用步骤

首先要知道JLINK的两种用法:下载程序 + 单步调试;

使用步骤:

1、连上单片机的JTAG接口,绿灯闪烁;

现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA等。

JTAG有10pin的、14pin的和20pin的,尽管引脚数和引脚的排列顺序不同,但是其中有一些引脚是一样的,分别为TDI,TDO,TMS和TCK。

◇TCK(time cycle clock):时钟信号,为TAP(Test Access Port )的操作提供了一个独立的、基本的时钟信号。

◇TMS:模式选择信号,用于控制TAP状态机的转换, 测试模式选择。TMS用来设置JTAG口处于某种特定的测试模式,用于控制TAP状态机。必须上拉。。

◇TDI——测试数据输入。输入到指令寄存器(IR)或数据寄存器(DR)的数据出现在TDI输入端,在TCK的上升沿被采样。建议上拉,上拉电阻阻值不能小于1K。

◇TDO:数据输出信号。TDO是数据输出的接口。所有要从特定的寄存器中输出的数据都是通过TDO接口一位一位串行输出的(由TCK驱动)。

可选择的引脚:

Test Reset Input (TRST) 这个信号接口在IEEE 1149.1标准里是可选的,并不是强制要求的。TRST可以用来对TAPController进行复位(初始化)。因为通过TMS也可以对TAP Controll进行复位(初始化)。所以有四线JTAG与五线JTAG之分。

Return Test Clock ( RTCK) 可选项,由目标端反馈给仿真器的时钟信号,用来同步TCK信号的产生,不使用时直接接地。

System Reset ( nSRST)  可选项,与目标板上的系统复位信号相连,可以直接对目标系统复位。同时可以检测目标系统的复位情况,为了防止误触发应在目标端加上适当的上拉电阻。

2、安装JLINK驱动(segger上或者百度),如果驱动安装成功,则绿灯转为常亮;

3、Keil配置Debug

选择右边的对应调试器,其他默认即可

接着点击仿真器选择后的按钮Settings

如果连接正常,则弹出的界面会出现相关信息,否则全是空白

SN是对应调试器的识别码。

HW是硬件版本号;dll是驱动版本;FW是固件(固定在仿真器中的软件)版本;

Port可选JTAG或者SWD接口。

可点击JLink Info来查看对应调试器的信息。

以上是调试选项的设置。

接下来设置程序下载选项:

点击Utilities页:

选中对应的设备后,点击Settings按钮:

点击Add添加对应的单片机:

其他默认即可。

要注意的是,程序下载后,要点击复位后才能从flash启动执行。JLINK是可以让单片机自动复位的,如果选择了这里的Reset and Run,就能实现这个功能(硬件上,单片机的NRST连接了单片机的NRST)

到此,设置结束,可以进行程序调试了。

用普中调试器,出现一大堆问题(垃圾,肯定是盗版的,用STLINK有用,用它就各种报错,还是买正规的常用的吧,垃圾货)。

一开始根本就识别不到调试器,百度说是当前的工程占用了JTAG引脚,改变了JTAG引脚的状态。可以按住复位键,通过复位引脚,可以识别到。按住复位键后下载新的程序,之后就可以正常下载了。

虽然解决了识别的问题,但是一按下载按钮,接连弹出三个错误弹窗。
Error: Not a genuine ST Device! Abort connection.

CMSIS-DAP - Cortex-M error:PDSC:Sequence Excution failed
Error: Flash Download failed  -  Target DLL has been cancelled

01

第一个问题,大家说是因为芯片是盗版的,虽然有这个提示,但实际上,代码已经烧录进去了(要你手动重启才能生效)。可以通过下载示例代码来测试。

网上找到两种解决方法:

STM32编译报错 “ Not a genuine ST Device! ”_Drive World的博客-CSDN博客

亲测解决Error: Not a genuine ST Device! Abort connection.&&Error:Flash dowload failed CortexM3_狂小虎的博客-CSDN博客

实测,第二个注释的方法没有用,虽然没有了这个提示,但是又引进了其它问题。

02

第二个问题,参考:

stm32cubemax配置造成芯片错误,无法下载程序该怎么办?PDSC: Sequence Execution failed error - Ablerry - 博客园

CMSIS-DAP调试器keil无法识别 | 不一格

03

第三个问题,参考:

解决Error: Flash Download failed - Target DLL has been cancelled_韩同学叫园园的博客-CSDN博客

除了配置,也有可能是硬件的问题。

待验证。

另外,还有个奇葩的问题,在选择芯片相关的烧录算法时,就是找不到对应的FLM文件

我用的是STM32f103C8,F1系列的有各种各样内存的,但是,就是没有64k内存的。

根据百度下载了旧版的库,也没有用。多了好多,但就是没有这一款。

奇葩。无语。。。

待解决。

falsh算法文件在支持包的flash文件夹中:

F:\czpBuiltin\keil5 mdk\Arm\Packs\Keil\STM32F1xx_DFP\2.4.0\Flash

工程

在建立工程时,不知道工程面向的是哪一个层级。

比如我做led控制,led控制下又会有很多功能,比如简单的点亮,还有闪烁,还有流水灯等等。

这种情况下,是给led控制整个建个工程,还是说给每个功能都建个工程呢?

我猜测,工程面向的是最后要烧录到单片机中的HEX文件的。

所以,应该是按照功能来建立工程文件的吧?

我就先这么做,后面有新的发现再补充。

继续补充:

实际中,就是以功能为单位来创建工程的,具体的层级管理通过创建文件夹来实现。

中文显示

keil无法显示中文,输入中文时,出现的是问号。

将设置中的编码改成GB2312

设置TAB四个空格

常用技巧

1、在变量或者函数名上右键,跳转到定义处或者引用处

2、头文件上右键,可以打开文档

3、本来想设置代码自动补全功能,

但是我打开之后,发现左边是空白的,网上说,是汉化导致的,可是,我本来就是英文版本的,也出现了这个问题,之后按照网上的办法做了个英文复原,结果还是一样。不知道是什么原因,后面再说吧。

一段时间后~~~~~~~~~~~~~~~~~

为了解决这个问题,我直接去官网(之前用的是其他地方下载的)下了个最新版本,然后安装。之前的安装包只有300多M,官网下的有800多M。可见,有些内容是被简化掉了。

~~~~~~~~~~~~~~~~~~~~安装完成,然而,并没有起作用。~~~~~~~~~~~~~~

于是,我想,不应该呀。如果官方原版的都没有,那么其他的更不可能会有了。

怎么回事呢?于是我猜测是不是原来的没有完全卸载。于是我不仅将软件卸载了,还将其注册表全部删除,已完成完全卸载。完全卸载参考:

彻底卸载Keil4和Keil5_unique-R的博客-CSDN博客_keil卸载

完全删除之后,再安装官方版本,就OK了。

4、keil怎么改成深色主题?好像没有很直接的方法。

5、每次新建工程,都要重新设置生成Hex文件。

6、

c语言中的头文件默认是不会出现在工程列表中(实际在文件夹中是存在的),不要着急,只要编译之后,就会在对应的c文件下面出现该文件的所有依赖头文件:

7、程序要编译后才能调试,修改后也要重新编译后再调试,要不然修改的部分不会生效。

8,查看程序运行所用时间

可以通过keil中的系统变量sec来查看程序运行所用时间,将两个地方的所用时间相减,即可得到所间隔的时长。

要注意的是,这里的时长跟工程设置中的晶振频率相关。

注意,工程文件上如果有一个钥匙,说明带文件被锁定,是只读的。

keil添加文件时不考虑头文件,会自动找到。

文件上右键选择“Open Containing Folder”可以打开所在目录。

KEIL5打开KEIL4工程

在用KEIL5打开KEIL4工程时,有如下错误提示:

此时,我已经安装了对应的安装包,可还是这样的提示,所以大概率确定是版本的问题。

打开设备选择界面时,无法选择:

如何解决?

KEIL5保存的工程名的后缀是:.uvprojx,而keil工程名则是:uvproj,比KEIL5少了个x。

手动方式就是将后缀后加个x,可以正确打开:

这种方式可以,但是,如果文件过多,一个一个地去改后缀名,稍显麻烦。

可以先将文件导入。

错误提示后,又会弹出提示:

keil提供了两个解决方案:

Migrate to Device Pack(迁移到设备包) 和 Install Legacy Support(安装遗留支持),用第二种方法解决比较方便,但是要另外下载支持包。

迁移的思路是,将现有的文件自动更改成KEIL5的,不容易成功;第二种的思路是安装兼容包,让在keil中也能运行keil4工程文件。

先试下第一种:

点击迁移至设备包,提示迁移失败。

找了半天也没找到这个问题的解决方法,好像都没有人遇到过一样。

不纠结了,直接修改后缀名吧。

不过这个跟旧工程的具体环境有关,我换了个其他旧工程导入,就迁移成功了。

第二种:安装遗留支持包

去官网下载:MDK v4 Legacy Support

然后双击安装即可。

编译器的问题

解决了工程兼容的问题,接下来又出现了编译器兼容的问题:

提示工程之前使用的编译器版本不存在:

到工程设置的target下:

选择其他可用的编译器,不过,可能会因此带来一些语法问题:

但至少能编译成功。

新版启动文件

新版KEIL5不会直接自动生成启动文件(旧版比如MDK3会自动生成),新版在创建工程时,会弹出一个运行时环境管理窗口,需要在这个界面进行选择。

如果一开始没有选择,那么可以再次配置。

打开Manage Run,使用快捷图标或从菜单里选择。


勾选Startup和关联项CORE,点击[ok]。

然后可以看到启动文件就出来了。

无法跳转定义

直接参考这个解决。

keil mdk 编译左下角显示错误 “no browse info for symbol in this context“不能正常使用“Go to Definition xxx”跳转_Y-J-L的博客-CSDN博客

Keil使用实战总结相关推荐

  1. 51单片机实战教程之C语言基础(一 创建Keil Project)

    创建Keil Project 第 1 步 添加STC单片机型号及头文件到Keil 后面所有教程及示例将以STC15W4K61S4系列单片机为例,因此需先将STC单片机型号及头文件加入到Keil中.Ke ...

  2. NB-IoT技术实战开发----keil安装和使用

    一.4------keil安装和使用 1.Keil介绍 2.安装 1.安装"MDK-523.exe"嵌入式开发环境 3. 破解keil 1.Keil介绍 Keil公司是一家业界领先 ...

  3. 《STM32库开发实战指南:基于STM32F103(第2版)》——2.1节仿真器简介

    本节书摘来自华章社区<STM32库开发实战指南:基于STM32F103(第2版)>一书中的第2章,第2.1节仿真器简介,作者刘火良 杨森,更多章节内容可以访问云栖社区"华章社区& ...

  4. keil spi 调试_单片机软件出问题了?有经验的工程师这么调试

    单片机软件调试方法有很多,今天我们来看一看都有哪些值得大家学习的调试方法. 欢迎关注哈,有搞单片机的北漂吗,来抱团取暖吧,关注私信入群 一.一切跟着手册走 单片机本身就是要驱动各类传感器,软件都是跑在 ...

  5. 《嵌入式 – GD32开发实战指南》第3章 GPIO流水灯的前世今生

    开发环境: MDK:Keil 5.30 MCU:GD32F207IK 上一章通过控制GPIO的高低电平实现了流水灯,但只是告诉了大家怎么做,如何实现流水灯,本文将深入剖析的GPIO流水灯的前生今世,深 ...

  6. 《嵌入式 – GD32开发实战指南》第19章 程序加密

    开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 19.1程序加密工作原理 GD32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭.96位 ...

  7. 实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC

    目录 引出问题: MDK设置方法(AC5和AC6): 1.开启优化后,部分功能不正常 2.开启优化后,直接整体卡死 AC5设置方法: AC6设置方法: IAR设置方法: 1.开启优化后,部分功能不正常 ...

  8. 7天物联网智能家居实战训练营(百问网)-day1

    目录 前言 一.学习路线 1.什么是嵌入式? 2.怎么学习嵌入式? 3.学习的基础内功? 二.基本概念 1.什么是arm? 2.arm架构的分类. 三.开发流程 1.交叉开发, 2.调试下载 前言 学 ...

  9. STM32实战(1):搭建模板工程

    " 从今天起我会更新一个STM32实战系列教程,以STM32F103RCT6核心板为例由浅至深的向大家介绍嵌入式软件开发的学习过程,计划是先从最基础的搭建工程开始,到裸机开发,再到各种中间件 ...

  10. 《GC篇》七、GC 调优(实战篇)

    7. GC 调优(实战篇) 高分配速率(High Allocation Rate) 如何测量分配速率? 分配速率的意义 示例 高分配速率对JVM的影响 解决方案 过早提升(Premature Prom ...

最新文章

  1. Git常见报错及解决方法
  2. 【总结】循序渐进,有三AI不得不看的技术综述(超过100篇核心干货)
  3. 解决htmlfile: 未知的运行时错误
  4. poj1426_模拟BFS
  5. treemap怎么保证有序_干货!208道面试题教你怎么通过面试!
  6. 【2015年第4期】大数据时代的数据挖掘 —— 从应用的角度看大数据挖掘(下)...
  7. 小菜鸡进阶之路.文件操作遇到坑
  8. 漫步微积分二十六——Sigma符号和一些特殊和
  9. 【C Sharp笔记】2010年9月25日
  10. SCCM2012软件更新(WSUS补丁)同步成功无法获取补丁问题
  11. TCP/IP(五)传输层之细说TCP的三次握手和四次挥手
  12. LeetCode-326. Power of Three
  13. Java常量、变量(标识符规则)、数据类型(转换和运算符)、数据优先级
  14. 天地不仁,以万物为刍狗
  15. 关于数据库的练习题,关系代数
  16. ae中合成设置的快捷键_Adobe AE快捷键大全
  17. 多智能体中的图论——多智能体的一致性(二)
  18. 爬虫工程师是干嘛的?Python爬虫工程师需要掌握哪些技能?
  19. 2058:简单计算器
  20. 详解数据结构课程设计———运动会分数统计

热门文章

  1. python和按键精灵哪个稳定_按键精灵教程,学了这个你也能做出稳定的脚本
  2. Unity3D跑马灯脚本
  3. 【老生谈算法】matlab实现遗传算法源码——遗传算法
  4. perl语言入门(1)标量数据
  5. linux ulipad,Python for Ulipad(总结ulipad使用)
  6. 不可见的unicode字符
  7. P2P 终结者 IP雷达
  8. 程序设计导引及在线实践之大整数乘法
  9. java爬虫登录_Java爬虫中怎么爬取需要登录的网站
  10. 数字信号处理matlab实验心得,数字信号处理学习心得体会3篇