一 什么是 
 GPIO:  
 
 
 
 GPIO(general porpose intput output), 
 通用输入输出端口 
 .  
 
 
 
 
  
 
 
 
 
  二 我们先认识芯片控制 
  GPIO 
  输出控制。 
 
 
  
   2.1LED 
   硬件原理如图:  
  
 
   
   
 
   
   当电流从这根电线流通, 
   LED 
   亮。当电流不通过这根电线, 
   LED 
   灭。  
  
 
   
   上面 
   PF** 
   ,芯片电压为低, 
   LED 
   亮。为高时,不亮。  
  
 
   
   上面 
   PE** 
   ,芯片电压为高, 
   LED 
   亮。为低时,不亮。  
  
 
   
   (可以见得,我们的嵌入式工程师编码与硬件工程师密切相关)  
  
 
   
   还可以结论:电流的高低输出,程序决定的。芯片侧 
   程序决定 
   给这根电线供电、  
  
 
   
   或者断电。芯片外侧接 
   LED 
   灯,我们肉眼观察 
   led 
   的亮灭。判断我们控制手段是  
  
 
   
   否达成。 
  
 
  
 
  
 
 
 
  
 
  
  2.2.3.1  
  ;流程图第一步时钟使能函数: 
 
 
  
 
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph,NewState);  
 
 
 RCC_AHB2PeriphClockCmd(RCC_AHB2Periph, NewState);  
 
 
 RCC_AHB3PeriphClockCmd(RCC_AHB3Periph,NewState);  
 
 
 RCC_APB1PeriphClockCmd( RCC_APB1Periph, NewState);  
 
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph, NewState);  
 
 
 
  选择: 
  RCC_AHB1PeriphClockCmd 
  ( 
  RCC_AHB1Periph_GPIOF 
  , 
  ENABLE 
  ) 
  ;  
 
 
  
  函数解释:让第 
  F 
  组成员都有时钟控制。没有这个时钟信号,都无法工作。  
 
 
  
  参数 
  1:RCC_AHB1Periph_GPIOF, 
  选择第几组。  
 
 
  
  参数 
  2 
  : 
  DISABLE/ENABLE 
 
 
  
  
   2.2.3.2  
   流程图第二部 
   GPIO 
   基本配置: 
  
 
   
   
    void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)  
   
 
    
    函数解释:让程序决定第几组第几根引脚,如何工作。  
   
 
    
    参数 
    1 
    : 
    GPIOx 
    :第几组,  
   
 
    
    GPIOA/GPIOB/GPIOC/GPIOD/GPIOE/GPIOF/GPIOG/GPIOH/GPIOI/GPIOJ/GPI  
   
 
    
    OK  
   
 
    
    说明:查看确认引脚号,例如 
    PF9, 
    对应组为: 
    GPIOF 
    。  
   
 
    
    
     参数 
     2 
     :第几根,如何干活。  
    
 
     
     GPIO_InitTypeDef  
     结构体名字;  
    
 
     
     结构体名字 
     .GPIO_Pin =  
     引脚号 
     ; GPIO_Pin_0/....GPIO_Pin_15/GPIO_Pin_ALL  
    
 
     
     结构体名字 
     .GPIO_Mode =  
     输入输出类型 
     ; GPIO_Mode_IN/GPIO_Mode_OUT/  
    
 
     
     ( 
    
 
     
      结构体名字 
      .GPIO_Speed =  
      速度 
      ; GPIO_Low_Speed/...GPIO_High_Speed  
     
 
      
      结构体名字 
      .GPIO_OType =  
      类型 
      ; GPIO_OType_PP/GPIO_OType_OD  
     
 
      
      结构体名字 
      .GPIO_PuPd =  
      上下拉电阻 
      ; GPIO_PuPd_UP /GPIO_PuPd_DOWN  
      ) 
     
 
      
      
       2.2.3.3  
       流程图第三步 
       GPIO 
       基本操控:  
      
 
       
       GPIO_SetBits(GPIOF, GPIO_Pin_9); PF9 
       输出高电平,根据硬件原理图, 
       LED 
       灭  
      
 
       
       GPIO_ResetBits(GPIOF, GPIO_Pin_9);PF9 
       输出低电平,根据硬件原理图, 
       LED  
      
 
       
       亮  
      
 
       
       整体编码整体如下: 
      
 
      // 时钟使能RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//GPIO 基本参数配置GPIO_InitTypeDef led_gpio_initstruct;led_gpio_initstruct.GPIO_Mode = GPIO_Mode_OUT;led_gpio_initstruct.GPIO_OType = GPIO_OType_PP;led_gpio_initstruct.GPIO_Pin = GPIO_Pin_9;led_gpio_initstruct.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOF,&led_gpio_initstruct);while(1){//gpio 的基本操控GPIO_SetBits(GPIOF, GPIO_Pin_9);GPIO_ResetBits(GPIOF, GPIO_Pin_9);// Bit_RESET Bit_SET//GPIO_WriteBit(GPIOF,GPIO_Pin_9,1);//GPIO_Write(GPIOF,0X0200);}
第三:请对于GPIO的基本操控进行改写。要求LED灯会一闪一闪的。
 
 流程: 
 1 
 打开 
 LED 
 , 
 2 
 延时, 
 3 
 关闭 
 LED 
 , 
 4 
 延时。重复执行四个步骤  
 
 
 延时函数实现: 
 delay() { uint32_t t = 50000;while(t--)}  
 
 
while(1){GPIO_SetBits(GPIOF,GPIO_Pin_10);delay(time);GPIO_ResetBits(GPIOF, GPIO_Pin_10);delay(5000-time);time++;if(time == 5000) break;}while(1){GPIO_SetBits(GPIOF,GPIO_Pin_10);delay(time);GPIO_ResetBits(GPIOF, GPIO_Pin_10);delay(5000-time);time--;if(time == 0) break;}
 
 3.1GPIO 
 的结构图,从电器特性来看代码:  
 
 
 
 
 
 1. 
 保护二极管:保护电压数值,不超过 
 VDD.  
 
 
 流程: 
 1 
 打开 
 LED 
 , 
 2 
 延时, 
 3 
 关闭 
 LED 
 , 
 4 
 延时。重复执行四个步骤  
 
 
 延时函数实现: 
 delay() { uint32_t t = 50000;while(t--)}  
 
 
 while(1)  
 
 
 {  
 
 
 GPIO_SetBits(GPIOF,GPIO_Pin_10);  
 
 
 delay(time);  
 
 
 GPIO_ResetBits(GPIOF, GPIO_Pin_10);  
 
 
 delay(5000-time);  
 
 
 time++;  
 
 
 if(time == 5000) break;  
 
 
 }  
 
 
 while(1)  
 
 
 {  
 
 
 GPIO_SetBits(GPIOF,GPIO_Pin_10);  
 
 
 delay(time);  
 
 
 GPIO_ResetBits(GPIOF, GPIO_Pin_10);  
 
 
 delay(5000-time);  
 
 
 time--;  
 
 
 if(time == 0) break;  
 
 
 } 
 2. 
 可调节电阻,上方接通,为高电平。下方接通为低电平。  
 
 
 3. 
 施密特触发器。三角形的宽的一端有电压数值,尖端会输出 
 1 
 。反之为 
 0 
 。  
 
 
 4. 
 两个三极管,上方导通,输出的是高信号对应高电平。下方导通,输出的低电  
 
 
 平对应的 
 0 
 信号。  
 
 
 GPIO_InitTypeDef led_gpio_initstruct; led_gpio_initstruct.GPIO_Mode =  
 
 
 GPIO_Mode_OUT;  
 决定是输入 
 , 
 输出 
 , 
 复用 
 , 
 模拟  
 led_gpio_initstruct.GPIO_OType  
 
 
 = GPIO_OType_PP;  
 决定是推挽还是开漏  
 led_gpio_initstruct.GPIO_Pin =  
 
 
 GPIO_Pin_9;  
 决定哪一个引脚  
 led_gpio_initstruct.GPIO_Speed =  
 
 
 GPIO_High_Speed; 
 决定最大输出速度  
 GPIO_Init(GPIOF,&led_gpio_initstruct); 
 
 
 
 3.2GPIO 
 输出模式:  
 
 
 推挽输出 
 :推出去为推。拉回来为挽。推挽输出可以输出高电平与低电平。  
 
 
 当高电平输出的时候, 
 LED 
 灭。当低电平输出的时候  
 LED 
 亮。局限在于推挽输出  
 
 
 引脚与输入引脚连接后,容易烧坏板子。因此引入开漏输出。不能与数据输入同  
 
 
 时存在。 
 
 
 
  开漏输出 
  :开路输出 
  , 
  仅仅输出低电平和高阻态,开漏输出会有外部电流供电,  
 
 
  
  LED 
  默认为 
  LED 
  亮。当输出低电平会产生短路,实现了对于 
  LED 
  灭。耗电时间长  
 
 
  
  的,耗电量大的首选这个。而且,采集信号输出信号可以同时存在。 
 
 
  
  
   3.3GPIO 
   输出开发任务:  
  
 
   
   任务选择:  
  
 
   
   开漏输出用例:  
  
 
   
   推挽输出用例:  
  
 
   
   LED 
   灯的代码封装 
   : 
   初始化封装, 
   led.c led.h  
  
 
   
   输出总结:  
  
 
   
   输出模式: 
   共计四种输出模式。 
   开漏输出 
   , 
   推挽输出 
   , 
   开漏复用 
   * 
   * 
   , 
   推挽复用 
   。  
  
 
   
   两种输出模式仅仅是数据来源来自 复用功能输出而不是输出寄存器。完全可以  
  
 
   
   参考( 
   开漏输出和推挽输出 
   )  
  
 
   
   
 
   
 
   
 
   
 
   
 
  


















