  | 
      
        
          1楼
          巨大八爪鱼
          2016-3-26 18:14
          
          
           
         
        【示例程序】 #include "stm32f4xx.h"
  // 初始化IO口 void port_init() {     GPIO_InitTypeDef init;     init.GPIO_Mode = GPIO_Mode_OUT; // 输出模式     init.GPIO_OType = GPIO_OType_PP; // 输出类型: 推挽输出     init.GPIO_PuPd = GPIO_PuPd_UP; // 上拉模式     init.GPIO_Speed = GPIO_Speed_2MHz; // 速率          // 启用PD和PH端口     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOH, ENABLE);          // 初始化PH10     init.GPIO_Pin = GPIO_Pin_10;     GPIO_Init(GPIOH, &init);          // 初始化PH11, PH12, PD11     init.GPIO_Pin = GPIO_Pin_11;     GPIO_Init(GPIOH, &init);     init.GPIO_Pin = GPIO_Pin_12;     GPIO_Init(GPIOH, &init);     init.GPIO_Pin = GPIO_Pin_11;     GPIO_Init(GPIOD, &init); }
  // 关闭所有灯 void close_all() {     GPIOH->BSRRL = GPIO_Pin_10; // 将PH10设为高电平     GPIOH->BSRRL = GPIO_Pin_11; // 将PH11设为高电平     GPIOH->BSRRL = GPIO_Pin_12;     GPIOD->BSRRL = GPIO_Pin_11; // 将PD11设为高电平 }
  // 延迟一段时间 void delay() {     int i, j;     for (i = 0; i < 9999; i++)         for (j = 0; j < 999; j++); }
  int main(void) {     port_init();     close_all();          while (1)     {         GPIOD->BSRRH = GPIO_Pin_11; // 将PD11设为低电平,点亮此灯         delay();         GPIOD->BSRRL = GPIO_Pin_11; // 将PD11设为高电平,熄灭此灯         delay();     } }
  
       | 
    
    
        | 
      
        
          2楼
          巨大八爪鱼
          2016-3-26 18:18
          
          
           
         
        可以采用宏定义的方法更加方便地操作LED: #define LED4_ON (GPIOD->BSRRH = GPIO_Pin_11) #define LED4_OFF (GPIOD->BSRRL = GPIO_Pin_11)
  int main(void) {     port_init();     close_all();          while (1)     {         LED4_ON;         delay();         LED4_OFF;         delay();     } }
  
       | 
    
    
        | 
      
        
          3楼
          巨大八爪鱼
          2016-3-26 18:38
          
          
           
         
        【示例程序2:用按键控制LED的亮灭】 #include "stm32f4xx.h"
  #define LED4_ON (GPIOD->BSRRH = GPIO_Pin_11) #define LED4_OFF (GPIOD->BSRRL = GPIO_Pin_11)
  // 初始化IO口 void port_init() {     GPIO_InitTypeDef init;          // 启用PA、PC和PD端口的时钟     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE);          // 初始化PD11     init.GPIO_Mode = GPIO_Mode_OUT; // 输出模式     init.GPIO_OType = GPIO_OType_PP; // 输出类型: 推挽输出     init.GPIO_PuPd = GPIO_PuPd_UP; // 上拉模式     init.GPIO_Speed = GPIO_Speed_2MHz; // 速率     init.GPIO_Pin = GPIO_Pin_11;     GPIO_Init(GPIOD, &init);          // 初始化PA0, PC13     init.GPIO_Mode = GPIO_Mode_IN; // 输入模式     init.GPIO_PuPd = GPIO_PuPd_NOPULL; // 既不上拉也不下拉     init.GPIO_Pin = GPIO_Pin_0;     GPIO_Init(GPIOA, &init);     init.GPIO_Pin = GPIO_Pin_13;     GPIO_Init(GPIOC, &init); }
  // 判断键是否按下 int is_keydown(GPIO_TypeDef *port, uint16_t pin) {     if (GPIO_ReadInputDataBit(port, pin) == 1)     {         while (GPIO_ReadInputDataBit(port, pin) == 1);         return 1;     }     else         return 0; }
  int main(void) {     port_init();     LED4_OFF;          while (1)     {         // 当PA0键按下时         if (is_keydown(GPIOA, GPIO_Pin_0))             LED4_ON;                  // 当PC13键按下时         if (is_keydown(GPIOC, GPIO_Pin_13))             LED4_OFF;     } }
  
       | 
    
    
        | 
      
        
          4楼
          巨大八爪鱼
          2016-3-26 18:41
          
          
           
         
        只用一个按键控制LED灯的亮灭。第一次按下时亮,再按一下就灭: int main(void) {     port_init();     LED4_OFF;          while (1)     {         if (is_keydown(GPIOA, GPIO_Pin_0))             GPIOD->ODR ^= GPIO_Pin_11; // 对PD11上的电平取反     } }
  
       | 
    
    
        | 
      
        
          5楼
          巨大八爪鱼
          2016-3-26 18:43
          
          
           
         
        说明:is_keydown函数里的那个while语句用于等待按键释放。 
       | 
    
    
        | 
      
        
          6楼
          巨大八爪鱼
          2016-3-26 19:10
          
          
           
         
        【示例程序3:一次性初始化端口及设置端口】 #include "stm32f4xx.h"
  // 下面的宏在AVR单片机中经常用到 #define BIT(n) (1 << (n)) #define _BV(n) BIT(n)
  // 初始化IO口 void port_init() {     GPIO_InitTypeDef init;          // 启用PH端口的时钟     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);          // 初始化     init.GPIO_Mode = GPIO_Mode_OUT; // 输出模式     init.GPIO_OType = GPIO_OType_PP; // 输出类型: 推挽输出     init.GPIO_PuPd = GPIO_PuPd_UP; // 上拉模式     init.GPIO_Speed = GPIO_Speed_2MHz; // 速率     init.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; // 一次性把PH10~PH12全部初始化     GPIO_Init(GPIOH, &init); }
  void delay() {     int i, j;     for (i = 0; i < 9999; i++)         for (j = 0; j < 2999; j++); }
  int main(void) {     port_init();     while (1)     {         GPIO_Write(GPIOH, 0xffff); // 一次性将PH的所有端口都设为高电平         delay();         GPIO_Write(GPIOH, ~BIT(11)); // 只点亮PH11上的灯         delay();         GPIO_Write(GPIOH, ~BIT(10)); // 只点亮PH10上的灯         delay();         GPIO_Write(GPIOH, ~BIT(10) & ~BIT(11)); // 同时点亮PH10和PH11         delay();         GPIO_Write(GPIOH, ~BIT(10) & ~BIT(11) & ~BIT(12)); // 同时点亮三个灯         delay();     } }
  
       | 
    
    
        | 
      
        
          7楼
          巨大八爪鱼
          2016-3-26 19:16
          
          
           
         
        // 熄灭第二个灯, 其余灯的状态保持不变 value = GPIO_ReadOutputData(GPIOH); value |= BIT(11); GPIO_Write(GPIOH, value);
  
       | 
    
    
        | 
      
        
          8楼
          巨大八爪鱼
          2016-3-26 19:21
          
          
           
         
        
          
          // 熄灭第二个灯, 其余灯的状态保持不变 value = GPIO_ReadOutputData(GPIOH); value |= BIT(11); GPIO_Write(GPIO...
  
         
        变量value的定义:uint16_t value;
  
       |