山东科技大学《微控制器原理》实验指导书STM32F103-GPIO基本输入输出实验1 实验01STM32F103-GPIO基本输入输出实验一、实验目的学习STM32F103VCT6单片机的通用GPIO的基本输出输入功能,主要了解STM32的GPIO的原理和应用。二、实验设备1)装有RVMDK仿真软件的Pentium以上的计算机一套;2)J-Link-ARMV8仿真器一套;3)STM32F103VCT的神舟II号开发板一套。三、实验电路原理图及其说明在神州Ⅱ号STM32开发板中,一共有5个LED指示灯,其中一个是电源指示灯LD5,其他的4个LED(LD1、LD2、LD3和LD4)由GPIO-PD控制,4个LED分别串了470KΩ的电阻,起限流作用防止电流过大损坏LED和GPIO口。电路原理图如图1所示。 图1STM32F103GPIO-LED电路原理图图当GPIO管脚输出高电平时,对应的LED灯亮;当GPIO管脚输出低电平时对应的LED灯灭。GPIO管脚与对应的LED灯的关系如下表所示:LED灯LED灯对应的GPIOLD1PD08LD2PD09LD3PD10LD4PD11蜂鸣器DEEPPC8山东科技大学《微控制器原理》实验指导书STM32F103-GPIO基本输入输出实验2 图2按键KEY硬件电路GPIO管脚与按键对应的关系按键GPIO说明确定OKPD3下拉电阻上UPPD4下拉电阻下DOWNPA8下拉电阻左LEFTPD0下拉电阻右RIGHTPD1下拉电阻用户自定义UserPD2上拉电阻干预TamperPC13上拉电阻唤醒WakeupPA0下拉电阻四、实验内容1.使用单步运行实现LD1、LD2、LD3、LD4点亮和熄灭。2.使用软件延时1s实现这四个灯交替闪烁的流水灯效果。3.按下UP、DOWN、LEFT、RIGHT键分别让对应的LD1、LD2、LD3、LD4指示灯亮。4.按下LEFT键让LD1→LD2→LD3→LD4自左向右流水显示;按下RIGHT键分别让LD4→LD3→LD2→LD1自右向左流水显示。5.按下UP键让LD1→LD2→LD3→LD4自左向右流水循环显示;按下DOWN键分别让LD4→LD3→LD2→LD1自右向左流水循环显示。五、实验原理流水灯的关键实际上就是如何控制STM32处理器的GPIO接口,作为IO口,输出指定的电平信号。STM32的IO口可以由软件配置成8种模式:模拟输入、输入悬空、输入下拉、输入山东科技大学《微控制器原理》实验指导书STM32F103-GPIO基本输入输出实验3 上拉、开漏输出、推挽输出、复用功能开漏输出和复用功能推挽输出等。STM32每个IO口可以自由编程,单IO口寄存器必须要按32位字被访问。STM32的很多IO口都是5V兼容的,这些IO口在与5V电平的外设连接的时候很有优势。STM32的每个IO端口都有7个寄存器来控制:配置模式的2个32位的端口配置寄存器CRL和CRH、2个32位的数据寄存器IDR和ODR、1个32位的置位/复位寄存器BSRR、一个32位的复位寄存器BRR、1个32位的锁存寄存器LCKR等。GPIO_CR控制着每个IO口的模式及输出速率,STM32的IO口位配置表如下表所示。配置模式CNF1CNF0MODE1MODE0PxODR寄存器通用输出推挽式Push-Pull00011011见表3.1.20或1开漏Open-Drain10或1复用功能输出推挽式Push-Pull10不使用开漏Open-Drain1不使用输入模拟输入0000不使用浮空输入1不使用下拉输入100上拉输入1STM32输出模式配置如下表所示:MODE[1:0]意义00保留01昀大输出速度为10MHz10昀大输出速度为2MHz11昀大输出速度为50MHz六、实验现象把程序下载到神州Ⅱ号STM32开发板后,可以根据实验设计看到四个LED(LD1-4)单独或者轮流闪亮,实现流水灯的效果。七、实验报告书写要求说明:实验报告均按以下格式书写1)绘制程序流程图。2)写出程序清单。3)给出实验中用到的数据和实验结果。4)通过实验,分析你的收获、不足、问题。山东科技大学《微控制器原理》实验指导书STM32F103-GPIO基本输入输出实验4 八、参考程序/*Includes------------------------------------------------------------------*/#includestm32f10x.h/*Privatedefine------------------------------------------------------------*/#defineRCC_GPIO_LEDRCC_APB2Periph_GPIOD/*LED使用的GPIO时钟*/#defineLEDn4/*神舟II号LED数量*/#defineGPIO_LEDGPIOD/*LED使用的GPIO组*/#defineLD1_PINGPIO_Pin_8/*LD1使用的GPIO管脚*/#defineLD2_PINGPIO_Pin_9/*LD2使用的GPIO管脚*/#defineLD3_PINGPIO_Pin_10/*LD3使用的GPIO管脚*/#defineLD4_PINGPIO_Pin_11/*LD4使用的GPIO管脚*//*Privatevariables---------------------------------------------------------*/u8count=0;/*Privatefunctionprototypes-----------------------------------------------*/voidDelay(vu32nCount);voidTurn_On_LED(u8LED_NUM);/*Privatefunctions---------------------------------------------------------*/intmain(void){GPIO_InitTypeDefGPIO_InitStructure;//定义结构体变量/*配置神舟II号LED灯使用的GPIO管脚模式*/RCC_APB2PeriphClockCmd(RCC_GPIO_LED,ENABLE);/*使能LED使用的GPIO时钟*/GPIO_InitStructure.GPIO_Pin=LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIO_LED,&GPIO_InitStructure);/*LED灯相关的GPIO口初始化*/GPIO_ResetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN);/*关闭所有LED灯*/while(1){GPIO_ResetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN);/*关闭所有LED灯*/Turn_On_LED(count%4);//点亮一个LED灯count++;Delay(0x2FFFFF);}}/*点亮对应灯*/voidTurn_On_LED(u8LED_NUM){switch(LED_NUM){case0:GPIO_SetBits(GPIO_LED,LD1_PIN);break;/*点亮LD1灯*/case1:GPIO_SetBits(GPIO_LED,LD2_PIN);break;/*点亮LD2灯*/case2:GPIO_SetBits(GPIO_LED,LD3_PIN);break;/*点亮LD3灯*/山东科技大学《微控制器原理》实验指导书STM32F103-GPIO基本输入输出实验5 case3:GPIO_SetBits(GPIO_LED,LD4_PIN);break;/*点亮LD4灯*/default:GPIO_SetBits(GPIO_LED,LD1_PIN|LD2_PIN|LD3_PIN|LD4_PIN);break;/*点亮所有灯*/}}/********************************************************************************FunctionName:Delay*Description:Insertsadelaytime.*Input:nCount:specifiesthedelaytimelength.*Output:None*Return:None*******************************************************************************/voidDelay(vu32nCount){for(;nCount!=0;nCount--);}/*******************(C)COPYRIGHT2008STMicroelectronics*****ENDOFFILE****/说明:1)为了降低STM32处理器的功耗,可以依据实际的需求,选择合适的时钟速率,GPIO口支持的昀大时钟速率越低,它产生的功耗也越低。2)在使用一个GPIO之前,一般需要对GPIO管脚的时钟、GPIO管脚模式以及速率进行设定。