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