实验1跑马灯与按键实验、实验目的1.初步学会MDK5环境下的嵌入式软件开发。2.学习STM32微控制器通用IO的编程方法。3.学会使用标准外围固件库编程。二、实验原理GPIO功能描述:每个GPIO端口有两个32位配置寄存器(GPIOxCRL,GPIOxCRH),两个32位数据寄存器(GPIOxIDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOxBSRR),一个16位复位寄存器(GPIOxBRR)和一个32位锁定寄存器(GPIOxLCKR)。根据数据手册中列出的每个IO端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。输入浮空输入上拉输入下拉模拟输入开漏输出推挽式输出推挽式复用功能开漏复用功能每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOxBSRR和GPIOxBRR寄存器允许对任何GPIO寄存器的读/更改的独立访问:这样,在读和更改访问之间产生IRQ时不会发生危险。下图给出了一个VO端口位的基本结构。VoD、模拟输入至片上外设开关丁-复用功能输入-开/关1、读出VDOTTL肖特基保护大开/关、触发器二极管>L输入驱动器VSS口vo引脚写入/嘉输出驱动器VDD大保护二极管+P-MOS输出Vss控制N-MOS读/写1Vss推挽、开漏复用功能输出或关闭米自片上外设ai14781
实验 1 跑马灯与按键实验 一、实验目的 1. 初步学会 MDK5 环境下的嵌入式软件开发。 2. 学习 STM32 微控制器通用 IO 的编程方法。 3. 学会使用标准外围固件库编程。 二、实验原理 GPIO 功能描述: 每个 GPIO 端口有两个 32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个 32 位数据寄存器 (GPIOx_IDR 和 GPIOx_ODR),一个 32 位置位/复位寄存器(GPIOx_BSRR),一个 16 位复位寄存器 (GPIOx_BRR)和一个 32 位锁定寄存器(GPIOx_LCKR)。 根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配 置成多种模式。 — 输入浮空 — 输入上拉 — 输入下拉 — 模拟输入 — 开漏输出 — 推挽式输出 — 推挽式复用功能 — 开漏复用功能 每个 I/O 端口位可以自由编程,然而 I/0 端口寄存器必须按 32 位字被访问(不允许半字或字节访 问)。GPIOx_BSRR 和 GPIOx_BRR 寄存器允许对任何 GPIO 寄存器的读/更改的独立访问;这样,在 读和更改访问之间产生 IRQ 时不会发生危险。下图给出了一个 I/O 端口位的基本结构
GPIO库函数介绍:表1函数名描述GPIO_Delnit将外设GPIOx寄存器重设为缺省值GPIO_AFIODelnit将复用功能(重映射事件控制和EXTI设置)重设为缺省值GPIO_Init根据GPIOInitStruct中指定的参数初始化外设GPIOx寄存器GPIO Structlnit把GPIOInitStruct中的每一个参数按缺省值填入GPIO ReadlnputDataBit读取指定端口管脚的输入GPIOReadInputData读取指定的GPIO端口输入GPIO_ReadOutputDataBit读取指定端口管脚的输出GPIO_ReadOutputData读取指定的GPIO端口输出GPIO_SetBits设置指定的数据端口位GPIO_ResetBits清除指定的数据端口位GPIO WriteBit设置或者清除指定的数据端口位GPIOWrite向指定GPIO数据端口写入数据GPIO_PinLockConfig锁定GPIO管脚设置寄存器GPIO EventOutputConfig选择GPIO管脚用作事件输出GPIOEventOutputCmd使能或者失能事件输出GPIOPinRemapConfig改变指定管脚的映射GPIO_EXTILineConfig选择GPIO管脚用作外部中断线路表2.函数GPIOInit函数名GPIO Init函数原形void GPIO Init(GPIO_TypeDef* GPIOx, GPIO InitTypeDef* GPIO InitStruct)功能描述根据GPIOInitStruct中指定的参数初始化外设GPIOx寄存器输入参数1GPIOx:X可以是A,B,C,D或者E,来选择GPIO外设输入参数2GPIOInitStruct:指向结构GPIOInitTypeDef的指针,包含了外设GPIO的配置信息参阅Section:GPIOInitTypeDef查阅更多该参数允许取值范围输出参数无无返回值无先决条件无被调用函数三、实验内容1.熟悉MDK5软件开发环境,认识实验板并建立工程。2.使STM32F103开发板上的LED灯交替闪烁,实现类似跑马灯的效果。3.通过按键控制STM32F103开发板上的LED灯和蜂鸣器四、实验设备1、硬件部分:PC计算机(宿主机)、STM32F103开发板。2.软件部分:MDKKEIL软件
GPIO 库函数介绍: 表1 函数名 描述 GPIO_DeInit 将外设 GPIOx 寄存器重设为缺省值 GPIO_AFIODeInit 将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值 GPIO_Init 根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器 GPIO_StructInit 把 GPIO_InitStruct 中的每一个参数按缺省值填入 GPIO_ReadInputDataBit 读取指定端口管脚的输入 GPIO_ReadInputData 读取指定的 GPIO 端口输入 GPIO_ReadOutputDataBit 读取指定端口管脚的输出 GPIO_ReadOutputData 读取指定的 GPIO 端口输出 GPIO_SetBits 设置指定的数据端口位 GPIO_ResetBits 清除指定的数据端口位 GPIO_WriteBit 设置或者清除指定的数据端口位 GPIO_Write 向指定 GPIO 数据端口写入数据 GPIO_PinLockConfig 锁定 GPIO 管脚设置寄存器 GPIO_EventOutputConfig 选择 GPIO 管脚用作事件输出 GPIO_EventOutputCmd 使能或者失能事件输出 GPIO_PinRemapConfig 改变指定管脚的映射 GPIO_EXTILineConfig 选择 GPIO 管脚用作外部中断线路 表2. 函数 GPIO_Init 函数名 GPIO_Init 函数原形 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 功能描述 根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器 输入参数 1 GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设 输入参数 2 GPIO_InitStruct:指向结构 GPIO_InitTypeDef 的指针,包含了外设 GPIO 的配置信息 参阅 Section:GPIO_InitTypeDef 查阅更多该参数允许取值范围 输出参数 无 返回值 无 先决条件 无 被调用函数 无 三、实验内容 1. 熟悉 MDK5 软件开发环境,认识实验板并建立工程。 2. 使 STM32F103 开发板上的 LED 灯交替闪烁,实现类似跑马灯的效果。 3. 通过按键控制 STM32F103 开发板上的 LED 灯和蜂鸣器 四、实验设备 1. 硬件部分:PC 计算机(宿主机)、STM32F103 开发板。 2. 软件部分:MDK KEIL 软件
五、实验步骤1.新建基于固件库的MIDK5工程模板a).建立工作目录和子目录,复制库文件在电脑D盘建立一个文件夹“E1”(也可自行命名),并在该文件夹下创建6个子文件夹,如图1所示。Software(D)>实验1IO实验>DCOREHARDWAOBJSYSTEMUSERSTM32F1REOx_FWLib图1新建文件夹其中:CORE用来存放固件库必须的核心文件和启动文件:OBJ用来存放编译过程文件以及hex文件;STM32F10xFWLib用来存放ST官方提供的外设驱动固件库文件:SYSTEM用来存放常用的共用代码,包含Systick延时函数,IO口位带操作以及串口相关函数。一般不需要修改即可在任意STM32F10x系列芯片使用;USER除了用来存放MDK工程文件外,还用来存放主函数文件main.c,以及其他包括系统时初始化函数Systemlnit相关的定义、部分中断服务函数等:HARDWARE用来存放实验的外设驱动代码,他的实现是通过调用FWLib下面的固件库文件实现的。然后开始复制文件。打开STM32官方固件库包,文件夹名为STM32F10x_StdPeriphLib_V3.5.0。(1)复制内核文件和驱动支持文件、启动文件。将固件库LibrarieslCMSISICM3ICoreSupport目录下的两个文件core_cm3.c和core_cm3.h复制到我们创建的CORE文件夹下面。将固件库LibrariesICMSISICM3\DeviceSupport/STISTM32F10x目录下的三个文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到USER文件夹下面。将固件库LibrariesICMSISICM3/DeviceSupportlSTISTM32F1Oxlstartuplarm下面的startup_stm32f10x_hd.s文件复制到CORE下面。不同容量的芯片使用不同的启动文件,我们的芯片STM32F103ZET6是大容量芯片,所以选择这个启动文件。(2)复制设备驱动程序。将固件库LibrarieslSTM32F10xStdPeriphDriver下面的src,inc文件夹全部复制到我们的STM32F10OxFWLib文件夹下面。src存放的是固件库的.c文件,inc存放的是对应的.h文件。(3)复制外设中断函数文件和固件库配置文件。将固件库ProjectlSTM32F10x_StdPeriph_Template下面的3个文件stm32f10x_conf.h,stm32f10x_it.c,stm32f10xit.h复制到USER目录下面。(4)将SYSTEM下的三个文件夹delay,sys,usart全部复制到我们建立的“EI\SYSTEMI”目录下。b).建立和配置工程文件打开Keil,点击菜单项Project->NewμVisionProject,将工程命名为LED,保存在USER文件夹下。按保存后弹出选择CPU的窗口,我们的开发板使用的STM32芯片型号为STM32F103ZET6所以这里选择STMicroelectronics->STM32F1Series->STM32F103->STM32F103ZE,如图所示
五、实验步骤 1. 新建基于固件库的 MDK5 工程模板 a).建立工作目录和子目录,复制库文件 在电脑 D 盘建立一个文件夹“E1”(也可自行命名),并在该文件夹下创建 6 个子文件夹,如图 1 所示。 图 1 新建文件夹 其中: CORE 用来存放固件库必须的核心文件和启动文件; OBJ 用来存放编译过程文件以及 hex 文件; STM32F10x_FWLib 用来存放 ST 官方提供的外设驱动固件库文件; SYSTEM 用来存放常用的共用代码,包含 Systick 延时函数,IO 口位带操作以及串口相关函数。 一般不需要修改即可在任意 STM32F10x 系列芯片使用; USER 除了用来存放 MDK 工程文件外,还用来存放主函数文件 main.c,以及其他包括系统时钟 初始化函数 SystemInit 相关的定义、部分中断服务函数等; HARDWARE 用来存放实验的外设驱动代码,他的实现是通过调用 FWLib 下面的固件库文件实 现的。 然后开始复制文件。打开 STM32 官方固件库包,文件夹名为 STM32F10x_StdPeriph_Lib_V3.5.0。 (1)复制内核文件和驱动支持文件、启动文件。 将固件库 Libraries\CMSIS\CM3\CoreSupport 目录下的两个文件 core_cm3.c 和 core_cm3.h 复制 到我们创建的 CORE 文件夹下面。 将固件库 Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 目录下的三个文件 stm32f10x.h, system_stm32f10x.c,system_stm32f10x.h,复制到 USER 文件夹下面。 将固件库 Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 下面的 startup_stm32f10x_hd.s 文件复制到 CORE 下面。不同容量的芯片使用不同的启动文件,我们的芯片 STM32F103ZET6 是大容量芯片,所以选择这个启动文件。 (2)复制设备驱动程序。 将固件库 Libraries\STM32F10x_StdPeriph_Driver 下面的 src,inc 文件夹全部复制到我们的 STM32F10x_FWLib 文件夹下面。src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件。 (3)复制外设中断函数文件和固件库配置文件。 将固件库 Project\STM32F10x_StdPeriph_Template 下面的 3 个文件 stm32f10x_conf.h , stm32f10x_it.c,stm32f10x_it.h 复制到 USER 目录下面。 (4)将 SYSTEM 下的三个文件夹 delay,sys,usart 全部复制到我们建立的“E1\ SYSTEM\”目 录下。 b).建立和配置工程文件 打开 Keil,点击菜单项 Project->New µVision Project,将工程命名为 LED,保存在 USER 文件夹 下。 按保存后弹出选择 CPU 的窗口,我们的开发板使用的 STM32 芯片型号为 STM32F103ZET6, 所以这里选择 STMicroelectronics->STM32F1 Series->STM32F103-> STM32F103ZE,如图所示
Select Device for Target Target 1'.XDeviceSoftware Packs立STMcroelectronicsVendor:Device:STM32F103ZEARMToolsetSeardDescriptiorSTM32F103VGSTMicroelectronics'STM32F1 senes of maAneedsofalaroevarietyofapplicnendSTM32F103ZCnsumermarkets.HighpefomancewthfirstclassperpheralsanSTM32F103ZDlowowowoltationdwhtegrationataccessblepriceswithasimplearchitectureaSTM32F103ZERSTM32F103ZFanenrhedicalandhandheldeoumentindustrialappcations.PLCsSTM32F103ZGvmymSTM32F105ndhomeaudioeguipmert由STM32F107LCDparallelinteeface,8080/6800modesVtolerartI/Os-Timer with quadrature (incremental) encoderinput-OECaneelKelp器件选择点击OK,会弹出ManageRun-TimeEnvironment对话框,点击Cancel即可,得到如图所示界面。图DA实验1IO实验AUSERILED.IVProjxFileEditToolsSvcsWindowProjectFlasDebuPeripoheralsHelg国美助心的年年佳##国TargettAEOProjedtD区Project:LED由Target1工程初步建立接下来对工程组进行管理,将前面复制的固件库相关文件加入到我们的工程中去。右键单击Targetl,选择ManageProjectItems。XManageProjectItemsProjeot Itms rolders/Estensioms|BoksX++Projed Targets:X+GroupsX++FesTagetirceGroup1双击可修改新建删除Aod FieSet as Cumert TargetAdd Fies as lnageCancelHelp组管理
器件选择 点击 OK,会弹出 Manage Run-Time Environment 对话框,点击 Cancel 即可,得到如图所示界面。 工程初步建立 接下来对工程组进行管理,将前面复制的固件库相关文件加入到我们的工程中去。右键单击 Target1,选择 Manage Project Items。 组管理
在ProjectItems选项下ProjectTargets一栏,将Target名字修改为LED,然后在Groups栏删掉SourceGroupl,建立四个Groups:USER,CORE,FWLIB,SYSTEM。然后依次往每个Group里面添加我们需要的文件,选择FWLIB,然后点击右边的AddFiles,定位到我们建立的目录STM32F10xFWLib/src下面,将里面所有的文件选中(Ctrl+A),然后点击Add。同样的方法,将Groups定位到COREUSER和SYSTEM下面,添加需要的文件(文件路径在每个Group名字对应的文件夹内)。CORE下面需要添加的文件为core_cm3.c,startup_stm32f10x_hd.s(注意,默认添加的时候文件类型为.c,也就是添加startup_stm32f10x_hd.s的时候,你需要选择文件类型为Allfiles才能看得到这个文件),USER下面需要添加的文件为stm32f10x_it.c,system_stm32f10x.c,SYSTEM下面需要添加的文件为sys.c,delay.c,usart.c。然后点击OK,可以看到如图所示我们的Target名字以及Groups情况。(FWLIB组没有展开)图D:/实验1IO实验\USERVLED.uvprojx-VisionFileEditViewProject FlashDebug Peripherals ToolsSVCs Window HelpCDAa中产电#民连庭临LEDV人Proiect中日日Project LED白LEDBUSERstm32f10x_it.csystem_stm32f10x.cCOREcore_cm3.cstartup_stm32710x_hd.sFWLIBSYSTEM delay.csys.cusart.c接下来进行配置,点击“OptionsforTarget"按钮,选择“Output”选项卡,如图所示,选中“CreateHEXFile”,表示要生成目标文件。HEX文件是下载到目标板中的编译后的二进制文件。然后点击“SelectFolderforObjects”,选择目录为我们上面新建的OBJ目录。Optionsfor Target"LEDDevice|TargetDutputListing|UserIC/C+AsnLinker Debug |UeilitiesSelectFolderforObijectsNameof ExecutableLEDCreateExecutable:ObjectsVLEDCreate Batch FleDebug HfomationCreate HEX FleBrowseIifomationCCreateLUbrary:NObjects\LEDIb01DefaultsHelp下面我们要告诉MDK,在哪些路径之下搜索需要的头文件,也就是头文件目录。回到配置窗口选择“C/C++”选项卡,点击IncludePaths右边的按钮。弹出添加path的对话框,然后我们将下图中的6个目录添加进去
在 Project Items 选项下 Project Targets 一栏,将 Target 名字修改为 LED,然后在 Groups 栏删掉 Source Group1,建立四个 Groups:USER,CORE,FWLIB,SYSTEM。 然后依次往每个 Group 里面添加我们需要的文件,选择 FWLIB,然后点击右边的 Add Files, 定 位到我们建立的目录 STM32F10x_FWLib/src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add。 同样的方法,将 Groups 定位到 CORE,USER 和 SYSTEM 下面,添加需要的文件(文件路径在每个 Group 名字对应的文件夹内)。CORE 下面需要添加的文件为 core_cm3.c,startup_stm32f10x_hd.s(注 意,默认添加的时候文件类型为.c,也就是添加 startup_stm32f10x_hd.s 的时候,你需要选择文件类型 为 All files 才能看得到这个文件),USER 下面需要添加的文件为 stm32f10x_it.c,system_stm32f10x.c, SYSTEM 下面需要添加的文件为 sys.c,delay.c,usart.c。 然后点击 OK,可以看到如图所示我们的 Target 名字以及 Groups 情况。(FWLIB 组没有展开) 接下来进行配置,点击“Options for Target” 按钮,选择“Output”选项卡,如图所示,选中 “Create HEX File”,表示要生成目标文件。HEX 文件是下载到目标板中的编译后的二进制文件。然 后点击“Select Folder for Objects”,选择目录为我们上面新建的 OBJ 目录。 下面我们要告诉 MDK,在哪些路径之下搜索需要的头文件,也就是头文件目录。回到配置窗口, 选择“C/C++”选项卡,点击 Include Paths 右边的按钮。弹出添加 path 的对话框,然后我们将下图 中的 6 个目录添加进去