基于STM32F103嵌入式实验指导书.docx

上传人:b****4 文档编号:5285364 上传时间:2023-05-08 格式:DOCX 页数:29 大小:897.05KB
下载 相关 举报
基于STM32F103嵌入式实验指导书.docx_第1页
第1页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第2页
第2页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第3页
第3页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第4页
第4页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第5页
第5页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第6页
第6页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第7页
第7页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第8页
第8页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第9页
第9页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第10页
第10页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第11页
第11页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第12页
第12页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第13页
第13页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第14页
第14页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第15页
第15页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第16页
第16页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第17页
第17页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第18页
第18页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第19页
第19页 / 共29页
基于STM32F103嵌入式实验指导书.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于STM32F103嵌入式实验指导书.docx

《基于STM32F103嵌入式实验指导书.docx》由会员分享,可在线阅读,更多相关《基于STM32F103嵌入式实验指导书.docx(29页珍藏版)》请在冰点文库上搜索。

基于STM32F103嵌入式实验指导书.docx

基于STM32F103嵌入式实验指导书

实验一、STM32的开发环境与简单工程

一、实验目的

1、熟悉STM32开发板的开发环境;

2、熟悉MDK创建和配置STM32工程项目的基本流程;

3、熟悉STM32官方库的应用;

4、规范编程格式。

二、实验内容

本次实验配置MDK集成开发环境,新建一个简单的工程文件,添加STM32官方库并配置工程,编译运行这个工程文件。

下载已经编译好的文件到开发板中运行。

学会在程序中设置断点,观察系统内存和变量,为调试应用程序打下基础。

三、预备知识

基本单片机硬件知识、单片机软件编程语言、程序创建和调试的基本方法。

四、实验设备及工具

硬件:

STM32开发平台

软件:

STM32官方库;PC机操作系统Windows98、Windows2000或WindowsXP;KEILMDK集成开发环境;串口转usb驱动。

五、实验步骤

1、在准备存放工程文件的目录下创建一新文件夹,命名为Proj_GPIO;在Proj_GPIO文件夹里面分别再创建四个文件夹:

CMSIS、USER、LIB、OBJ。

如图1。

其中CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)用于存放Cortex-M处理器系列的与供应商无关的软件抽象层和启动相关的代码文件;

USER用于存放我们自己编写的代码文件(含自己移植的底层驱动),还有MDK工程;

LIB存放所有的官方底层驱动库文件;

OBJ用于工程输出的过程文件和最终的二进制文件。

图1

2、将官方库STM32F10x_StdPeriph_Lib_V3.5.0.rar解压。

1)把STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下的所有文件和STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下的所有文件都到第一步所创建的CMSIS文件夹中;

2)把STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver目录下的文件(目录inc和scr)复制到第一步创建的LIB文件夹中;

3)把STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录下的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三个文件复制到USER文件夹中。

3、打开MDK软件,新建一个工程Proj_GPIO保存到Proj_GPIO/USER中。

CPU选择STM32F103ZE,如图2;

图2

4、新建一个空文档main.c保存到USER中,然后根据绝对路径将文件对应添加到工程中,如右图。

 

5、配置工程属性,右键点击工程文件中的Target1选择OptionsforTarget‘Target1’打开工程选项对话框。

做如下修改:

1)Output选项勾选CreateHEXFile,然后点击SelectFolderforObjects按钮定位输出文件保存目录到工程的OBJ文件;

2)Listing选项,同样点击SelectFolderforListings定位输出文件保存目录到工程的OBJ文件;

3)C/C++选项,Define中填入STM32F10X_HD,USE_STDPERIPH_DRIVER系统的两个基本宏定义;配置IncludePaths属性,加入工程中包含头文件的目录;如右图

 

4)后面Debug和Utilities两个选项如果使用J-link或者其他调试器则需要做对应的修改,否则不用。

6、根据实验任务硬件原理图编写代码实现四个按键控制led灯亮灭。

1)其中用户按键和LED原理图如下:

图5

2)根据原理图初始化各IO引脚,编写控制函数,然后主函数中调用。

/*********************************************************************

*函数名称:

io_init

*函数功能:

初始化PA0PE2PE3PE4为输入口PE5PB5为输出口

*参数:

*********************************************************************/

voidio_init()

{

GPIO_InitTypeDefgpin_init_struct;

//使能每个IO口的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

gpin_init_struct.GPIO_Pin=GPIO_Pin_0;//PA0引脚

gpin_init_struct.GPIO_Speed=GPIO_Speed_2MHz;//IO速度为2MHz

gpin_init_struct.GPIO_Mode=GPIO_Mode_IPD;//下拉模式

GPIO_Init(GPIOA,&gpin_init_struct);//A口按键

gpin_init_struct.GPIO_Pin=GPIO_Pin_5;

gpin_init_struct.GPIO_Speed=GPIO_Speed_2MHz;

gpin_init_struct.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&gpin_init_struct);//B口led1

GPIO_Init(GPIOE,&gpin_init_struct);//E口led2

gpin_init_struct.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;

gpin_init_struct.GPIO_Speed=GPIO_Speed_2MHz;

gpin_init_struct.GPIO_Mode=GPIO_Mode_IPU;//上拉模式

GPIO_Init(GPIOE,&gpin_init_struct);//E口按键

}

 

 

 

3)代码编写完成后编译链接,通过下载软件将hex文件下载到实验板中运行验证。

 

实验二、ucos操作系统的移植

一、实验目的

1、掌握ucos到STM32的移植方法;

2、熟悉通过C语音处理底层寄存器的技巧;

3、了解STM32在ucos任务切换时的处理;

4、规范编程格式。

二、实验内容

本次实验通过用C语言编写6个操作系统相关函数和用汇编语言编写4个与处理器相关的函数,将实时操作系统µC/OS-Ⅱ移植到芯片STM32F103ZE中,并创建两个用户任务点亮led。

学会操作系统的移植方法,深入掌握嵌入式操作系统µC/OS-Ⅱ在初始化任务和任务调度的实现方法,直观了解实时操作系统的体系结构和设计思想。

三、预备知识

基本单片机硬件知识、单片机软件编程语言、程序创建和调试的基本方法、ucos操作系统的任务调度原理、STM32的寄存器架构。

四、实验设备及工具

硬件:

STM32开发平台

软件:

STM32官方库;PC机操作系统Windows98、Windows2000或WindowsXP;KEILMDK集成开发环境;串口转usb驱动。

五、实验步骤

1、按实验一的步骤新建一个工程Proj2_ucos。

2、将移植好的ucos源代码整个拷贝到我们的新建的工程目录中,然后按对应的文件路径添加到keil工程里(os_dbg.c和os_dbg_r.c只添加一个),如图6和图7。

图6图7

3、配置工程相关属性(与实验一库应用配置一样),记得将ucos的头文件路径添加到工程的includepath上面去,找到stm2f10x_it.c的PendSV_Handler函数注释掉,main文件中将includes.h包含进来,主函数为空,编译通过。

4、在main.c中建立sys_init()函数编写操作系统运行需要的硬件相关初始化(见代码),然后修改stm32f10x_it.c中的系统心跳中断函数并加入头文件includes.h(见代码,)。

 

5、编写用户任务函数和相关的初始化。

/*****************************************************

*函数名称:

led_init

*函数功能:

初始化LED

*参数:

*其他:

********************************************************/

voidled_init()

{

GPIO_InitTypeDefgpin_init_struct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);

gpin_init_struct.GPIO_Pin=GPIO_Pin_5;

gpin_init_struct.GPIO_Speed=GPIO_Speed_2MHz;

gpin_init_struct.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&gpin_init_struct);//B口led1

GPIO_Init(GPIOE,&gpin_init_struct);//E口led2

}

 

/*****************************************************

*函数名称:

my_task

*函数功能:

用户任务

*参数:

*其他:

********************************************************/

voidmy_task()

{

sys_init();

led_init();

OSStatInit();

while

(1)

{

LED1_ON;

LED2_OFF;

OSTimeDly(50);

LED1_OFF;

LED2_ON;

OSTimeDly(100);

}

}

 

6、最后在主函数中创建任务并启动操作系统。

编译并调试运行。

#include"stm32f10x.h"

#include"includes.h"

#defineLED2_ONGPIO_ResetBits(GPIOB,GPIO_Pin_5)

#defineLED2_OFFGPIO_SetBits(GPIOB,GPIO_Pin_5)

#defineLED1_ONGPIO_ResetBits(GPIOE,GPIO_Pin_5)

#defineLED1_OFFGPIO_SetBits(GPIOE,GPIO_Pin_5)

OS_STKtask_stk[128];

voidmy_task(void);

voidled_init(void);

voidsys_init(void);

intmain()

{

OSInit();

OSTaskCreate(my_task,(void*)0,(OS_STK*)&task_stk[127],10);

OSStart();

while

(1);

}

 

实验三、ucos操作系统的任务通信

一、实验目的

1、掌握ucos任务间通信的各种方法;

2、了解嵌入式操作系统任务间可能出现的资源冲突;

3、掌握ucos中信号量和邮箱的应用;

4、规范编程格式。

二、实验内容

本次实验通过用C语言编写基于ucos操作系统下的多个用户任务,并且实现任务间的正确通信。

通过信号量处理公共资源的等待和使用,通过邮箱实现任务间的多个数据变量的传递。

建立正确的操作系统编程理念,深入掌握µC/OS-Ⅱ中信号量与邮箱的创建和使用,了解各任务间通信方法的大概原理及优缺点。

三、预备知识

基本单片机硬件知识、单片机软件编程语言、程序创建和调试的基本方法、ucos操作系统的任务调度原理。

四、实验设备及工具

硬件:

STM32开发平台。

软件:

STM32官方库;PC机操作系统Windows98、Windows2000或WindowsXP;KEILMDK集成开发环境;串口转usb驱动。

五、实验步骤

1、建立基于操作系统µC/OS-Ⅱ的工程Proj3_ucos1,并配置好工程各项属性。

2、创建用户任务文件task.c和task.h两个文件,详细代码如下。

//task.h文件代码

#ifndef_MY_TASK_H

#define_MY_TASK_H

#include"includes.h"

externOS_EVENT*NUM_COUNT;

externvoidmy_task(void);

#endif

代码中,在task1.c中定义两个全局变量NUM_COUNT1和NUM_COUNT2,两个变量在my_task函数里用于记录该任务循环的总次数,区别在与NUM_COUNT1直接操作,而NUM_COUNT2则通过信号量的方法进行操作。

3、在main函数中初始化操作系统后创建一个信号量NUM_COUNT,然后用OSTaskCreate创建两个任务,优先级分别是8和9,两个任务的入口地址都是task1.c文件中的my_task函数。

NUM_COUNT=OSSemCreate

(1);//创建一个信号量

OSTaskCreate(my_task,(void*)0,(OS_STK*)&task1_stk[SIZE_STK-1],9);

OSTaskCreate(my_task,(void*)0,(OS_STK*)&task2_stk[SIZE_STK-1],8);

4、编译通过后调试,在debug界面中,将NUM_COUNT1,NUM_COUNT2两个全局变量加入到变量观察窗口watch1中,然后在task.c的my_task函数里面设置断点,运行并观察两个变量的变化,理解信号量的使用。

5、关于操作系统邮箱的应用由例子工程Proj3_ucos2实现,请自行理解代码。

 

实验四、ucos操作系统的文件系统实现

一、实验目的

1、了解文件系统FATFS的基本实现原理;

2、掌握FATFS的移植步骤;

3、掌握基于ucos中FATFS的应用;

4、掌握STM32对SD卡的读写操作;

5、规范编程格式。

二、实验内容

本实验实现将FAT文件系统移植到ucos中,并基于ucos的文件系统编写用户任务进行测试,通过对文件系统的移植实验深入掌握对嵌入式相关驱动移植的基本步骤,建立正确的嵌入式操作系统驱动移植理念,并且熟悉掌握ucos操作系统下的文件系统的基本应用,了解其优缺点。

三、预备知识

基本单片机硬件知识、单片机软件编程语言、程序创建和调试的基本方法、ucos操作系统的任务调度原理、STM32单片机中的SD卡驱动、文件系统的操作函数、FAT文件系统的基础知识。

四、实验设备及工具

硬件:

STM32开发平台。

软件:

PC机操作系统Windows98、Windows2000或WindowsXP;KEILMDK集成开发环境;串口转usb驱动;STM32官方库;FATFS的官方库;STM32的uart驱动和SD卡驱动源码。

五、实验步骤

1、拷贝实验三的所有代码到新的目录地下,删除USER和OBJ文件夹里工程相关的文件,重新建立实验四的工程并命名为Proj4_FATFS,配置好工程各项属性。

2、在USER文件夹里面创建文件夹myapp,将串口驱动uart和SD卡驱动sdio_sdcard的源代码拷贝到该文件夹里面,并添加到工程中USER。

3、拷贝FAT文件系统源码到myapp文件夹。

在keil的工程中增加一个文件夹FATFS并添加diskio.c、ff.c、cc936.c三个文件到里面,如右图。

4、尝试编译字符表文件cc936.c可能发现出错:

#errordirective:

Thisfileisnotneededincurrentconfiguration.这是因为在ff.h中_CODE_PAGE这个宏的定义值不是936和长文件名宏定义_USE_LFN的值不是1导致的。

修改成对应的值后该文件的编译即可通过(如果用其他字符表文件同理)。

5、移植FAT文件系统需要做的事情。

1)FATFS是一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。

FatFs的编写遵循ANSIC,因此不依赖于硬件平台。

它可以嵌入到便宜的微控制器中,如8051,PIC,AVR,SH,Z80,H8,ARM等等,不需要做任何修改。

FATFS源代码的获取,可以到官网下载http:

//elm-chan.org/fsw/ff/00index_e.html;解压文件会得到两个文件夹,一个是doc文件夹,保存FATFS的一些使用文档和说明。

另一个是src文件夹,保存代码源文件。

FAT文件系统源码和sd卡读写的底层驱动。

2)移植FAT文件系统只需根据硬件中可能接入的物理存储模块对文件系统的底层IO驱动(diskio.c)进行修改,具体需要修改的函数有:

DSTATUSdisk_initialize(BYTE);//存储介质的初始化

DSTATUSdisk_status(BYTE);//读取存储介质的状态

DRESULTdisk_read(BYTE,BYTE*,DWORD,BYTE);//读取数据

DRESULTdisk_write(BYTE,constBYTE*,DWORD,BYTE);//写入数据

DRESULTdisk_ioctl(BYTE,BYTE,void*);//读取存储介质文件系统相关信息

DWORDget_fattime(void);//返回文件系统的时间

3)diskio.c文件中添加头文件sdio_sdcard.h、ff.h,增加SD卡的驱动号0如下:

/*Correspondencebetweenphysicaldrivenumberandphysicaldrive.*/

#defineSD_CARD0

#defineATA1

#defineMMC2

#defineUSB3

 

4)diskio.c五个函数具体代码:

DSTATUSdisk_initialize(

BYTEdrv/*Physicaldrivenmuber(0..)*/

{

switch(drv)

{

caseSD_CARD:

//SD卡

if(SD_Init()==SD_OK)

{

returnRES_OK;

}

else

{

returnRES_NOTRDY;

}

}

returnRES_NOTRDY;

}

DSTATUSdisk_status(

BYTEdrv/*Physicaldrivenmuber(0..)*/

{

switch(drv)

{

caseSD_CARD:

//SD卡

if(SD_GetStatus()==SD_TRANSFER_ERROR)

{

returnSTA_NOINIT;

}

else

{

returnSTA_PROTECT;

}

default:

returnSTA_NODISK;

}

}

DRESULTdisk_read(

BYTEdrv,/*Physicaldrivenmuber(0..)*/

BYTE*buff,/*Databuffertostorereaddata*/

DWORDsector,/*Sectoraddress(LBA)*/

BYTEcount/*Numberofsectorstoread(1..255)*/

{

switch(drv){

caseSD_CARD:

for(;count>0;count--)

{

if(SD_ReadBlock(buff,sector<<9,_MAX_SS)!

=SD_OK)

{

break;

}

sector++;

buff+=_MAX_SS;

/*WaituntilendofDMAtransfer*/

SD_WaitReadOperation();

/*CheckiftheTransferisfinished*/

while(SD_GetStatus()!

=SD_TRANSFER_OK);

}

if(count==0)

{

returnRES_OK;

}else{

returnRES_ERROR;

}

default:

returnRES_NOTRDY;

}

}

#if_READONLY==0

DRESULTdisk_write(

BYTEdrv,/*Physicaldrivenmuber(0..)*/

constBYTE*buff,/*Datatobewritten*/

DWORDsector,/*Sectoraddress(LBA)*/

BYTEcount/*Numberofsectorstowrite(1..255)*/

{

switch(drv){

caseSD_CARD:

for(;count>0;count--)

{

if(SD_WriteBlock((uint8_t*)buff,sector<<9,_MAX_SS)!

=SD_OK)

{

break;

}

sector++;

buff+=_MAX_SS;

/*WaituntilendofDMAtransfer*/

SD_WaitWriteOperation();

/*CheckiftheTransferisfinished*/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2