stm32f407之GPIO(操作寄存器)

四、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.     通过复位置位寄存器和输入输出数据寄存器进行操作。



程序:

/************************************
    标题:操作GPIO的练习
    软件平台:IAR for ARM6.21
    硬件平台:stm32f4-discovery
    主频:168M
    
    author:小船
    data:2012-01-16
*************************************/

#include <stm32f4xx.h> 

uint32_t Gb_TimingDelay;

void Delay(uint32_t nTime);

void main ()
{   
  SysTick_Config(SystemCoreClock / 1000);	 //设置systemtick一毫秒中断
  
  RCC->AHB1ENR |= 0x00000008; 	//使能GPIOD时钟
  RCC->APB2ENR |= (1<<14);  	//使能syscfg时钟
  
  GPIOD->MODER &= 0x00FFFFFF;	 //设置PD12,13,14,15输出
  GPIOD->MODER |= 0x55000000; 
  
  GPIOD->OTYPER &= 0xFFFF0FFF; 	//设置PD12,13,14,15推挽输出
  
  GPIOD->OSPEEDR &= 0x00FFFFFF; 	//PD12,13,14,15 速度100m
  GPIOD->OSPEEDR |= 0xff000000;
  
  SYSCFG->CMPCR = 0x00000001; 	//使用IO补偿单元,
//当GPIO速度超过50M的时候要考虑使用此设置
  
  GPIOD->PUPDR &= 0x00FFFFFF;  	//PD12,13,14,15 无上拉无下拉
  
  GPIOD->BSRRH = 0xf000; 	 //reset register GPIOx_BSRRH, write only
                          	//set register GPIOx_BSRRL, write only
  
  while(1)
  {
      GPIOD->BSRRH = 0xf000;
      GPIOD->BSRRL = 0x1000; 
      Delay(500);
      
      GPIOD->BSRRH = 0xf000;
      GPIOD->BSRRL = 0x1000<<1;
      Delay(500);
      
      GPIOD->BSRRH = 0xf000;
      GPIOD->BSRRL = 0x1000<<2;
      Delay(500);
      
      GPIOD->BSRRH = 0xf000;
      GPIOD->BSRRL = 0x1000<<3;
      Delay(500);
  }
}

void Delay(uint32_t nTime)
{ 
  Gb_TimingDelay = nTime;

  while(Gb_TimingDelay != 0);
}


void SysTick_Handler(void)
{
  if (Gb_TimingDelay != 0x00)
  { 
    Gb_TimingDelay--;
  }
}





  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: 下面是一个简单的STM32F407的GPIO口初始化程序示例(以PA0引脚为例): ```c // 引入头文件 #include "stm32f4xx.h" void GPIO_Init(void) { // 使能GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; // 设置GPIO口为输出模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO口输出速率为2MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 设置GPIO口输出类型为推挽输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置GPIO口为上拉模式 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 设置PA0引脚为输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 初始化GPIOA0 GPIO_Init(GPIOA, &GPIO_InitStructure); } ``` 以上代码首先使能了GPIOA的时钟,然后定义了一个GPIO_InitTypeDef类型的结构体变量GPIO_InitStructure,用于配置GPIO口初始化的参数。接着,将GPIO口的输出模式、输出速率、输出类型、上拉/下拉模式等参数设置好后,通过GPIO_Init函数将GPIO口初始化完成。其中,PA0引脚设置为输出模式,其对应的GPIO_Pin_0表示该引脚。 ### 回答2: STM32F407的GPIO口初始化程序通常包括以下几个步骤: 1. 使能GPIO端口时钟:首先需要使能对应GPIO端口的时钟,以便可以对其进行配置和使用。通过向RCC_AHB1ENR寄存器中的对应位写入1,可以使能GPIO端口的时钟。例如,若要使能GPIOA端口的时钟,可以使用以下代码:RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; 。 2. 配置GPIO端口的输出模式或输入模式:根据需要,配置GPIO端口的输出模式或输入模式。对于输出模式,可以设置引脚为推挽输出或开漏输出,并设置输出的速度和上拉/下拉电阻。对于输入模式,可以设置引脚为浮空输入或带上拉/下拉电阻的输入。可以通过向对应GPIO端口的MODER、OTYPER、OSPEEDR和PUPDR寄存器中写入相应的值来进行配置。 3. 配置GPIO引脚的功能:根据需要,配置GPIO引脚的功能。每个GPIO端口的引脚可以有多种功能,例如通用输入输出、复用功能、模拟功能等。可以通过向对应GPIO端口的AFR寄存器中的相应位写入相应的值来选择引脚的功能。 4. 初始化GPIO引脚:根据配置的模式和功能,初始化GPIO引脚。对于输出模式,可以通过向对应GPIO端口的BSRR或BRR寄存器中的相应位写入1或0,来设置引脚的电平。对于输入模式,可以读取对应GPIO端口的IDR寄存器来获取引脚的电平。 需要注意的是,在配置GPIO口初始化程序时,应确保引脚的配置和功能选择正确,并符合所需的操作要求。同时,应根据具体的应用场景,选择合适的GPIO口初始化程序,以满足系统的需求。 ### 回答3: STM32F407的GPIO口初始化程序包含以下几个步骤: 1. 首先,需要使能GPIO端口的时钟,通过RCC接口来实现。例如,如果要初始化GPIOA口,可以使用RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE)函数来使能GPIOA端口的时钟。 2. 接下来,设置GPIO口的模式,包括输入、输出和复用功能。可以使用GPIO_InitTypeDef结构体来定义GPIO的初始化配置参数。例如,要将GPIOA的引脚1配置为输出模式,可以设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1和GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); 这样,GPIOA的引脚1就被初始化为输出模式了。 3. 如果需要配置GPIO口的上下拉电阻,可以使用GPIO_InitStructure.GPIO_PuPd参数来设置。例如,设置引脚1的上拉电阻可以使用GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP: GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 4. 如果需要配置GPIO口的输出速度,可以使用GPIO_InitStructure.GPIO_Speed参数来设置。例如,设置引脚1的输出速度为50MHz可以使用GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz: GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 5. 最后,调用GPIO_Init函数来完成GPIO配置的初始化。例如: GPIO_Init(GPIOA, &GPIO_InitStructure); 通过以上步骤,我们就可以完成STM32F407的GPIO口的初始化程序。根据需要,可以对多个GPIO端口进行相应的配置,实现不同的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值