嵌入式入门实践——编写简单STM32程序
嵌入式入门——编写简单STM32程序
目录
一、环境配置
什么是MDK:Keil MDK是德国知名软件公司Keil开发的开发工具。开发者可以用MDK来编写、编译和生成基于STM32的可执行程序。本文章主要是学习如何安装、熟悉MDK并编写一个简单的STM32程序。
1、安装前准备
下载mdk5软件和stm32包的链接:
链接:https://pan.baidu.com/s/1b3YMHGOwa2Rsj3tFIuI58g
提取码:sey1
2、安装流程
2.1安装keil
下载压缩包到随便一个你自己创建的文件夹,然后解压至当前文件夹并打开解压后的文件夹:
安装keil软件:
(1)打开mdk_510.exe应用程序文件,点击next
(2)勾选I agree to…然后点击next
(3)选择安装路径,然后点击next
(4)输入名称和邮箱(随便写即可),点击next
(5)然后在弹出来的窗口里点击安装
(6)点击finish,确认图中的Show Release Notes勾上了
(8)上一步点击finish后会弹出来一个窗口,点击OK即可,然后软件会下载各种pack,鼠标会转圈然后下载失败。然后我们关闭窗口,接下来就开始手动安装stm32pack。
2.2破解keil5
破解后可以拥有十年的使用期
(1)在桌面打开刚刚安装好的keil5,点击file,再点击License Management
(2)复制里面CID
(3)再打开刚刚压缩包里面的keygen复制CID到里面显示CID的地方,target选择ARM,然后点击generate,复制生成的注册码
(4)然后打开keil5把生成的注册码再复制进第二步截图里面的new license code然后点击Add LIC,此时在上面的网格里就可以看到使用日期到了2032年,表明激活成功,在然后点击CLOSE关闭即可。
2.3安装STM32pack
(1)打开刚刚解压缩的文件夹,点击ARM.CMSIS3.20.4包
(2)然后一直点击next,最后点击finish即可
点击finish
(3)再回到刚刚解压缩后的文件里面,打开Keil.STM32F1xx_DFP.1.0.4pack
(4)然后点击next
(5)然后安装完成后点击finish即可。到此安装就完成了。
3、设置keil5
这里设置一下keil5是因为避免输入中文的时候出现乱码
(1)首先打开keil5点击 Edit 找到最下面的configuration,点击进去
(2)在显示出来的页面里面确保Encoding的设置以及Tab size的设置如图所示:
三、简单STM32程序编写
接下来是编译一个简单的STM32程序
1、新建工程
(1)打开keil5,点击project,再点击new uVision project…创建工程
(2)然后就命名保存即可:
(3)然后可根据情况点击下图中的pack,这里我选的是STM32F103FRB包,然后点击OK保存。
(4)接下来对Manage Run-Time Environment进行设置,设置完成后点击OK,就可建立工程。
其实这两个文件刚开始都是存放在KEIL的安装目录下,当我们配置Manage Run-Time Environment选项框之后, 软件就会把选中好的文件从KEIL的安装目录复制到我们的工程目录:ProjectRTEDeviceARMCM3下面。 其中startup_ARMCM3.s是汇编编写的启动文件,system_ARMCM3.c是C语言编写的跟时钟相关的文件。 更加具体的可直接阅读这两个文件的源码。只要是Cortex-M3内核的单片机,这两个文件都适用。
到此这个项目的运行环境就建立完成了。
2、添加源文件
(1)点击OK后点击Target打开,再右键点击source group1,选择Add New Item to Group,
(2)然后选择Asm File (.s)文件,如下图所示,名字就看你自己怎么命名了,再点击add。
再把如下的程序粘贴进去:
AREA MYDATA, DATA
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
MOV R0, #10
MOV R1, #11
MOV R2, #12
MOV R3, #13
;LDR R0, =func01
BL func01
;LDR R1, =func02
BL func02
BL func03
LDR LR, =func01
LDR PC, =func03
B .
func01
MOV R5, #05
BX LR
func02
MOV R6, #06
BX LR
func03
MOV R7, #07
MOV R8, #08
BX LR
3、设置仿真器模式
(1)点击图中魔法棒,点击Target选项,检查芯片型号及晶振频率与所需是否相投同。
(2)再点击Debug打开下图界面,左边是进行软件仿真时的设置,右边是硬件调试时的设置。
设置软件仿真时的设置:
打开Debug选项选择操作类型,以及设置DialogDLL等参数,具体操作及作用如下:
(1)勾选Use Simulator设置使用软件仿真(图中没勾记得勾上)。
(2)勾选Run to main()使调试时,程序自动运行到main函数。
(3)Restore Debug Session Setting一般默认即可,该部分为复位调试窗口的组件,勾选后,调试时对应的窗口或状态恢复默认值。
(4)设置Dialog DLL为DARMSTM.DLL以及设置Parameter为-pSTM32F103ZE(芯片参数按使用的芯片相应修改即可,当然,部分芯片无法仿真),这部分为DLL文件及芯片参数设置区。
Dialog DLL和Parameter不修改的话,后面运行时可能会报错。
设置硬件调试的设置:
1.打开Debug选项选择操作调试器
2.设置Dialog DLL为TARMSTM.DLL以及设置Parameter为-pSTM32F103ZE,如上图所示。
4、编译调试
首先点击图中左边箭头处的符号,出现下边这样的提示则编译成功。
再点击途中右上角的放大镜就会出现下图的仿真界面
可以看见寄存器R5,R6,R7,R8的值和程序设置一样。
四、分析HEX文件
点击右上角魔法棒,再点击output勾选create hex file再推出点击调试就可以生成HEX文件了
然后再此目录下找到生成的HEX文件(图中的mk531是我自己的D盘下自己创建的目录,后面应该都是一样的):
打开HEX文件如下(可用记事本打开),开始分析:
记录build生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义。
:020000040800F2
:100000000006002031010008390100083B0100080A
:100010003D0100083F010008410100080000000008
:100020000000000000000000000000004301000884
:1000300045010008000000004701000849010008D0
:100040004B0100084B0100084B0100084B01000860
:100050004B0100084B0100084B0100084B01000850
:100060004B0100084B0100084B0100084B01000840
:100070004B0100084B0100084B0100084B01000830
:100080004B0100084B0100084B0100084B01000820
:100090004B0100084B0100084B0100084B01000810
:1000A0004B0100084B0100084B0100084B01000800
:1000B0004B0100084B0100084B0100084B010008F0
:1000C0004B0100084B0100084B0100084B010008E0
:1000D0004B0100084B0100084B0100084B010008D0
:1000E0004B0100084B0100084B0100084B010008C0
:1000F0004B0100084B0100084B0100084B010008B0
:100100004B0100084B0100084B0100084B0100089F
:100110004B0100084B0100084B0100084B0100088F
:100120004B0100084B0100084B0100084B0100087F
:100130000948804709480047FEE7FEE7FEE7FEE77B
:10014000FEE7FEE7FEE7FEE7FEE7FEE704480549B7
:10015000054A064B7047000041020008990200085A
:100160000000002000060020000200200002002005
:10017000704770477047000080B500F001F880BDFF
:1001800082B041F204000021C4F20200019100910A
:1001900050F8041C41F4803140F8041C50F8041C51
:1001A00001F400310091019901310191009919B9CF
:1001B0000199B1F5A06FF1D150F8041C890354BF27
:1001C0000021012100910099012936D142F200015C
:1001D000C4F202010A6842F010020A600A6822F0C2
:1001E00003020A600A6842F002020A6001680160C4
:1001F00001680160016841F480610160016821F4D7
:100200007C110160016841F4E811016050F8041CA0
:1002100041F0807140F8041C50F8041C8901FBD5A2
:10022000016821F003010160016841F002010160F1
:10023000016801F00C010829FAD102B070470000F2
:1002400080B541F20000C4F202000168002241F0D2
:10025000010101604168CFF6FF0211404160016871
:100260004FF6FF72CFF6F66211400160016821F48B
:1002700080210160416821F4FE0141604FF41F01BB
:100280008160FFF779FF4EF60850CEF200004FF084
:100290000061016080BD00004FF00A004FF00B01CB
:1002A0004FF00C024FF00D0300F009F800F00AF8CF
:1002B00000F00BF8DFF81CE0DFF81CF0FEE74FF071
:1002C000050570474FF0060670474FF007074FF0DF
:0C02D00008087047BF020008CB020008BD
:040000050800029954
:00000001FF
分析:
该文件为16进制的一串字符。hex文件的第一排字符称之为扩展线性地址记录,也称为32位地址记录或HEX386记录。
在第一行数据020000040800F2中,其实际表达为0x02 0x00 0x00 0x04 0x08 0x00 0xf2。具体含义为:
-
第一个字节 0x02表示本行数据的长度;
-
第二、三字节 0x00 0x00表示本行数据的起始地址;
-
第四字节 0x04表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05
‘00’ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
‘01’ End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾‘02’ Extended Segment Address Record: 用来标识扩展段地址的记录
‘03’ Start Segment Address Record:开始段地址记录
‘04’ Extended Linear Address Record: 用来标识扩展线性地址的记录
‘05’ Start Linear Address Record:开始线性地址记录 -
然后是数据,0x08 0x00
-
最后一个字节 0xf2为校验和。
五、总结
本文的目的是为了练习keil的安装与简单的STM32程序的编写,熟悉使用keil的方法、编写流程、参数调整方法以及对编译后生成的HEX文件进行简单分析。