STM32F407VG IO位操作

来源:互联网 发布:日语口语网络课程 编辑:程序博客网 时间:2024/05/22 17:23

作者:dazhou158

转自:http://blog.csdn.net/dazhou158/article/details/7971920


[cpp] view plaincopy
  1. /************************************ 
  2.      标题:操作GPIO的练习 
  3.      软件平台:MDK-keil uvision v4.23 
  4.      硬件平台:stm32f4-discovery 
  5.      主频:168M     
  6.      author:大舟 
  7.      data:2012-09-04 
  8.  *************************************/  
  9.  /*sys时钟为HSE频率/PLL_M*PLL_N/PLL_P,定义HSE为8M,则sys时钟频率为168M */  
  10.  #include <stm32f4xx.h>   
  11.    
  12.    
  13.  #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))  
  14.  #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))  
  15.  #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))  
  16.    
  17.  //F4XXIO 口地址映射  
  18.  #define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014  
  19.  #define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414  
  20.  #define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814  
  21.  #define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14  
  22.  #define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014  
  23.  #define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414  
  24.  #define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814  
  25.  #define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14  
  26.  #define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014  
  27.    
  28.  #define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010  
  29.  #define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410  
  30.  #define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810  
  31.  #define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10  
  32.  #define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010  
  33.  #define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410  
  34.  #define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810  
  35.  #define GPIOH_IDR_Addr (GPIOF_BASE+16) //0x40021C10  
  36.  #define GPIOI_IDR_Addr (GPIOG_BASE+16) //0x40022010  
  37.    
  38.  //F4XXIO 口操作 , 只对单一的 IO 口 ,n 的值范围 [0-15]  
  39.  #define GPIOAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)     //GPIOA 某一位输出  
  40.  #define GPIOAin(n) BIT_ADDR(GPIOA_IDR_Addr,n)  //GPIOA 某一位输入  
  41.  #define GPIOBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)     //GPIOB 某一位输出  
  42.  #define GPIOBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)  //GPIOB 某一位输入  
  43.  #define GPIOCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)     //GPIOC 某一位输出  
  44.  #define GPIOCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)  //GPIOC 某一位输入  
  45.  #define GPIODout(n) BIT_ADDR(GPIOD_ODR_Addr,n)     //GPIOD 某一位输出  
  46.  #define GPIODin(n) BIT_ADDR(GPIOD_IDR_Addr,n)  //GPIOD 某一位输入  
  47.  #define GPIOEout(n) BIT_ADDR(GPIOE_ODR_Addr,n)     //GPIOE 某一位输出  
  48.  #define GPIOEin(n) BIT_ADDR(GPIOE_IDR_Addr,n)  //GPIOE 某一位输入  
  49.  #define GPIOFout(n) BIT_ADDR(GPIOF_ODR_Addr,n)     //GPIOF 某一位输出  
  50.  #define GPIOFin(n) BIT_ADDR(GPIOF_IDR_Addr,n)  //GPIOF 某一位输入  
  51.  #define GPIOGout(n) BIT_ADDR(GPIOG_ODR_Addr,n)     //GPIOG 某一位输出  
  52.  #define GPIOGin(n) BIT_ADDR(GPIOG_IDR_Addr,n)  //GPIOG 某一位输入  
  53.  #define GPIOHout(n) BIT_ADDR(GPIOH_ODR_Addr,n)     //GPIOH 某一位输出  
  54.  #define GPIOHin(n) BIT_ADDR(GPIOH_IDR_Addr,n)  //GPIOH 某一位输入  
  55.  #define GPIOIout(n) BIT_ADDR(GPIOI_ODR_Addr,n)     //GPIOI 某一位输出  
  56.  #define GPIOIin(n) BIT_ADDR(GPIOI_IDR_Addr,n)  //GPIOI 某一位输入  
  57.  /*************************************************************************/  
  58.    
  59.  #define LED1 GPIODout(12)  // 定义 LED1 为 GPIOD_Pin_12  
  60.  #define LED2 GPIODout(13)  // 定义 LED1 为 GPIOD_Pin_13  
  61.  #define LED3 GPIODout(14)  // 定义 LED1 为 GPIOD_Pin_14  
  62.  #define LED4 GPIODout(15)  // 定义 LED1 为 GPIOD_Pin_15  
  63.  #define KEY1 GPIOAin(0)    // 定义 KEY1 为 GPIOC_Pin_0  
  64.    
  65.    
  66.  uint32_t Gb_TimingDelay;  
  67.    
  68.  void Delay(uint32_t nTime);  
  69.  void LED_init(void);  
  70.  void key_init(void);  
  71.  void key_scan(void);  
  72.    
  73.  int main (void)  
  74.  {     
  75.     SysTick_Config(SystemCoreClock / 1000); //设置systemtick一毫秒中断    
  76.     RCC->APB2ENR |= (1<<14);  //使能syscfg时钟  
  77.       
  78.     LED_init();  
  79.     key_init();  
  80.  //  LED1=1;        //LED灯亮  
  81.     while(1)  
  82.     {  
  83.         //流水灯  
  84.         LED1=!LED1;  
  85.         LED2=!LED2;  
  86.         LED3=!LED3;  
  87.         LED4=!LED4;  
  88.         Delay(1000);  
  89.           
  90.         //按键扫描  
  91.         key_scan();   
  92.     }  
  93.  }  
  94.    
  95.  void LED_init(void)  
  96.  {  
  97.     RCC->AHB1ENR |= 0x00000008; //使能GPIOD时钟  
  98.       
  99.     GPIOD->MODER &= 0x00FFFFFF; //设置PD12,13,14,15输出  
  100.     GPIOD->MODER |= 0x55000000;   
  101.       
  102.     GPIOD->OTYPER &= 0xFFFF0FFF; //设置PD12,13,14,15推挽输出  
  103.       
  104.     GPIOD->OSPEEDR &= 0x00FFFFFF; //PD12,13,14,15 速度100m  
  105.     GPIOD->OSPEEDR |= 0xff000000;  
  106.       
  107.     SYSCFG->CMPCR = 0x00000001; //使用IO补偿单元,当GPIO速度超过50M的时候要考虑使用此设置  
  108.       
  109.     GPIOD->PUPDR &= 0x00FFFFFF;  //PD12,13,14,15 无上拉无下拉  
  110.  }  
  111.    
  112.  void key_init(void)  
  113.  {  
  114.     RCC->AHB1ENR |= 0x00000001; //使能GPIOA时钟  
  115.       
  116.     GPIOA->MODER &= 0xFFFFFFFC; //设置PA0输入  
  117.       
  118.     GPIOA->PUPDR &= 0xFFFFFFFC; //设置PA0为下拉,因为PA0的输入状态为1  
  119.     GPIOA->PUPDR |= 0x00000002;    
  120.  }  
  121.    
  122.  void key_scan(void)  
  123.  {  
  124.     if(KEY1==1)     // 如果按键按下  
  125.     {  
  126.         Delay(10);  //去抖  
  127.         if(KEY1==1) // 如果按键按下  
  128.         {  
  129.             LED1=!LED1; //LED灯亮  
  130.             while(KEY1==1);//松手检测  
  131.         }  
  132.     }  
  133.  }  
  134.    
  135.  void Delay(uint32_t nTime)  
  136.  {   
  137.    Gb_TimingDelay = nTime;  
  138.    
  139.    while(Gb_TimingDelay != 0);  
  140.  }  
  141.    
  142.  void SysTick_Handler(void)  
  143.  {  
  144.    if (Gb_TimingDelay != 0x00)  
  145.    {   
  146.      Gb_TimingDelay--;  
  147.    }  
  148.  }  
  149.    


说明:以上程序是在以下两个资料下修改而成的。

(1)“STM32F407VG用位带别名区实现IO位操作例程”(杨年荣) http://wenku.baidu.com/view/4057a658804d2b160b4ec083.html

(2)“stm32f407学习之四————GPIO(操作寄存器)”  http://blog.csdn.net/w471176877/article/details/7957171


原创粉丝点击