Keil uv5 MDK使用教程

目录

  • 前言
  • 一、开发环境搭建
    • 1.1 Keil的安装
    • 1.2 其他工具安装
    • 1.3 注意事项
  • 二、Keil基本使用
    • 2.1 新建工程模板
      • 2.1.1 基于固件库(先复制文件夹,后添加文件)
      • 2.1.2 基于寄存器
      • 2.1.3 基于HAL库
    • 2.2 下载与调试
    • 2.3 工程目录下简介
    • 2.4 MDK使用技巧


前言

  介绍一下单片机开发软件Keil的基本使用,平台以STM32f407为准,有机会完善


一、开发环境搭建

1.1 Keil的安装

1.Keil 523版本下载链接
2.选择安装路径,其余默认即可,具体可以参考百度
在这里插入图片描述
[注] 汉化会导致部分功能设置不显示
3.基于不同芯片加载包不一样,官网http://www.keil.com/dd2/pack下载 Keil.STM32F4xx_DFP.1.0.8(双击打开安装stm32)

1.2 其他工具安装

  1. CH340串口驱动安装
    安装方法:直接点击安装(安装失败见readme),提示预安装成功即安装成功
    作用:安装了串口驱动后,电脑就能识别串口
  2. 串口程序下载工具mcuisp(FlyMcu)
    作用:可以将.hex格式程序下载到板子里
  3. 串口调试助手XCOM
    作用:可以通过串口收发数据
  4. STLINK驱动安装
    作用:可以在windows下配合MDK进行程序下载和调试。

1.3 注意事项

  1. STM32的ISP下载,只能使用串口1,也就是对应串口发送接收引脚PA9,PA10。不能使用其他串口 (例如串口2:PA2,PA3)用来ISP下载。
  2. 开发板供电的时候,有如下注意事项
    (1)DC005接口,供电范围是6~24V,请不要违规供电。
    (2)VOUT2(2X3排针)可以做5V输出,也可以做输入。
    (3)当开发板外接负载较重(电流大)时,请提供足够电源。
    (4)开发板不支持JLINK等仿真供电,请不要尝试。
    (5)正常供电后,蓝色电源指示灯,必须亮,才可使用开发板。
  3. 开发板IO使用的时候,有如下注意事项:
    (1)IO口一定不要接超过5V的电压。
    (2)不要用IO口直接驱动感性负载(电机/电磁阀/继电器等)。
    (3)外接其他外设时,请先做好IO选型,选择合适的IO口。
    (4)注意防静电(尤其是冬天)。

二、Keil基本使用

2.1 新建工程模板

2.1.1 基于固件库(先复制文件夹,后添加文件)

  1. 在磁盘新建文件夹Template(包含CORE,FWLIB,OBJ, USER,并将SYSTEM复制过来)
    在这里插入图片描述

  2. Project ——New Uvision Project ——Template——USER(工程名取Template)——Device——STM32F407ZG(选择对应芯片型号)——OK——Manage Run-Time Environment——Cancel
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 复制官方源文件到新建文件夹(在参考资料STM32F4固件库里)
    (1)删除USER里的Listings和Objects,
    (2)将STM32F4固件库\Libraries\STM32F4xx_StdPeriph_Driver里的src,inc文件夹复制到FWLIB(固件库源码)
    在这里插入图片描述

(3)将STM32F4xx固件库——Libraries——CMSIS——Device——ST——STM32F4xx——Source\Templates\arm里startup_stm32f40_41xxx.s复制到CORE,将STM32F4固件库\Libraries\CMSIS\Includ,将里面core_cm4.h、core_cm4_simd.h、core_cmFunc.h以及core_cmInstr.h同样复制到CORE(启动文件)
在这里插入图片描述

(4)将STM32F4固件库\Libraries\CMSIS\Device——ST\STM32F4xx\Include里的stm32f4xx.h和system_stm32f4xx.h复制到USER里。在STM32F4固件库\Project\STM32F4xx_StdPeriph_Templates里将目录下面的5个文件main.c,stm32f4xx_conf.h,stm32f4xx_it.c,stm32f4xx_it.h,system_stm32f4xx.c复制到USER目录下面(复制头文件和源文件)
在这里插入图片描述

(5)找到工程源码里的一个SYSTEM复制过来(这一步非必要)
在这里插入图片描述

  1. 将固件库文件复制到工程
    (1)右键点击Target1——Manage Project Items——Project Targets(将Target改名为Template,在Groups里删掉Source Group1,建立USER,CORE,FWLIB,SYSTEM)——OK(将上面的文件添加到我们的工程里)
    在这里插入图片描述
    在这里插入图片描述

(2)右击Template——Manage Project Items——选择FWLIB——点击ADD Files——选择FWLIB\src全选Ctrl+A——Add——Close(删除stm32f4xx_fmc.c,可以只添加我们用到的库文件)
在这里插入图片描述
在这里插入图片描述

(3)同样在CORE里添加startup_stm32f40_41xxx.s, 在USER里添加的文件main.c,stm32f4xx_it.c,system_stm32f4xx.c
(4)右击Template——Manage Project Items——建立SYSTEM——Add Files…(添加delay.c、sys.c、usar.c三个c文件)——Close——OK
在这里插入图片描述

  1. 设置存放路径
    (1)设置MDK头文件存放路径
    Options for Target…——C/C++——Include Paths…——新建…(分别添加CORE,USER,FWLIB\inc和SYSTEM里的delay、sys、usar三个文件夹)
    在这里插入图片描述

(2)添加全局定义标识符
Options for Target…——C/C++——Define(添加STM32F40_41xxx,USE_STDPERIPH_DRIVER)
在这里插入图片描述

(3)选择编译的中间文件存放目录
①Options for Target…——Output——Select Folder for Objects…(选择新建的OBJ)——将下面三个都勾选(生成HEX文件)
在这里插入图片描述

②Options for Target…——Listing——Select Folder for Objects…(选择新建的)
6. 修改代码
(1)将main.c里替换成README里的代码(注意最后一行空白),删除stm32f4xx_it.c里第32行#include "main.h"和第144行TimingDelay_Decrement();
(2)修改System_stm32f4xx.c,把PLL第一分频系数改为8,如#define PLL_M 8(使主频为168MHz)
(3)修改stm32f4xx.h里HSE_VALUE为8MHz,如#define HSE_VALUE ((uint32_t)8000000)(修改外部时钟为8MHz)
7. 调用实验——编译F7

2.1.2 基于寄存器

  1. Project ——New Uvision Project ——新建TEST,OBJ文件夹,在里面新建USER文件夹,保存名为test——Device——STM32F407ZG(选择对应芯片型号)——OK——Manage Run-Time Environment——Cancel
  2. 添加启动文件(注意与标准库不同有注释)
    (1)将启动文件startup_stm32f40_41xxx.s复制到USER目录下
    (2)Options for Target…——Target——修改Xtal为8——OK
    (3)Target1——双击Source Group1——选择启动文件Add——Close
  3. Options for Target…——Output/Listings——Select Folder for Objects…(选择新建的OBJ)——将下面三个都勾选(生成HEX文件)
  4. 将寄存器版里的SYSTEM文件复制到TEST里——右击Template——Manage Project Items——新建组SYSTEM和USER——Add Files将delay.c、sys.c和usart.c添加进SYSTEM——Close——OK
  5. 新建空文档test.c保存到USER里,双击USER添加,将寄存器版里源文件test.c里内容复制过来
  6. Options for Target…——C/C++——Include Paths…——新建…——将SYSTEM里三个文件夹添加进去——OK (在Define里添加宏STM32F40_41xxx)
  7. 调用实验——编译F7

2.1.3 基于HAL库

  1. 新建文件夹Template,在里面建立文件夹CORE,HALLIB,OBJ和USER
  2. Project ——New Uvision Project ——Template——USER(工程名取Template))——Device——STM32F407ZG(选择对应芯片型号)——OK——Manage Run-Time Environment——Cancel
  3. 复制相关文件
    (1)将官方包STM32Cube_FW_F4_V1.24.0\Drivers\STM32F4xx_HAL_Driver离得Src和Inc复制到新建的HALLIB里
    (2)将STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source
    \Templates \arm里的启动文件startup_stm32f407xx.s复制到CORE里,同时将\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\Include里的cmsis_armcc.h, cmsis_armclang.h,cmsis_compiler.h,cmsis_version.h,mpu_armv7.h,core_cm4.h复制到CORE里
    (3)将STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include里的stm32f4xx.h,system_stm32f4xx.h和stm32f407xx.h头文件复制到USER中
    (4)将STM32Cube_FW_F4_V1.24.0\Projects\STM32F4-Discovery\Templates里Inc文件夹中的stm32f4xx_it.h,stm32f4xx_hal_conf.h,main.h和Src文件夹中的system_stm32f4xx.c, stm32f4xx_it.c, stm32f4xx_hal_msp.c,main.c复制到USER里
    (5)将模板里的SYSTEM复制进Template1中
    4.在小组里添加相关文件
    (1)右键点击Target1——Manage Project Items——Project Targets(将Target改名为Template,在Groups里删掉Source Group1,建立USER,CORE,FWLIB,SYSTEM)——OK(将上面的文件添加到我们的工程里)
    (2)将HALLIB\Src添加到HALLIB组里(去掉stm32f4xx_hal_dsi.c,stm32f4xx_hal_lptim.c和stm32f4xx_hal_msp_template.c,此外去掉带ll的和带timebase的),USER里添加main.c,stm32f4xx_hal_msp.c,stm32f4xx_it.c和system_stm32f4xx.c,CORE里添加头文件和启动文件startup_stm32f407xx.s,SYSTEM里添加sys.c,delay.c和usart.c
  4. Options for Target…——C/C++——Include Paths…——新建…——将CORE,USER,HALLIB\Inc和SYSTEM里三个子文件夹添加进去——OK(在Define里添加宏USE_HAL_DRIVER,STM32F407xx用英文逗号隔开,取消勾选Output里的Browse Information)
  5. 将模板里main.c里的内容复制进工程里的主函数中

2.2 下载与调试

  1. STM32串口程序下载
    (1)连线
    ①在板子上把RXD和PA9,TXD和PA10通过跳线帽连起来
    ②把BOOT1和BOOT0都设置为0
    ③把B0接V3.3,按一下复位键
    ④在USB_232处插入USB线连接电脑
    (2)FlyMcu下载设置——开始编程——成功后显示:共写入…KB,好事…毫秒
    ①搜索串口,选择虚拟出来的USB:COMx:空闲USB-SERIAL CH340
    ②勾上“编程前重装文件”、“校验”以及“编程后执行”,其他都不要勾选
    ③左下方:选择第四个DTR的低电平复位,RTS高电平进bootloader
    ④联机下载文件选.hex
    ⑤波特率设置为76800bps
    (3)打开串口调试助手(XCOM)设置波特率为115200查看收发信息是否一样
  2. STLINK下载与调试程序
    (1)keil的设置
    ①目标选项——Debug——Use选择ST-Link Debugger,勾选Run to main()
    ②目标选项——Debug——Settings——设置Port为SW,Max为4MHz
    ③目标选项——Utilities——Settings——勾选Reset and Run
    (2)开始运行
    ①点击开始/停止仿真(则会线更新代码在仿真),或者点击下载F8(只下载代码)(注意B0和B1都要设置GND)
    ②MDK弹出Debug工具条——堆栈局部变量窗口
    在这里插入图片描述
    在这里插入图片描述

③把光标放到test.c的第9行左侧左击,可以放置一个红色的断点,再次单击取消,然后点击执行到断点处
④菜单栏外设——USART——USART1——点击执行过去
(3)打开串口调试助手(XCOM)设置波特率为115200和串口号,然后点击执行过去按钮,看t值变化

2.3 工程目录下简介

1.USER
(1)main.c ——主函数来调用其他函数
(2)stm32f4xx_it.c——中断处理文件,stm32f4xx是型号
(3)system_stm32f4xx.c——系统初始化文件
2.CORE包含内核相关的函数和宏定义
(1)startup_stm32f40_41xxx.s——启动文件(不需要动)
3.FWLIB固件库
(1)misc.c——存放头文件
(2)stm32f4xx_gpio.c—— 是处理引脚相关函数的文件
(3)stm32f4xx_rcc.c——是处理内部时钟相关函数文件(不能删除)
(4)stm32f4xx_usart.c——是串口通信的相关函数文件
4.HARDWARE存放和硬件相关的函数
(1)led.c对GPIO引脚的初始化
5.README告诉别人干嘛的
6.SYSTEM
(1)delay.c——存放的是和延时相关的函数。
(2)sys.c——存放的是系统初始化相关的函数,不必深究。
(3)usart.c——存放的和串口通讯时用到的代码

2.4 MDK使用技巧

  1. 文本美化
    (1)Configuration——Editor——选择Encoding为Chinese GB2312(Simplified),设置Tab size为4(设置注释关键字字体)
    (2)Colors & Fonts——C/C++ Editor Files——Number(修改字体颜色和大小,或者Ctrl+鼠标滑轮进行放大或者缩小)
    (3)User Keywords——C/C++ Editor Files——输入关键字改变颜色
  2. 语法检查&代码提示
    (1)配置——Text Completion——Symbols after xxx characters(用于开启代码提示功能)
    (2)Strut/Class Members(用于开启结构体/类成员提示功能)
    (3)Dynamic Syntax Checking(则用于开启动态语法检测)
    (4)Function Parameters(用于开启函数参数提示功能)
  3. 代码编辑器技巧
    (1)Tab(或者Shift + Tab)可以使一片代码右移(或左移)
    (2)右击函数或者变量上——Go to Definition Of ‘…’(进行快速定位,注意先编译)
    (3)选中一片代码右击——Advanced——Comment Selection(或取消注释)
  4. 其他小技巧
    (1)右击头文件——Open Document “XXX”可以快速打开文件
    (2)Ctrl + H(查找替换)
    (3)双击头文件——点击上面图标在文件中查找Find in Files…(跨文件查找)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest 使用(二):前后置(固件,夹具)

Pytest框架实现一些前后置(固件,夹具)的处理,常用三种。 一、setup/teardown,setup_class/teardown_class 为什么需要这些功能? 比如:web自动化执行用例之前,请问需要打开浏览器吗&#xff1f…

JavaScript

文章目录 1、JavaScript 的历史1.1 JavaScript 的历史1.2 JavaScript与ECMAScript的关系1.3 JavaScript与Java的关系1.4 JavaScript的版本 2、JS的引入方式3、ECMAScript基本语法3.1 变量3.2 注释3.2 语句分隔符 4、ECMAScript 基本数据类型4.1 数字类型4.2 字符串4.2.1 创建4.…

详解API接口如何安全的传输数据(内附商品详情API接口接入方式)

概述 API接口的安全传输是确保数据在API请求和响应之间的传输过程中不被截获、篡改或泄露的重要步骤。以下是一些用于增强API接口安全传输的常见技术和最佳实践: 使用HTTPS:使用HTTPS协议而不是HTTP,以确保数据在传输过程中的安全性。HTTPS使…

【计算机网络】运输层

概述运输层服务 运输层协议为运行在不同主机上的应用程序提供了逻辑通信功能。 运输层协议是在端系统中而不是在路由器中实现的。 运输层和网络层的关系: 网络层提供主机之间的逻辑通信,而运输层为**运行在不同主机上的应用程序(进程&#…

利用wasm实现读写本地项目的在线编辑器

利用wasm实现读写本地项目的在线编辑器 本篇内容是通过AI-ChatGPT问答和查阅相关文档得到的答案。 起因是看到在线Vscode和RemixIde都实现了在线读取用户电脑文件夹作为项目根目录,达成读取、创建、修改、删除该目录下所有文件、文件夹的功能。 而在浏览器中因为安…

python爬虫利用代理IP分析大数据

目录 前言 一、什么是代理IP? 二、为什么需要使用代理IP? 1.突破访问限制 2.提高访问速度 3.保护隐私 三、代理IP的分类 1.高匿代理IP 2.普通代理IP 3.透明代理IP 四、如何获取代理IP? 1.免费代理IP网站 2.付费代理IP服务商 五…

Java文件操作详解

CONTENTS 1. 文件和目录路径1.1 获取Path的片段1.2 获取Path信息1.3 添加或删除路径片段 2. 文件系统3. 查找文件4. 读写文件 1. 文件和目录路径 Path 对象代表的是一个文件或目录的路径,它是在不同的操作系统和文件系统之上的抽象。它的目的是,在构建路…

UTF-8-SIG 和 UTF-8 with BOM 有什么区别,该怎么选

前言 用 Sublime Text 打开一个文件,出现一个框框,提示要点选UTF-8-SIG(100%) 或 UTF-8 with BOM 详解 BOM (Byte Order Mark) 存在:UTF-8 with BOM 包含一个特殊的字节顺序标记 (BOM),它是一个非打印字符,通常用于…

前端基础之CSS

目录 一、CSS介绍 CSS语法 CSS注释 CSS的几种引入方式 二、CSS选择器 基本选择器 组合选择器 属性选择器 分组和嵌套选择器 伪类选择器 伪元素选择器 选择器的优先级 三、CSS属性相关 宽和高 字体属性 文字属性 背景属性 边框 border-radius display属性 …

常见接口测试面试题

1、按你的理解,软件接口是什么? 答: 就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。 2、HTTP和HTTPS协议区别? 答: https协议需要到CA(Certificate Authority,证书…

物联网整体框架有哪些层面?

物联网是当前非常火热的话题,各个行业对物联网的关注和投入力度也很大,一些互联网巨头都在紧锣密鼓的布局物联网产业,抢占市场先机。 物联网的整体构架大致可以分为以下四个层面: 1.感知识别层 感知层是物联网整体架构的基础&…

HTML标题、段落、文本格式化

HTML标题&#xff1a; 在HTML文档中&#xff0c;标题是很重要的。标题是通过<h1> - <h6标签进行定义的&#xff0c;<h1> 定义最大的标题&#xff1b;<h6>定义最小的标题。 <hr> 标签在HTML页面中用于创建水平线&#xff0c;hr元素可用于分隔内容。…

【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包

一、Nginx导言 1、引言 Nginx 是一款高性能的 Web 服务器和反向代理服务器&#xff0c;也可以充当负载均衡器、HTTP 缓存和安全防护设备。它的特点是内存占用小、稳定性高、并发性强、易于扩展&#xff0c;因此在互联网领域得到了广泛的使用。 总结出以下三点: 负载均衡&#x…

CN考研真题知识点二轮归纳(4)

持续更新&#xff0c;上期目录&#xff1a; CN考研真题知识点二轮归纳&#xff08;4&#xff09;https://blog.csdn.net/jsl123x/article/details/134135134?spm1001.2014.3001.5501 1.既可以扩展网段又是二层的设备 网段一般指一个计算机网络中使用同一物理层设备&#xff…

小程序如何设置自动使用物流账号发货

小程序支持自动使用物流账号发货并生成运单号。商家需要与物流公司合作&#xff0c;获取物流账号&#xff0c;支持快递物流和同城外卖配送平台。具体方法请参考公众号之前发布的文章&#xff0c;例如可以搜索“快递账号”。 导入物流账号后&#xff0c;在小程序管理员后台->…

出海营销必看:如何避免邮件被识别为垃圾邮件

对于现在的商业环境来说&#xff0c;邮件通信已经成为企业与客户、合作伙伴以及员工之间沟通和交流的重要方式。然而&#xff0c;尽管企业发送的邮件通常都是正常的、合规的&#xff0c;有时候却会被系统错误地标记为营销邮件。这个情况给企业带来了很多困扰。 如果企业的邮件…

如何使用内网穿透远程访问Linux SVN服务?

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

docker fixuid

docker fixuid 一、fixuid是什么二、使用场景三、问题dockerfiledocker run 一、fixuid是什么 fixuid是用go语言编写的&#xff0c;当容器起来后可以修改容器中非root用户的UID/GID和文件权限。 项目地址&#xff1a;https://github.com/boxboat/fixuid 二、使用场景 当容器…

Python嵌入式数据库 / 轻量级数据库 / 小型数据库介绍(SQLite、Pandas DataFrame、TinyDB)(python数据库)

文章目录 Python嵌入式数据库/轻量级数据库介绍什么是嵌入式数据库/轻量级数据库&#xff1f;SQLitePandasTinyDB总结 Python嵌入式数据库/轻量级数据库介绍 在构建应用程序时&#xff0c;数据存储是必不可少的一部分。传统的方式是使用如MySQL、PostgreSQL这样的重量级数据库…

使用vue3+vite+elctron构建小项目介绍Electron进程间通信

进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分之一。 由于主进程和渲染器进程在 Electron 的进程模型具有不同的职责&#xff0c;因此 IPC 是执行许多常见任务的唯一方法&#xff0c;例如从 UI 调用原生 API 或从原生菜单触发 Web 内容的更改。 在 …