《嵌入式系统设计(STM32)第3讲ppt课件.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统设计(STM32)第3讲ppt课件.ppt(69页珍藏版)》请在三一办公上搜索。
1、第3讲 GPIO,GPIO-General purpose input/output,主要内容,3.1 GPIO结构3.2 GPIO寄存器3.3 GPIO函数3.4 GPIO编程举例3.5 练习题3.6 实验,GPIO的功能,(1)最基本的功能是可以驱动LED、产生PWM、驱动蜂鸣器等。(2)具有单独的位设置或位清除,编程简单。端口配置好后,只需GPIO_SetBits(GPIOx, GPIO_Pin_x) 就可以实现对GPIOx的Pinx位为高电平; GPIO_ResetBits(GPIOx, GPIO_Pin_x)就可以实现对GPIOx的Pinx位为低电平。(3)具有外部中断/唤醒能力,端
2、口配置成输入模式时,具有外部中断能力。(4)具有复用功能,复用功能的端口兼有I/O功能等。(5)软件重新映射I/O复用功能:为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些服用功能重新映射到其他一些引脚上。这可以通过软件配置到相应的寄存器来完成。(6)GPIO口的配置具有锁定机制。当配置好GPIO口后,在端口位上执行了锁定(LOCK),可以通过程序锁住配置组合,在下一次复位之前,将不能再更改端口位的配置。,3.1 GPIO结构,I/O端口位的基本结构图,钳位保护二极管,GPIO内部具有钳位保护二极管,其作用是防止从外部管脚Pin输入的电压过高或者过低。VDD正常供电是3.3V。如果
3、从Pin输入的信号(假设任何输入信号都有一定的内阻)电压超过VDD加上二极管D1的导通压降(假定在0.6V左右),则二极管D1导通,会把多于的电流引到VDD,而真正输入到内部的信号电压不会超过3.9V。同理,如果从Pin输入的信号电压比GND还低,则由于二极管D2的作用,会把实际输入内部的信号电压钳制在 0.6V左右。,对于GPIO的配置种类有8种之多:(1)GPIO_Mode_AIN 模拟输入(2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO_Mode_IPD 下拉输入(4)GPIO_Mode_IPU 上拉输入(5)GPIO_Mode_Out_OD 开漏输出(6)GPI
4、O_Mode_Out_PP 推挽输出(7)GPIO_Mode_AF_OD 复用开漏输出(8)GPIO_Mode_AF_PP 复用推挽输出,浮空输入(高阻输入),输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggeredinput)的三态缓冲器(U1),并具有很高的输入等效阻抗。施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。执行GPIO管脚读操作时,在读脉冲(ReadPulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(InternalBus)。在不执行读操作时,外部管脚与内部总线之间是隔离的。,推挽输出,执行
5、GPIO管脚写操作时,在写脉冲(WritePulse)的作用下,数据被锁存到Q和/Q。 T1和T2构成CMOS反相器,T1导通或T2导通时都表现出较低的阻抗,但T1和T2不会同时导通或同时关闭,最后形成的是推挽输出。,开漏输出,开漏输出只有下拉晶体管T1而没有上拉晶体管。同样,T1实际上也是多组可编程选择的晶体管。开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到GND。开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用4.710k)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起使用,并统一外接一个合适的上拉电阻,就自然
6、形成“逻辑与”关系。开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换(如3.3V到5V之间),只需外接一个上拉电阻,而不需要额外的转换电路。,输入配置,当I/O端口配置为输入时: 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 对输入数据寄存器的读访问可得到I/O状态,输入浮空/上拉/下拉配置图,输出配置,当I/O端口被配置为输出时: 输出缓冲器被激活 开漏模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将端口置于高阻状态(P-MOS从不被激活)。 推挽模式
7、:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。 施密特触发输入被激活 弱上拉和下拉电阻被禁止 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态 在推挽模式时,对输出数据寄存器的读访问得到最后一次写的值。,I/O端口位的输出配置图,返回,3.2 GPIO寄存器,每个GPI/O端口有:两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)一
8、个32位锁定寄存器(GPIOx_LCKR)。 GPIO端口的每个位可以由软件分别配置成多种模式。必须以字(32位)的方式操作这些外设寄存器。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问,这样,在读和更改访问之间产生IRQ时不会发生危险。,3.2 GPIO寄存器,CRL端口配置低寄存器CRH端口配置高寄存器IDR端口输入数据寄存器ODR端口输出数据寄存器BSRR端口位设置/复位寄存器BRR端口位复位寄存器LCKR端口配置锁定寄存器EVCR事件控制寄存器MAPR复用重映射和调试EXTICR外部中断线路0-15配置寄存器,端口配置低寄存器GPIOx_CR
9、L) (x=A.E) 复位值:0 x4444 4444,CNFy1:0:端口x配置位(y = 07) (Port x configuration bits) MODEy1:0:端口x的模式位(y = 07) (Port x mode bits),端口位配置表,复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx1:0=01b,MODEx1:0=00b)。,输出模式位,端口配置高寄存器(GPIOx_CRH) (x=A.E)复位值:0 x4444 4444,CNFy1:0:端口x配置位(y = 815) (Port x configuration bits) MODEy1:
10、0:端口x的模式位(y = 815) (Port x mode bits),端口输入数据寄存器(GPIOx_IDR) (x=A.E) 复位值:0 x0000 XXXX,IDRy15:0:端口输入数据(y = 015) (Port input data) 这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。,端口输出数据寄存器(GPIOx_ODR) (x=A.E) 复位值:0 x0000 0000,ODRy15:0:端口输出数据(y = 015) (Port output data) 这些位可读可写并只能以字(16位)的形式操作。 注:对GPIOx_BSRR(x = AE)
11、,可以分别地对各个ODR位进行独立的设置/清除。,端口位设置/清除寄存器(GPIOx_BSRR)复位值:0 x0000 0000,BRy: 清除端口x的位y (y = 015) (Port x Reset bit y) 这些位只能写入并只能以字(16位)的形式操作。 0:对对应的ODRy位不产生影响,1:清除对应的ODRy位为0 BSy: 设置端口x的位y。0:对对应的ODRy位不产生影响,1:设置对应的ODRy位为1注:如果同时设置了BSy和BRy的对应位,BSy位起作用。,端口位清除寄存器(GPIOx_BRR) 复位值:0 x0000 0000,BRy: 清除端口x的位y (y = 015
12、) (Port x Reset bit y) 这些位只能写入并只能以字(16位)的形式操作。 0:对对应的ODRy位不产生影响, 1:清除对应的ODRy位为0,端口配置锁定寄存器(GPIOx_LCKR) 复位值:0 x0000 0000,当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位15:0用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKy15:0。当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。 每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。LCKy: 端口x的锁位y (y = 015) (Por
13、t x Lock bit y) 。这些位可读可写但只能在LCKK位为0时写入。 0:不锁定端口的配置, 1:锁定端口的配置,端口配置锁定寄存器格式,GPIO寄存器结构,GPIO寄存器结构,GPIO_TypeDef 和 AFIO_TypeDef,在文件“stm32f10 x_map.h”中定义如下:,寄存器编程举例,void LED_Init(void)RCC-APB2ENR|=1CRL /PE.0-PE.7输出高电平,APB2外设时钟使能寄存器(RCC_APB2ENR) 复位值:0 x0000 0000,IOPEEN(位6 ):IO端口E时钟使能 (I/O port E clock enabl
14、e) 由软件置1或清0 0:IO端口E时钟关闭; 1:IO端口E时钟开启。,/点亮灯GPIOC-ODR = 0 xfffffffe; /点亮1个灯GPIOC-BSRR = 0 x00030000;/点亮2个灯GPIOC-BRR = 0 x000C;/GPIO_ResetBits(GPIOC, GPIO_Pin_2); /GPIO_Write(GPIOC, 0 xffff); /GPIO_WriteBit(GPIOC, GPIO_Pin_3, Bit_RESET);/熄灭灯GPIOC-ODR = 0 xffffffff; GPIOC-BSRR = 0 x00000003;GPIOC-BSRR =
15、 0 x0000000C;/GPIO_SetBits(GPIOC, GPIO_Pin_2); /GPIO_Write(GPIOC, 0 xfff0);/GPIO_WriteBit(GPIOC, GPIO_Pin_3, Bit_SET);,返回,3.3 GPIO函数,GPIO_DeInit 将外设GPIOx寄存器重设为缺省值GPIO_AFIODeInit 将复用功能(重映射事件控制和EXTI设置)重设为缺省值GPIO_Init 根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器GPIO_StructInit 把GPIO_InitStruct中的每一个参数按缺省值填入GPIO
16、_ReadInputDataBit 读取指定端口管脚的输入GPIO_ReadInputData 读取指定的GPIO端口输入GPIO_ReadOutputDataBit读取指定端口管脚的输出GPIO_ReadOutputData 读取指定的GPIO端口输出,GPIO_SetBits 设置指定的数据端口位GPIO_ResetBits 清除指定的数据端口位GPIO_WriteBit 设置或者清除指定的数据端口位GPIO_Write 向指定GPIO数据端口写入数据GPIO_PinLockConfig 锁定GPIO管脚设置寄存器GPIO_EventOutputConfig选择GPIO管脚用作事件输出GP
17、IO_EventOutputCmd 使能或者失能事件输出GPIO_PinRemapConfig 改变指定管脚的映射GPIO_EXTILineConfig 选择GPIO管脚用作外部中断线路,函数GPIO_DeInit,功能 :将外设GPIOx寄存器重设为缺省值。函数原形:void GPIO_DeInit(GPIO_TypeDef* GPIOx) GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设。被调用函数: RCC_APB2PeriphResetCmd() 例: /* Resets the GPIOA peripheral registers to their default res
18、et values */ GPIO_DeInit(GPIOA);,函数GPIO_AFIODeInit,功能描述:将复用功能(重映射事件控制和EXTI设置)重设为缺省值函数原形:void GPIO_AFIODeInit(void) 被调用函数:RCC_APB2PeriphResetCmd()例: /* Resets the Alternate functions registers to their default reset values */ GPIO_AFIODeInit();,函数GPIO_Init,功能描述:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器函数原
19、形: void GPIO_Init (GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设GPIO_InitStruct:指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息例如:GPIO_Init (GPIOA, ,GPIO_InitTypeDef定义于文件“stm32f10 x_gpio.h”: typedef struct u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GP
20、IO_Mode; GPIO_InitTypeDef;,GPIO_Pin值,该参数选择待设置的GPIO管脚,使用操作符 “|” 可以一次选中多个管脚。可以使用下表中的任意组合。GPIO_Pin_None:无管脚被选中GPIO_Pin_0: 选中管脚0 GPIO_Pin_1: 选中管脚1 GPIO_Pin_2: 选中管脚2 GPIO_Pin_3: 选中管脚3 GPIO_Pin_All: 选中全部管脚,GPIO_Speed值,GPIO_Mode: 用以设置选中管脚的工作状态,GPIO_Mode 描述GPIO_Mode_AIN 模拟输入 GPIO_Mode_IN_FLOATING 浮空输入 GPIO_
21、Mode_IPD 下拉输入 GPIO_Mode_IPU 上拉输入 GPIO_Mode_Out_OD 开漏输出 GPIO_Mode_Out_PP 推挽输出 GPIO_Mode_AF_OD 复用开漏输出 GPIO_Mode_AF_PP 复用推挽输出,GPIO的初始化配置程序,例: /* Configure all the GPIOA in Input Floating mode */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Spee
22、d = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init (GPIOA, ,函数GPIO_StructInit,例: /* Initialize the GPIO Init Structure parameters */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit (,函数GPIO_ReadInputDataBit,函数名:GPIO_ReadInputDataBit 函数原形: u8 GPIO_ReadInputDataBi
23、t(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) 功能描述: 读取指定端口管脚的输入 输入参数1: GPIOx-x可以是A,B,C,D或者E,来选择GPIO外设输入参数2: GPIO_Pin-待读取的端口位返回值:输入端口管脚值,例: /* Reads the seventh pin of the GPIOB and store it in ReadValue variable */ u8 ReadValue; ReadValue = GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_7);,函数GPIO_ReadInputData,函数名:
24、 GPIO_ReadInputData 函数原形: u16 GPIO_ReadInputData(GPIO_TypeDef* GPIOx)功能描述: 读取指定的GPIO端口输入输入参数: GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设输出参数: 无 返回值: GPIO输入数据端口值例: /*Read the GPIOC input data port and store it in ReadValue variable*/ u16 ReadValue; ReadValue = GPIO_ReadInputData (GPIOC);,函数GPIO_ReadOutputDataBit
25、,函数名GPIO_ReadOutputDataBit 函数原形: u8 GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, u16 GPIO_Pin)功能描述 读取指定端口管脚的输出 输入参数1- GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设 输入参数2-GPIO_Pin:待读取的端口位返回值: 输出端口管脚值 例: /* Reads the seventh pin of the GPIOB and store it in ReadValue variable */ u8 ReadValue; ReadValue = GPIO_ReadOu
26、tputDataBit(GPIOB, GPIO_Pin_7);,函数GPIO_ReadOutputData,函数名: GPIO_ReadOutputData 函数原形: u16 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) 功能描述: 读取指定的GPIO端口输出输入参数: GPIOx-x可以是A,B,C,D或者E,来选择GPIO外设返回值: GPIO输出数据端口值例: /* Read the GPIOC output data port and store it in ReadValue variable */ u16 ReadValue; ReadValu
27、e = GPIO_ReadOutputData(GPIOC);,函数GPIO_SetBits,函数名GPIO_SetBits 函数原形 void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) 功能描述 设置指定的数据端口位输入参数1 GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设输入参数2 GPIO_Pin:待设置的端口位该参数可以取GPIO_Pin_x(x可以是0-15)的任意组合例: /* Set the GPIOA port pin 10 and pin 15 */ GPIO_SetBits(GPIOA, GPIO_Pin_
28、10 | GPIO_Pin_15);,函数GPIO_ResetBits,函数原形:void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) 功能描述: 清除指定的数据端口位 例: /* Clears the GPIOA port pin 10 and pin 15 */ GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15),函数GPIO_WriteBit,函数原形: void GPIO_WriteBit (GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction Bi
29、tVal)功能描述: 设置或者清除指定的数据端口位BitVal: 该参数指定了待写入的值. 该参数必须取枚举BitAction的其中一个值. Bit_RESET: 清除数据端口位, Bit_SET: 设置数据端口位例: /* Set the GPIOA port pin 15 */ GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);,函数GPIO_Write,函数原形: void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal) 功能描述: 向指定GPIO数据端口写入数据PortVal: 待写入端口数据寄存器的值例:
30、/* Write data to GPIOA data port */ GPIO_Write(GPIOA, 0 x1101);,返回,3.4 GPIO编程举例-点亮一个灯,PC0PC1 STM32 f103VBPC2PC3,主程序,#include stm32f10 x.hErrorStatus HSEStartUpStatus; /定义外部高速晶振启动状态枚举变量void Delay(vu32 nTime); /vu32代表无符号32位长整型void RCC_Configuration(void); void GPIO_Configuration(void);int main(void) R
31、CC_Configuration(); /配置时钟 GPIO_Configuration();/配置端口 for( ; ; ) /或者 while(1) GPIOC-ODR = 0 xfffffffe; Delay(800000);GPIOC-ODR = 0 xffffffff; Delay(800000); ,void RCC_Configuration(void) /配置时钟的函数 RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);HSEStartUpStatus = RCC_WaitForHSEStartUp(); if (HSEStartUpStatus =
32、 SUCCESS) RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); FLASH_SetLatency(FLASH_Latency_2); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLA
33、G_PLLRDY) = RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0 x08); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);,配置端口函数,void GPIO_Configuration(void) /端口GPIOC3:0,推挽输出,50MHz。 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPI
34、O_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, ,延时函数,void Delay(vu32 nCount) for( ; nCount != 0; nCount-);,关于ErrorStatus,typedef enum ERROR = 0, SUCCESS = !ERROR ErrorStatus;,GPIO编程举例-独立按键输入,核心板上,
35、按键接口电路:,PA0PA1 STM32 f103VBPA2PA3,#include stm32f10 x.h ErrorStatus HSEStartUpStatus;void Delay(vu32 nTime);void RCC_Configuration(void);void GPIO_Configuration(void);u8 t;,主函数,int main (void) RCC_Configuration();/* 配置系统时钟,使能外设时钟 */ GPIO_Configuration(); /* 配置GPIO,PC推挽输出,PA浮空输入 */ GPIOC-ODR = 0 xfff
36、fffff; /* 灯全灭 */while(1) t = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);if (t=0) GPIOC-ODR = 0 xfffffff0;t = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);if (t=0) GPIOC-ODR = 0 xfffffff3;,/配置系统时钟void RCC_Configuration(void) /(系统时钟配置同实验二,略) / 使能外设( PA口和PC口)时钟 RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA | RC
37、C_APB2Periph_GPIOC, ENABLE);,void GPIO_Configuration(void) /配置GPIO, 推挽输出,上拉输入 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_
38、Init(GPIOC, ,返回,3.5 练习题三,1. GPIO的英文全称是()。2. GPIO引脚通常分为组为()、()、()、()、()。3.每组GPIO寄存器中每位对应的位置分别编号为()-()。4. GPIO输入/输出模式有()种。5. GPIO常用工作模式有3种:()、()、()。6. STM32复位之后,所有端口被设置成()方式。7. 开漏输出时,端口只能输出()电平,不能输出()电平。8. 用来设置工作模式的寄存器是()、()。9. I/O寄存器必须以()形式访问。10. 端口数据输出寄存器是()。,11. GPIOx_BSRR是()位的寄存器。12. 通过对GPIOx_BSRR
39、寄存器的相应位写(),可以实现置位/复位。13. GPIO有3种输出速度可选分别为()、()、()。这里速度是指I/O口驱动电路的响应速度而不是输出信号的速度。14. GPIO库函数屏蔽了对()的操作,直接通过参数设置实现相应初始化、读写端口等功能。15. 设置一位的函数有()、()、()。16. 同时写多位端口的函数是()。,返回,3.6 实验二 点亮发光二极管,实验目的:熟悉开发环境,掌握GPIO的编程方式。实验内容:用寄存器和函数库编程使GPIOC外接的灯循环亮灭。,实验报告要求,实验名称实验目的实验内容主程序流程图源代码(可以打印)程序调试过程执行结果,实验三 独立按键控制,实验目的:
40、掌握独立按键的工作原理及按键控制程序的编写方法。实验内容:PA口的四个按键,任意键闭合,4个LED灯呈现不同的显示状态。按键1闭合,4个灯同时亮灭5次按键2闭合,1,2和3,4灯交替两灭5次按键3闭合,流水灯循环4次按键4闭合,1,4和3,2灯交替亮4次,返回,程序下载方法一:ISP下载,1. 安装USB转串口2. 开发板上,选USB供电,开关拨到ISP3. 运行mucisp.exe搜索串口装入待运行程序(.HEX)选DTR的低电平复位,高电平进入BootLoader点击开始编程,程序下载方法二:JLINK下载,开发板开关拨到UART在Keil环境下,选魔法棒(Options for target)选DeviceSTM32f103VB选DebugUse: JLINK/J-Trace Cortex选UtilitiesJLINKSettingsReset and Run, 添加设备(ADD)点击ADD, 选STM32f10 x Med-density Flash,