MDK 是 Microcontroller Development Kit 的缩写,ARM 公司出品,是目前针对 ARM 处理器,尤其是 Cortex-M 内核处理器的最佳开发工具。

目录

  • 一、MDK5安装
  • 二、stm32Pack手动安装
  • 三、MDK5注册
  • 四、stm32简单程序编译
  • 五、小结
  • 六、参考资料

一、MDK5安装

1、打开 开发环境MDK5 文件夹中 mdk_510 应用程序,双击。如图所示:

2、此时会出现安装界面,点击 “NEXT”;

3、然后点击 “I agree…”,继续点击 “NEXT”;

4、然后选择安装路径(可以进行自己修改,此时我已进行修改)点击“NEXT”;

5、然后随便写一些资料,这里不做要求;然后点击“NEXT”;

6、然后就会进行安装;

7、安装完以后点击“Finish”;

8、因为之前我已经安装过,在新安装的过程中会出现以下界面,然后点击安装即可;

9、安装完以后会出现自动安装包的界面,但是会出现“Error”等提示;此时直接关闭即可,后面我们会进行手动安装。

二、stm32Pack手动安装

在解压的开发环境MDK中依次会后如图所示包

1、点击“ARM.CMSIS.3.20.4”会出现安装界面;点击“NEXT”即可;

会出现安装界面;


安装完以后点击“Finish”即可;


2、然后继续双击“Keli.STM32F1xx_DFP.1.0.4”,出现以下界面,点击“Next”;


然后会出现安装界面;


然后点击“Finish”即可;


3、注意:当双击2.2.0的STM32 pack时,会出现安装失败,是因为2.2.0版本的pack只支持更高版本的MDK软件,如若想安装上这个pack,可以去下载最新的MDK,这里我们只做学习用,1.0.4版本的足够了。


此时MDK5和STM32 Pack已经完成,但是此时是不能使用的,需要进行注册。

三、MDK5注册

因为之前好多用的注册机的到期时间都是2020年,大多数都已经过期了,此时在参考资料中给了到2032年的,可以放心使用;

1.在进行之前首先把系统的防火墙关掉(不关掉会导致注册不成功),我这里以win10为例;打开“开始”的“控制面板”,找到“系统和安全”;

然后找到“Windows Defender 防火墙”;

然后关闭“Windows Defender 防火墙”;

2、解压2032的注册机;
然后会出现“keygen”应用程序;


双击“keygen”应用程序;会出现以下界面;(请保持电脑静音或者音量小)


然后在“Target”中选中“ARM”选项;

此时以管理员身份打开Keli软件;

然后在“File”中选中“License…”选项;

然后在出现的界面中找到“CID”并复制里面的内容;

然后把复制的粘贴到Keygen中“CID”中,单击“Generate”;

然后会出现字符串,复制;

然后将复制的字符串粘贴到下方方框中,点击“Add LIC”;会在上方表格中出现一串信息,在“Support Period”栏中可以看到“DEC 2032”;然后点击“Close”即可;此时Keli就完全可以用了。

四、stm32简单程序编译

1、在使用Keil之前,先对Keli进行一些参数的设置;

在“Edit”中选择“Configuration”选项;

设置编码形式为Chinese GB2312(Simplified),如果不设置,你从其它地方粘贴过来的代码含有中文的话,就会出现乱码,然后设置Tab size为4。然后点击“OK”退出;


2、在Project栏目中点击“New μVision Project”选项;

然后文件名为“LED123”,点击保存;

在左侧的窗口内选择STM32芯片,这里我们选择STM32F103RB,并保存。

勾选如图所示的选项,并点击OK,工程创建完毕。

工程创建完毕后,在左上角点击新建文件,然后窗口出现了一个Text1的文件。

然后将下列代码复制粘贴到Text1文本框内(整个实验主要是为了简单程序进行编译,代码的难易程度不重要)

//宏定义,用于存放stm32寄存器映射
#define PERIPH_BASE           ((unsigned int)0x40000000)//AHB
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
//GPIOA_BASE=0x40000000+0x10000+0x0800=0x40010800,该地址为GPIOA的基地址
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
//GPIOB_BASE=0x40000000+0x10000+0x0C00=0x40010C00,该地址为GPIOB的基地址
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
//GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
//GPIOD_BASE=0x40000000+0x10000+0x1400=0x40011400,该地址为GPIOD的基地址
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
//GPIOE_BASE=0x40000000+0x10000+0x0800=0x40011800,该地址为GPIOE的基地址
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
//GPIOF_BASE=0x40000000+0x10000+0x0800=0x40011C00,该地址为GPIOF的基地址
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)
//GPIOG_BASE=0x40000000+0x10000+0x0800=0x40012000,该地址为GPIOG的基地址
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))#define LED0  MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))
//#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8
//定义typedef类型别名
typedef  struct
{volatile  unsigned  int  CR;volatile  unsigned  int  CFGR;volatile  unsigned  int  CIR;volatile  unsigned  int  APB2RSTR;volatile  unsigned  int  APB1RSTR;volatile  unsigned  int  AHBENR;volatile  unsigned  int  APB2ENR;volatile  unsigned  int  APB1ENR;volatile  unsigned  int  BDCR;volatile  unsigned  int  CSR;
} RCC_TypeDef;#define RCC ((RCC_TypeDef *)0x40021000)
//定义typedef类型别名
typedef  struct
{
volatile  unsigned  int  CRL;
volatile  unsigned  int  CRH;
volatile  unsigned  int  IDR;
volatile  unsigned  int  ODR;
volatile  unsigned  int  BSRR;
volatile  unsigned  int  BRR;
volatile  unsigned  int  LCKR;
} GPIO_TypeDef;
//GPIOA指向地址GPIOA_BASE,GPIOA_BASE地址存放的数据类型为GPIO_TypeDef
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)void  LEDInit( void )
{RCC->APB2ENR|=1<<2;  //GPIOA 时钟开启GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=0X00000003;
}//粗略延时
void  Delay_ms( volatile  unsigned  int  t)
{unsigned  int  i,n;for (n=0;n<t;n++)for (i=0;i<800;i++);
}int main(void)
{LEDInit();while (1){LED0=0;//LED熄灭Delay_ms(500);//延时时间LED0=1;//LED亮Delay_ms(500);//延时时间}
}

复制粘贴完后,点击左上角保存按钮,在弹出的窗口内,输入文件名main.c(如果不加后缀,就不会是.c文件),点击保存,而后Text1文件就变成了main.c文件。


右键点击 Source Group 1 ,然后点击 Add Existing Files to Group …(在工程下添加main.c文件)

选中main.c文件,再点击Add,然后关闭窗口,此时你会发现,Source Group 1 文件下新增了一个main.c文件。


点击左上角编译按钮,开始编译程序,此时0错误,0警告,表示编译成功。

首先点击 魔法棒,然后在弹出的窗口内,点击 Debug,勾选 Use Simulator ,再选择 ULINK2/ME Cortex Debugger ,并点击 Settings 。

确定一下Port是JTAG,Reset可以设置为Autodetect或SYSRESEETREQ,然后点击OK返回上一级窗口,再点击OK。

选中带有红色d的放大镜开始调试,在②处就是仿真调试所需要的调试工具

至此就完成了一个stm32程序的编译。

五、小结

1、本篇内容主要是把MDK5的安装,stm32 Pack的安装,Keli5的注册和stm32程序的编译进行了详细的介绍,但是因为没有电路板,所以也就没法进行实物的演示,但是可以自己在仿真软件上进行演示。
2、整个安装步骤有些复杂,希望可以耐心的按着步骤一步一步来,不要出错。

六、参考资料

整个stm32程序编译的过程是参考已下同学的博客,感谢。
ARM开发:使用MDK编译stm32简单程序(闪烁LED)

Keli 5软件
官网下载:
http://www.keil.com/download/product
分享链接:
https://pan.baidu.com/s/19g4TxW-_pNH41bLiI-5_FA
提取码:r2eb

一个stm32简单程序的编译相关推荐

  1. 一个stm32的简单程序的编译

    一个stm32的简单程序的编译 stm32程序-LED 总结 stm32程序-LED 一.建立一个工程 1.打开Keil uVision5,找到project,然后点击New uVision Proj ...

  2. 嵌入式作业使用MDK编译stm32简单程序

    目录 一.MDK和stm32介绍 1.什么是stm32 2.什么是MDK 二.环境配置 1.准备工作 2.安装keil软件 3.keil的环境设置 三.stm32程序编译 1.新建工程 2.新建mai ...

  3. stm32简单程序编译、仿真和51单片机仿真

    stm32简单程序编译.仿真和51单片机仿真 文章目录 stm32简单程序编译.仿真和51单片机仿真 一.stm32简单程序编译和调试 编译前的准备工作 新建工程 新建main1.c文件 编译程序 调 ...

  4. 一个超简单的反编译任务(IDAPro、X32dbg)

    一个超简单的反汇编任务 所需工具 IDAPro.X32dbg.Visual C++ 6.0 实验步骤 首先,我们新建一个简单的程序并编译运行. 这里笔者建立了一个弹窗程序,运行结果如下: 进行IDA逆 ...

  5. 一个C/C++程序从编译到最终生成可执行文件的全过程分析

    一个C/C++程序从编译到最终生成可执行文件的全过程分析 C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件  1.编译预处理  读取 ...

  6. code ro rw zi 编译的一个ARM的程序,编译结果中的一句话

    code ro rw zi 编译的一个ARM的程序,编译结果中的一句话 Program Size: Code=8044 RO-data=52 RW-data=56 ZI-data=5184 其中: C ...

  7. MDK5的简单程序的编译

    MDK5的简单程序的编译 一.MDK5的简单介绍 二.简单程序编译 一.MDK5的简单介绍 MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称.在全球 MDK 被超过 10 万的 ...

  8. 一个c语言程序只要编译和链接没有错误,一个 C 语言程序只要编译和链接没有错误,程序运行结果就肯定正确...

    一个 C 语言程序只要编译和链接没有错误,程序运行结果就肯定正确 更多相关问题 网页表单中不能插入表格.() 要想在一个网页中嵌套另外一个网页,一般可以使用页内框架.() 贸易也是一种特殊的技术.() ...

  9. java语言简单代码_java语言编程如何实现一个最简单程序?

    在编程语言中,实践出结果是最重要的,其他的什么都是为此做准备,下面我们就来看看该如何编译一个最简单的java程序. 首先,启动你的编程软件,如eclipse等,具体可以网上了解, 再来,创建一个新的j ...

最新文章

  1. UVA1327 King‘s Quest(强连通分量、给王子们匹配公主系列 - 1 )
  2. SDN控制器策略制定和表项下发—Vecloud
  3. tab-pane 怎么家点击事件_想起爆款?怎么样去打造一个人见人点的爆款主图?
  4. 认证服务器协议,基于口令的客户端/服务器认证协议
  5. 30 个惊艳的Python开源项目
  6. nginx 配置路由
  7. 2021-2025年中国住宅安全行业市场供需与战略研究报告
  8. coredata 自动化刷新uitableview数据
  9. 图卷积网络详细介绍(二)
  10. sap crystal reports(水晶报表) 2016 SP7中文破解版
  11. 【业余无线电BI1FKP】万里通UV5F-Plus写频、自制写频线
  12. 从Log4j迁移到LogBack的理由
  13. R语言hist作直方图
  14. Linux debian利用ifconfig查看IP地址
  15. 微信小程序 live-player 无声音
  16. 路由器dns服务器怎么才能自动改变,路由器服务器dns怎么设置技巧教程 路由器如何设置修改dns最好...
  17. linux字体怪异_Linux默认安装的字体模糊难看
  18. 向上取整⌈⌉ 和 向下取整⌊⌋ 和四舍五入
  19. AFNetworking理解:
  20. IDEA创建一个JavaWeb项目详细步骤

热门文章

  1. [附源码]JAVA+ssm农商行贷款管理系统(程序+Lw)
  2. USB外接电源与锂电池自动切换电路设计
  3. 算法-----劳斯-赫尔维茨(Routh-Hurwitz)稳定判据(转)
  4. 人工智能决策网络细谈
  5. 基于SSM车辆维修管理系统-JavaWeb汽车保养管理系统
  6. php星外提权,星外提权目录收集
  7. 粗粒度和细粒度入门知识
  8. 拉卡拉智能支付终端应用介绍
  9. 福建85后组建的“第四方支付”被抓:涉案28亿 费率2.5%-4%
  10. ttyUSB 串口编程 Linux下 USB转串口