
实验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 个目录添加进去

Options for Target"LEDC/C-AsnLinker Debug UtilitiesDeviceTargetOutputListingUserPreprocesor.SumbolsFolderSetup7XDefneDX+Setup Compler Include Patha:UndefineLanguagEExecudela?SYSTEM/sysOptimizatidLSYSTEMusart厂Oplim厂SpitL注意,是inc目录,不是src目录OneEIncude国PathsMiscControlsOKCancelComplerAcontrolVstingOKCancelDefaultsHelp图 7 配置之后按“OK”保存对路径的配置。然后在“C/C++”选项卡下Define后面的输入框中输入两个宏定义:STM32F10XHD,USESTDPERIPHDRIVER。STM32F10XHD表示使用的是高密度的STM32,USESTDPERIPHDRIVER表示使用库函数外设驱动。点击“OK”完成对整个选项的修改。现在分组和配置都完成了,就有了一个开发的模板,下一步就可以开始编写自已的代码了。c).编写代码点击File->New新建文件,将该文件另存为“main.c”,保存到USER文件夹中。点击打开ManageProjectItems,将其main.c文件加入到USER分组中,就可以输入程序代码了。图DA实验1IO实验\USERVLED.uvprojx-μVisionFileEditViewProjectFlashDebugPeripheralsToolsSvCsWindowHelp国品心吧合中良推接店国西舞印D衣品#Project4Bmain.cProject: LED8LED白USER stm32f10x_it.csvstem.stm32f10x.cmain.cEOCOREcore_cm3,.cstartup_stm3210x_hd.sFWLIBBSYSTEMI delay.Dsseusart.编辑和保存文件并添加到分组
图 7 配置之后按“OK”保存对路径的配置。然后在“C/C++”选项卡下 Define 后面的输入框中输入 两个宏定义:STM32F10X_HD,USE_STDPERIPH_DRIVER。 STM32F10X_HD 表示使用的是高密度的 STM32,USE_STDPERIPH_DRIVER 表示使用库函数 外设驱动。点击“OK”完成对整个选项的修改。 现在分组和配置都完成了,就有了一个开发的模板,下一步就可以开始编写自己的代码了。 c).编写代码 点击 File->New 新建文件,将该文件另存为“main.c”,保存到 USER 文件夹中。点击 打开 Manage Project Items,将其 main.c 文件加入到 USER 分组中,就可以输入程序代码了。 编辑和保存文件并添加到分组

2.跑马灯实验任何一个单片机,最简单的外设莫过于IO口的高低电平控制了,本次实验将通过一个经典的跑马灯程序,使大家了解到STM32F1的IO口作为输出使用的方法。我们将通过代码实现两个LED交替闪烁,类似跑马灯的效果。a)硬件设计本实验用到的硬件只有LED(DSO和DS1),其电路在开发板上默认是已经连接好了的,DSO接PB5,DS1接PE5,所以在硬件上不需要动任何东西。其连接原理图如图5所示。LEDOPB5135PB5/2C1SMBAI/SPI3MOSI/I2S3_SDPE5LED1PE5/TRACED2/FSMCA21VCC3.3LEDOR15DSOLED510[LED]R19FDDSI510?b)软件实现找到刚才建立的工程文件夹,在该文件夹下面新建一个HARDWARE的文件夹,用来存储以后与硬件相关的代码,然后在HARDWARE文件夹下新建一个LED文件夹,用来存放与LED相关的代码。然后我们打开USER文件夹下的LED.uvprox工程,按智按钮新建一个文件,然后保存在HARDWARE->LED文件夹下面,保存为led.c。在该文件中输入如下代码#include"led.h"I/初始化PB5和PE5为输出口.并使能这两个口的时钟I/LEDIO初始化void LED Init(void)GPIO_InitTypeDefGPIO_InitStructure;RCCAPB2PeriphClockCmd(RCCAPB2PeriphGPIOB|RCCAPB2PeriphGPIOE,ENABLE)//使能PB,PE端口时钟GPIOInitStructure.GPIOPin=GPIOPin5:I/LEDO-->PB.5端口配置1/推输出GPIOInitStructure.GPIOMode=GPIOModeOutPP,GPIOInitStructure.GPIOSpeed=GPIOSpeed50MHz.//IO口速度为50MHzGPIO Init(GPIOB,&GPIO_InitStructure);/根据设定参数配置GPIO//PB.5输出高GPIOSetBits(GPIOBGPIOPin5)GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//LED1-->PE.5端口配置,推挽输出GPIOInit(GPIOE,&GPIOInitStructure)GPIO SetBits(GPIOE,GPIO_Pin_5);/PE.5输出高按同样的方法,新建一个“led.h”文件,也保存在LED文件夹下面。在led.h中输入如下代码并保存。#ifndefLED H#defineLEDH#include"sys.h"/LED端口定义#defineLEDOPBout(5)//DSO#defineLEDIPEout(5)//DS1voidLEDInit(void);//初始化#endif
2. 跑马灯实验 任何一个单片机,最简单的外设莫过于 IO 口的高低电平控制了,本次实验将通过一个经典的跑 马灯程序,使大家了解到 STM32F1 的 IO 口作为输出使用的方法。我们将通过代码实现两个 LED 交 替闪烁,类似跑马灯的效果。 a) 硬件设计 本实验用到的硬件只有 LED(DS0 和 DS1),其电路在开发板上默认是已经连接好了的,DS0 接 PB5,DS1 接 PE5,所以在硬件上不需要动任何东西。其连接原理图如图 5 所示。 b) 软件实现 找到刚才建立的工程文件夹,在该文件夹下面新建一个 HARDWARE 的文件夹,用来存储以后 与硬件相关的代码,然后在 HARDWARE 文件夹下新建一个 LED 文件夹, 用来存放与 LED 相关 的代码。 然后我们打开 USER 文件夹下的 LED.uvprojx 工程,按 按钮新建一个文件,然后保存在 HARDWARE->LED 文件夹下面,保存为 led.c。在该文件中输入如下代码 #include "led.h" //初始化 PB5 和 PE5 为输出口.并使能这两个口的时钟 //LED IO 初始化 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能 PB,PE 端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为 50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数配置 GPIO GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1->PE.5 端口配置,推挽输出 GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 } 按同样的方法,新建一个“led.h”文件,也保存在 LED 文件夹下面。在 led.h 中输入如下代码并 保存。 #ifndef _LED_H #define _LED_H #include "sys.h" //LED 端口定义 #define LED0 PBout(5)// DS0 #define LED1 PEout(5)// DS1 void LED_Init(void);//初始化 #endif

然后在ManageProjectItems里面新建一个HARDWARE的组,并把led.c加入到这个组里面,然后用之前介绍的方法,在配置窗口的“C/C++”选项卡中将led.h头文件的路径加入到工程里面。XManage Project ItemsProject Items [rolders/Extensions BooksX++Project Targets:X→Groups:X+Fles:JUSERLEDled.cHARDWARESYSTEMCOREFWLIBAdd Files.Set as Cument TarueAdd Fles as Image.OKCancelHelpOptionsforTarget'LEDDevie Target Output Listing UserC/C++AsLinkerDebugUtilitiesrSvmbolFolderSetupDefinSetup ComplerInclude PathsX+UndefineLWUSERNCORELanguagSTM32F10_FWLbVncASYSTEMdelay2SYSTEMsysOptimizaticOptinRDWAREVLEDSpltCFOneE3OKACastnngOKHelpCancelDefaalts回到主界面,在main函数中编写如下代码并保存。#include"led.h"#include"delay.h"#include"sys.h"int main(void)delay_initO;I/延时函数初始化LED_InitO,/初始化与LED连接的硬件接口while(1)1LED0-0,LEDI=1;delay_ms(300);//延时300msLED0-1;
然后在 Manage Project Items 里面新建一个 HARDWARE 的组,并把 led.c 加入到这个组里面,然 后用之前介绍的方法,在配置窗口的“C/C++”选项卡中将 led.h 头文件的路径加入到工程里面。 回到主界面,在 main 函数中编写如下代码并保存。 #include "led.h" #include "delay.h" #include "sys.h" int main(void) { delay_init(); //延时函数初始化 LED_Init(); //初始化与 LED 连接的硬件接口 while(1) { LED0=0; LED1=1; delay_ms(300); //延时 300ms LED0=1;

LED1=0.delay_ms(300)://延时300msmain()函数非常简单,先调用delayinitO初始化延时,然后调用LEDInit()来初始化GPIOB.5和GPIOE.5为输出。最后在死循环里面实现LEDO和LED1交替闪烁,间隔为300mS。总结IO操作步骤为:使能IO口时钟,调用函数为RCC_APB2PeriphClockCmdO)。不同的10组,调用的时钟使能函数不一样。初始化IO参数,调用函数GPIO_InitO;操作I0口,输出高低电平c)编译并下载按Build编译工程,编译成功后显示没有错误和警告,并且在OBJ目录下面生成了hex文件(LED.hex).将USB转MINIUSB线一端连接计算机,一端连接开发板USB232端口(USB转串口),打开开发板电源开关,开发板上PWR指示灯会亮,表示电源接通。打开上位机软件flymcu,点击菜单栏的搜索串口,自动找到CH340虚拟串口,波特率设置为115200,然后选择上一步编译生成的Hex文件(LED.hex),并进行如图所示设置后,点击“开始编程”下载代码到开发板,即可看到程序运行的结果。FlyMcuVo.188--单片机在线编程专家--www.mcuisp.comOx系统(X)帮助(Y)Language搜素串口(V)Port:COM3bps:76800www.mcuisp.com编程器(W)关于(Z)..联机下载拍的程序文件:C:Users/Administrator/Desktop|Template|OBJ|Template.hex编程前重装文件国STMISP免费STMIAPNXPISPEP968_RS232手持万用编程器网杭贴编程后执行开始编程(P)使用Ramis连续烧录模式读器件信息(R)读FLASH清除芯片(2)选项字节区:口编程到FLASH时写选项字节设定选项字节等DTR的低电平复位,RTS高电平进BootLoader
LED1=0; delay_ms(300); //延时 300ms } } main()函数非常简单,先调用 delay_init()初始化延时,然后调用 LED_Init()来初始化 GPIOB.5 和 GPIOE.5 为输出。最后在死循环里面实现 LED0 和 LED1 交替闪烁,间隔为 300ms。 总结 IO 操作步骤为: 使能 IO 口时钟,调用函数为 RCC_APB2PeriphClockCmd()。 不同的 IO 组,调用的时钟使能函数不一样。 初始化 IO 参数,调用函数 GPIO_Init(); 操作 IO 口,输出高低电平 c) 编译并下载 按 Build 编译工程,编译成功后显示没有错误和警告,并且在 OBJ 目录下面生成了 hex 文件 (LED.hex)。 将 USB 转 MINIUSB 线一端连接计算机,一端连接开发板 USB_232 端口(USB 转串口),打开 开发板电源开关,开发板上 PWR 指示灯会亮,表示电源接通。 打开上位机软件 flymcu,点击菜单栏的搜索串口,自动找到 CH340 虚拟串口,波特率设置为 115200,然后选择上一步编译生成的 Hex 文件(LED.hex),并进行如图所示设置后,点击 “开始编 程”下载代码到开发板,即可看到程序运行的结果

3.按键控制实验本次实验,我们将通过3个按钮(KEYUP、KEYO和KEY1),来控制开发板上的2个LED(DSO和DS1)和蜂鸣器,其中KEY_UP控制蜂鸣器,按一次叫,再按一次停:KEY1控制DS1,按一次亮,再按一次灭:KEYO则同时控制DSO和DS1,按一次,他们的状态就翻转一次。a)硬件设计本实验用到的硬件资源有:1)指示灯DSO、DS12)蜂鸣器3)3个按键:KEYO、KEY1和KEYUP。LED(DSO和DS1),其电路在开发板上默认是已经连接好了的,DSO接PB5,DS1接PE5,所以在硬件上不需要动任何东西。其连接原理图如图所示。LEDOPB5135PB5/I2C1SMBAI/SPI3MOSI/I2S3SDLED1PE54PE5/TRACED2/FSMCA21VCC3.3LEDOR15DSOED1510[LED]R19DS1LED1510蜂鸣器在硬件上也是直接连接好了的,不需要经过任何设置,直接编写代码就可以了。蜂鸣器的驱动信号连接在STM32的PB8上。如图所示:BEEPPB8139PB8/TIM4CH3/SDIOD4VCC3.3BEEPQ1R31BEEPVBEEPS80501KR3310KGND按键KEYO连接在PE4上、KEY1连接在PE3上、KEYUP连接在PAO上。如下图所示:PE3KEYIKEYUPPE3/TRACED0/FSMCA19WKUPPE4KEYOVCC3.3PE4/TRACED1/FSMCA20WKUPPAO34KEYOPA0-WKUP/USART2CTSKEYOKEYIKEYI这里需要注意的是:KEYO和KEY1是低电平有效的,而KEYUP是高电平有效的,并且外部都没有上下拉电阻,所以,需要在STM32F1内部设置上下拉。b)软件实现在刚才LED跑马灯实验的基础上新建按键实验工程。复制上一章的工程文件夹E1,并取名为E2,然后打开USER目录,把目录下面工程LED.uvprojx重命名为KEY.uvprojx。在ProjectItems选项下ProjectTargets一栏,将Target名字修改为KEY
3. 按键控制实验 本次实验,我们将通过 3 个按钮(KEY_UP、KEY0 和 KEY1),来控制开发板上的 2 个 LED(DS0 和 DS1)和蜂鸣器,其中 KEY_UP 控制蜂鸣器,按一次叫,再按一次停;KEY1 控制 DS1,按一次亮,再按 一次灭;KEY0 则同时控制 DS0 和 DS1,按一次,他们的状态就翻转一次。 a) 硬件设计 本实验用到的硬件资源有: 1) 指示灯 DS0、DS1 2) 蜂鸣器 3) 3 个按键:KEY0、KEY1 和 KEY_UP。 LED(DS0 和 DS1),其电路在开发板上默认是已经连接好了的,DS0 接 PB5,DS1 接 PE5,所以在 硬件上不需要动任何东西。其连接原理图如图所示。 蜂鸣器在硬件上也是直接连接好了的,不需要经过任何设置, 直接编写代码就可以了。蜂鸣器 的驱动信号连接在 STM32 的 PB8 上。如图所示: 按键 KEY0 连接在 PE4 上、KEY1 连接在 PE3 上、KEY_UP 连接在 PA0 上。如下图所示: 这里需要注意的是:KEY0 和 KEY1 是低电平有效的,而 KEY_UP 是高电平有效的,并且外部都没 有上下拉电阻,所以,需要在 STM32F1 内部设置上下拉。 b) 软件实现 在刚才 LED 跑马灯实验的基础上新建按键实验工程。复制上一章的工程文件夹 E1,并取名为 E2, 然后打开 USER 目录,把目录下面工程 LED.uvprojx 重命名为 KEY.uvprojx。在 Project Items 选 项下 Project Targets 一栏,将 Target 名字修改为 KEY