一、安装及配置环境
01 型号分类及缩写
缩写 | 释义 | Flash容量 | 型号 |
---|
LD_VL | 小容量产品超值系列 | 16~32K | STM32F100 | MD_VL | 中容量产品超值系列 | 64~128K | STM32F100 | HD_VL | 大容量产品超值系列 | 256~512K | STM32F100 | LD | 小容量产品 | 16~32K | STM32F101/102/103 | MD | 中容量产品 | 64~128K | STM32F101/102/103 | HD | 大容量产品 | 256~512K | STM32F101/102/103 |
这里我们选用STM32F103C8T6 ,小容量产品
02 资料共享
首先需要下载安装mdk5软件和stm32包,这里附带配置MDK所需要的的包。 资料下载:https://pan.baidu.com/s/1SqKyKr5Fsl_9gBJi8aVxTw, 提取码:8kzh,链接里压缩包的解压密码:32
03 安装器件支持包
1、打开MDK,找到Pack Installer 2、选择你需要的Pack进行安装(图片仅为示例)。这种方法下载比较慢,建议在官网下载好支持包,直接在本地点击安装即可。
正版的Keil需要付费,如果个人学习需要,可以自行百度使用破解版
04 Keil简单设置
1、安装好Keil后,需要进行一些简单的设置。首先点击Edit→Configuration…,或者直接点工具栏的扳手图标,进入设置界面。 2、设置编码形式为Chinese GB2312(Simplified),不同编码形式主要体现在对中文支持不同,我们在打开其他文件发现中文乱码时,可以更改编码格式才能使乱码变为中文。然后设置Tab size为4。
二、简单程序编译
01 新建工程
双击打开keil,点击菜单栏Project–>New μVision Project 新建项目,在弹窗中选择工程目录,新建名为test的工程文件。
02 配置环境
选择设备,这里我们选用STM32F103C8T6 ,小容量产品 选择运行环境
03 添加源文件
右键单击Source Group 1,选择Add New Item to Group,添加Asm File (.s)文件,命名为TEST并保存 为其添加如下代码
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
04 设置仿真器模式
点击菜单中的Project,找到Options for Target ‘Target 1’并点击,选择Debug–>Use Simulator,将Dialog DLL以及Parameter处修改为自己选择的设备,OK
05 编译调试
可以发现寄存器R5~8和预设的值一样
06 分析Hex文件
Hex 全称 (Intel HEX)文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。在Linux中安装hexedit ,分析hex文件内容
:020000040800F2
:1000000000060020ED000008F5000008F7000008D9
:10001000F9000008FB000008FD00000800000000D7
:1000F00009480047FEE7FEE7FEE7FEE7FEE7FEE70A
:10010000FEE7FEE7FEE7FEE704480549054A064B21
:1001F000194948600846406848600846406840F42D
:10020000806048600846406820F47C1048600846DA
......
:10021000406840F4E81048600846006840F080708C
:10022000086000BF0C48006800F000700028F9D09A
:100230000948406820F003000749486008464068C4
:1002400040F00200486000BF0348406800F00C0026
:100250000828F9D10CBD0000001002400020024027
:1002600010B51348006840F00100114908600846C5
:100270004068104908400E494860084600680E4929
:1002800008400B4908600846006820F48020086098
:100290000846406820F4FE0048604FF41F00886064
:1002A000FFF76AFF4FF000600449086010BD0000CE
:1002B000001002400000FFF8FFFFF6FE08ED00E02E
:0400000508000135B9
:00000001FF
第一行可以看作0x02 0x00 0x00 0x04 0x08 0x00 0xF2,其前四个字节和最后一个字节有特殊含义。中间为数据
-
第一个字节0x02表示本行数据的长度; -
第二、三字节0x00 0x00表示本行数据的起始地址; -
第四字节表示数据类型,数据类型有: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为校验和。
三、中值滤波及程序设计
01 中值滤波
中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的杂讯。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。
02 流程框图
03 程序设计
AREA SORT,CODE,READONLY ;定义一个代码段
ENTRY
MOV R0,#9 ;需要排序的个数,为奇数
LDR R2,=0X40000000 ;R2为原始数据的起始位置
SUB R1,R0,#1
MOV R4,#4
MLA R3,R1,R4,R2 ;R3为原始数据的结束地址
SUB R4,R3,#4 ;R4为原始数据的倒数第二个数的地址
LOOP1 ADD R5,R2,#4 ;R5为内循环的起始地址
LOOP2 LDR R6,[R2]
LDR R7,[R5]
CMP R6,R7 ;比较交换,从小到大排序
STRHI R6,[R5]
STRHI R7, [R2]
ADD R5,R5,#4 ;修改内循环地址
CMP R5, R3 ;内循环结束比较
STRHI R6,[R5]
BLS LOOP2
ADD R2,R2,#4 ;修改外循环地址
CMP R2,R4 ;外循环结束比较
BLS LOOP1
LDR R2, =0x40000000
MOV RO,RO,LSR #1
MOV R4, #4
MLA R3,RO,R4,R2
LDR R1,[R3] ;找到中间那个数并赋给R1
MOV RO, #100
END
相关命令说明 AREA命令:AREA 命令指示汇编器汇编一个新的代码段或数据段。段是独立的、指定的、不可见的代码或数据块,它们由链接器处理。
格式如下:AREA 段名,段属性1,段属性2,段属性3 例如:AREA STACK, NOINIT, READWRITE, ALIGN=3
SPACE命令:SPACE 命令保留一个用零填充的存储器块。 ENTRY命令:声明整个程式的入口点,入口点有且仅有一个。
四、总结
第一次接触汇编语言,同时学习了hex源文件的内容要求。对于初学者汇编语言并不友好,有一些语法还是不能熟练使用。通过此次简单练习实验学习了Keil软件。
参考资料
1、stm32自学视频(非常推荐) 2、ARM开发 3、完成一个基于STM32汇编程序的编写 4、基于MDK创建汇编实现LED闪烁
|