例程功能
飞思卡尔KL25Z产品BME例程1采用
ARM内核的sys
tick作为时间基准,测试使用单条BME对外
设操作与相同功能的普通指令对外设操作之间的差别。并将各自操作所耗的systick的计数个数
通过串口打印出来。结果发现,使用硬件模块BME对外设进行位操作,减少了C代码的指令大小,
提高了指令执行效率。
运行平台
ü TWR-KL25Z48M
ü TWR-SER
ü FRDM-KL25Z
ü Keil MDK /IAR ARM IDE
BME 简介
飞思卡尔 BME(位操作引擎),是由硬件支持的模块,通过在目标地址存储相应数据,实现对外
设寄存器的读、改、写操作。它具有外设装置负载能力和存储能力,能够提供进程效率和减小代码
大小。支持位操作存储区的地址为 0x4400_0000~0x5FFF_FFFF。
支持的外设装置存储的指令有:AND,OR,XOR 以及位插入(BFI);
支持的外设装置负载的指令有:单 bit 的装载与清位(LAC1),单 bit 的装载与置位(LAS1)
以及无符号位提取(UBFX)。
BME 只能被内核访问,通用的 Cortex—M0+内核平台的框图如下所示。
下面分别讲解外设装置存储的指令。
1) 装置存储逻辑 AND
下图为装置存储逻辑 AND 指令的地址存储情况。
其中,bit[28:26]=001 为 AND 操作,bit[19:0]代表了外设空间地址相对地址 0x4000_0000 的地址偏
移量。“-”表示无意义位。
2) 装置存储逻辑 OR
下图为装置存储逻辑 OR 指令的地址存储情况。
其中,bit[28:26]=010 为 OR 操作,bit[19:0]代表了外设空间地址相对地址 0x4000_0000 的地址偏移
量。“-”表示无意义位。
3) 装置存储逻辑 XOR
下图为装置存储逻辑 XOR 指令的地址存储情况。
其中,bit[28:26]=011 为 OR 操作,bit[19:0]代表了外设空间地址相对地址 0x4000_0000 的地址偏移
量。“-”表示无意义位。
4) 装置存储位插入 BFI
下图为装置存储位插入 BFI 指令的地址存储情况。
其中,bit[28]=1 为 BFI 操作,bit[27:23]为“b”表示最低位开始的位置,bit[22:19]为“w”为位的
宽度-1,bit[18:0]代表了外设空间地址相对地址 0x4000_0000 的地址偏移量。“-“表示无意义位。
下面分别讲解外设装置负载的指令。
1) 单 bit 的装载与清位 LAC1
下图为单 bit 的装载与清位 LAC1 指令的地址存储情况。
其中,bit[28:26]=010 为单 bit 的装载与清位 LAC1 操作,bit[25:21]为“b”表示最低位开始的位
置,bit[19:0]代表了外设空间地址相对地址 0x4000_0000 的地址偏移量。“-“表示无意义位。
2) 单 bit 的装载与置位 LAS1
下图为单 bit 的装载与置位 LAS1 指令的地址存储情况。
其中,bit[28:26]=011 为单 bit 的装载与置位 LAS1 操作,bit[25:21]为“b”表示最低位开始的位置,
bit[27:23]为“w”为位的宽度-1,bit[18:0]代表了外设空间地址相对地址 0x4000_0000 的地址偏移量。“-“表示无意义位。
3) 无符号位提取 BUFX
下图为无符号位提取 BUFX 指令的地址存储情况。
其中,bit[28]=1 为无符号位提取 BUFX 操作,bit[27:23]为“b”表示最低位开始的位置,bit[19:0]代
表了外设空间地址相对地址 0x4000_0000 的地址偏移量。“-“表示无意义位。
运行例程(KEIL MDK)
1) 使用 USB cable 连接 TWR-KL25Z48M
开发板 Min-B USB 连接器(J23)或连接
FRDM-KL25Z 开发板 Min-B USB 连接器(J7);
2) 加载 LQRUG_bme_ex1 工程,可根据开发平台选择不同,在工程的 Options 中修改图 9
中高亮标出的字符,如选择 TWR-KL25Z48M 平台,即将字符修改为 TOWER;选择 FRDM-
KL25Z 开发板,即将字符修改为 FREEDOM。点击
进行编译;
3) 编译成功后,点击
进入调试界面
4) 进入调试界面后,点击
运行例程
运行例程(IAR)
1) 使用 USB cable 连接 TWR-KL25Z48M 开发板 Min-B USB 连接器(J23)或连接FRDM-KL25Z 开发板 Min-B USB 连接器(J7);
2) 加载 LQRUG_bme_ex1 工作区后,并根据开发平台选择 LQRUG_bme_ex1_freedom 或
LQRUG_bme_ex1_tower 工程,选择【Flash_128KB】,选择方法如图 10 所示.另外
其实和 Keil 一样,也可以使用一个工程,在工程的 Options 中修改图 11 高亮标出的字
符,如选择 TWR-KL25Z48M 平台,即将字符修改为 TOWER;选择 FRDM-KL25Z 开发板
,即将字符修改为 FREEDOM 点击
进行编译
3)编译成功后,点击
进入调试界面
4)进入调试界面后,点击
运行例程
串口配置
选择串口调试工具,使用下图配置信息:
注:其中端口号为实际硬件的串口号,查看【我的电脑】->【设备管理器】->【端口】 。
代码说明
主程序(main 函数)代码说明
Systick 相关代码说明
子函数(logic_op_demo_with_normalc(void))代码说明
子函数(void logic_op_with_bme_macros(void))代码说明
子函数(bfi_op_with_normalc)代码说明
子函数(bfi_op_with_normalc)代码说明
子函数(lac1_op_with_normalc)代码说明
子函数(lac1_op_with_bme_macros)代码说明
子函数(las1_op_with_normalc)代码说明
子函数(las1_op_with_bme_macros)代码说明
子函数(ubfx_op_with_normalc)代码说明
子函数(ubfx_op_with_bme_macros)代码说明
流程图
运行效果
下面以位插入操作 BFI 以及位清零操作 LAC1 为例,分别给出它们的普通代码和 BME 代码
之前的结果差异。
1: 位插入操作 BFI
2: 位清零操作 LAC1