stm32f407之GPIO(操作寄存器)

来源:互联网 发布:eclipse js禁用ctrl 编辑:程序博客网 时间:2024/05/16 19:41

作者:w471176877

转自:http://blog.csdn.net/w471176877/article/details/7957171


四、GPIO




       stm32f407VG这款单片机上共有PA-PE共5×16共80个复用IO口,每个通用I / O端口有4个32位配置寄存器(GPIOx_MODERGPIOx_OTYPER GPIOx_OSPEEDR GPIOx_PUPDR),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位的置位/复位寄存器(GPIOx_BSRR),32位锁定寄存器(GPIOx_LCKR)和两个32位的备用功能选择寄存器(GPIOx_AFRHGPIOx_AFRL)。

 

 

 

设置步骤:

1.     使能相关时钟

2.     设置相应的IO口为输入或输出

3.     设置输入\输出的类型

4.     设置输出的速度(如果设置为输入,此步跳过)

5.     如果输出速度>=50M,开启补偿单元

6.     设置上拉下拉寄存器

7.     通过复位置位寄存器和输入输出数据寄存器进行操作。



程序:

[cpp] view plaincopy
  1. /************************************ 
  2.     标题:操作GPIO的练习 
  3.     软件平台:IAR for ARM6.21 
  4.     硬件平台:stm32f4-discovery 
  5.     主频:168M 
  6.      
  7.     author:小船 
  8.     data:2012-01-16 
  9. *************************************/  
  10.   
  11. #include <stm32f4xx.h>   
  12.   
  13. uint32_t Gb_TimingDelay;  
  14.   
  15. void Delay(uint32_t nTime);  
  16.   
  17. void main ()  
  18. {     
  19.   SysTick_Config(SystemCoreClock / 1000);    //设置systemtick一毫秒中断  
  20.     
  21.   RCC->AHB1ENR |= 0x00000008;    //使能GPIOD时钟  
  22.   RCC->APB2ENR |= (1<<14);     //使能syscfg时钟  
  23.     
  24.   GPIOD->MODER &= 0x00FFFFFF;     //设置PD12,13,14,15输出  
  25.   GPIOD->MODER |= 0x55000000;   
  26.     
  27.   GPIOD->OTYPER &= 0xFFFF0FFF;   //设置PD12,13,14,15推挽输出  
  28.     
  29.   GPIOD->OSPEEDR &= 0x00FFFFFF;  //PD12,13,14,15 速度100m  
  30.   GPIOD->OSPEEDR |= 0xff000000;  
  31.     
  32.   SYSCFG->CMPCR = 0x00000001;    //使用IO补偿单元,  
  33. //当GPIO速度超过50M的时候要考虑使用此设置  
  34.     
  35.   GPIOD->PUPDR &= 0x00FFFFFF;    //PD12,13,14,15 无上拉无下拉  
  36.     
  37.   GPIOD->BSRRH = 0xf000;      //reset register GPIOx_BSRRH, write only  
  38.                             //set register GPIOx_BSRRL, write only  
  39.     
  40.   while(1)  
  41.   {  
  42.       GPIOD->BSRRH = 0xf000;  
  43.       GPIOD->BSRRL = 0x1000;   
  44.       Delay(500);  
  45.         
  46.       GPIOD->BSRRH = 0xf000;  
  47.       GPIOD->BSRRL = 0x1000<<1;  
  48.       Delay(500);  
  49.         
  50.       GPIOD->BSRRH = 0xf000;  
  51.       GPIOD->BSRRL = 0x1000<<2;  
  52.       Delay(500);  
  53.         
  54.       GPIOD->BSRRH = 0xf000;  
  55.       GPIOD->BSRRL = 0x1000<<3;  
  56.       Delay(500);  
  57.   }  
  58. }  
  59.   
  60. void Delay(uint32_t nTime)  
  61. {   
  62.   Gb_TimingDelay = nTime;  
  63.   
  64.   while(Gb_TimingDelay != 0);  
  65. }  
  66.   
  67.   
  68. void SysTick_Handler(void)  
  69. {  
  70.   if (Gb_TimingDelay != 0x00)  
  71.   {   
  72.     Gb_TimingDelay--;  
  73.   }