arm实验指导书(2014-8)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统及应用
实验指导书
陈力平
上海第二工业大学
2014.8
目录
实验一、MDK入门操作 (1)
实验二、GPIO实验(1) (15)
实验二、GPIO实验(2) (23)
实验三、DMA实验 (36)
实验四STM32中断系统实验 (46)
实验五、ADC实验(1) (57)
实验五、ADC实验(2) (69)
实验五、ADC实验(3) (78)
实验六、DAC实验(1) (87)
实验六、DAC实验(2) (95)
实验七、定时器实验(1) (103)
实验七、定时器实验(2) (110)
实验七、定时器实验(3) (119)
实验七、定时器实验(4) (128)
实验七、定时器实验(5) (142)
实验八、USART实验(1) (153)
实验八、USART实验(2) (169)
实验八、USART实验(3) (174)
附录1:STM32F107VR引脚定义表 (184)
附录2:GPIO初始化库函数分析 (192)
附录3:实验箱电路原理图 (199)
实验一、MDK入门操作
一、实验目的
1.掌握MDK集成开发环境应用;
2.学会新建一个MDK工程;
3.学会组织和管理源文件;
4.学会配置MDK参数选项。
二、实验设备
硬件:PC机,嵌入式ARM开发实训平台;
软件:WindowsXP 操作系统,RealViewMDK (Keil μVision4) 集成开发环境,STM32固件库函数等。
三、实验内容与操作步骤
1.创建一个MDK工程
(1)创建一个Demo文件夹
在Demo文件下,分别建立:
a)创建子文件夹User,用于存放源程序;
b)创建子文件夹Project,KEIL工程文件;
在Project下依次创建Obj和List子文件夹,存放编译过程中产生的中间文件。
图1 创建文件夹
(2)复制源代码到Demo文件夹
a)把Libraries文件夹整体复制到Demo文件夹下。这是ST的标准库,是以
源代码形式提供的。
提示:ST的固件库可以从ST官方网站免费下载( stm32f10x_stdperiph_lib.zip),Libraries文件夹通过解压固件库得到,本指导书中的实验所使用的标准库版本为3.1.2,随嵌入式ARM开发实训平台提供。
图2 复制库文件夹
b)复制演示程序到Demo\User文件夹。
提示:演示程序由指导教师提供。
图3 复制演示代码文件
(3)新建一个Keil MDK工程
a)启动Keil uVision4,点击菜单 New uVision Project,新建一个工程,命名为new_project。
图4 创建工程文件
b)选择CPU类型为 STM32F107VC (是ARM开发实训平台选用的CPU型号)。
图5 选择芯片
c)当提示是否复制启动代码时,选择否。
提示:否表示用库中的启动代码,不用Keil软件自带的启动文件代码。
d)右单击Target1/执行Add Group....命令,功能是添加Group ,添加
后参照下图更改名称,目的便于代码管理。
图 6 创建GROUP且更改名称
提示:User : 存放源代码;
RVMDK : 存放启动代码文件(汇编语言);
StdPeriph_Driver : 存放ST标准库函数文件;
CMSIS : 存放CMSIS接口文件(属于库的一部分)。
e)在上述文件夹创建以后,依次添加文件。
参照下图示进行添加:
在User文件夹下添加文件;
文件路径:Demo\Libraries\CMSIS\Core\CM3\startup\arm
图7 右单击菜单命令选项
图8 添加的文件
在RVMDK文件夹下添加文件
文件路径:Demo\Libraries\CMSIS\Core\CM3\startup\arm。
图9 选择汇编文件(*. s)
在stdPeriph_Driver文件夹下添加文件
设备驱动函数文件路径:Demo\Libraries\STM32F10x_StdPeriph_Driver\src
图10 选择设备文件
在CMSIS文件下夹添加文件
CMSIS接口文件路径:Demo\Libraries\CMSIS\Core\CM3
图11 选择接口文件
(4)源代码程序(main.c 文件),应用程序示例。
#include "stm32f10x.h"
/* 为了使用编程书写方便,定义几个控制LED开关的宏*/
#define LED1_ON( ) {GPIO_SetBits(GPIOD, GPIO_Pin_7);}
/* PD7 = 1 点亮LED1 */
#define LED1_OFF( ) {GPIO_ResetBits(GPIOD, GPIO_Pin_7);}
/* PD7 = 0 熄灭LED1 */
#define LED2_ON() {GPIO_SetBits(GPIOD, GPIO_Pin_13);}
/* PD13 = 1 点亮LED2 */
#define LED2_OFF() {GPIO_ResetBits(GPIOD, GPIO_Pin_13);}
/* PD13 = 0 点亮LED2 */
#define LED3_ON() {GPIO_SetBits(GPIOD, GPIO_Pin_3);}
/* PD3 = 1 点亮LED3 */
#define LED3_OFF() {GPIO_ResetBits(GPIOD, GPIO_Pin_3);}
/* PD3 = 0 点亮LED3 */
#define LED4_ON() {GPIO_SetBits(GPIOD, GPIO_Pin_4);}
/* PD4 = 1 点亮LED4 */
#define LED4_OFF() {GPIO_ResetBits(GPIOD, GPIO_Pin_4);}
/* PD4 = 0 点亮LED4 */
/* 延迟函数*/
void Delay(__IO uint32_t nCount)
{ /* __IO 就是volatile, 加上这个后可以避免延迟函数被编译器优化掉*/ for(; nCount != 0; nCount--);
}
/* 主函数*/
int main(void)
{