`
jiasongmao
  • 浏览: 666920 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

初学stm32,对GPIO的理解(非常详细的源码解释说明)

 
阅读更多

转自:http://www.51hei.com/bbs/dpj-128101-1.html

 

#include "stm32f10x.h"   
#include "gpio.h"

//对于STM32  GPIO一般用法配置(这里不包括复用功能),以下的说明可以应用点亮灯多种方式
void GPIO_Configure_GPIOA(void)
{
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//设置时钟,针对GPIOA时钟使能
        /*        为什么要设置时钟呢???
        任何外设都需要时钟,51单片机,stm32,430等等,
        因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。
        stm32之所以是低功耗,他将所有的门都默认设置为disable,在你需要用哪个门的时候,
        开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以,
        其他的没用到的可以还是disable,这样耗能就会减少。
        stm32的时钟是有分工的,并且每类时钟的频率不一样,因为没必要所有的时钟都是最高频率,只要够用就行,
        好比一个门出来水流大小,我只要洗脸,但是出来的是和洪水一样涌出来的水,那就gg了,消耗能源也多,
        所以不同的时钟也会有频率差别,或者在配置的时候可以配置时钟分频。
        */
       
       
        GPIO_InitTypeDef GPIO_InitStructure;//GPIO设备的初始化函数
         //GPIO_InitTypeDef是一个结构体类型同义字,其功能是定义一个结构体,
        //该结构体有三个成员分别是 u16类型的GPIO_Pin、
//        GPIOSpeed_TypeDef 类型的GPIO_Speed  和GPIOMode_TypeDef 类型的GPIO_Mode。即以下三种:
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//普通推挽输出
        //GPIO有8种工作模式(4种输入模式和4种输出模式):
        /*
        4种输入模式:
        上拉输入模式(GPIO_Mode_IPU)-->在默认状态下(GPIO引脚无输入),读取得的GPIO引脚
        数据为1,高电平。
       
        而下拉输入模式(GPIO_Mode_IPD)则相反。在默认状态下(GPIO引脚无输入),读取得的GPIO引脚
        数据为0,低电平。
       
        浮空输入模式(GPIO_Mode_IN_FLOATING)在芯片内部既没有接上拉,也没有接下拉电阻,
        经由触发器输入。这种模式用于标准的通信协议如I2C、USART的接收端
       
        模拟输入模式(GPIO_Mode_AIN)则关闭了施密特触发器,不接上、下拉电阻,经由另一线路
        把电压信号传送到片上外设模块。如传送至ADC模块,由ADC采集电压信号。所以使用ADC外设时,必须设置为模拟输入模式
       
        4种输出模式:
        普通推挽输出(GPIO_Mode_Out_PP)一般应用在输出电平为0和3.3伏的场合
       
        普通开漏输出(GPIO_Mode_Out_OD)一般在电平不匹配的场合,如需要输出5伏的高电平,就需要在外部接一个
        上拉电阻,电源为5伏,把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5伏的电平
       
        复用推挽输出(GPIO_Mode_AF_PP),是根据GPIO的复用功能来选择的,如GPIO的引脚用作串口的输出,
        则使用复用推挽输出模式。
       
        复用开漏输出(GPIO_Mode_AF_OD),同理,其用在IC、SMBUS这些需要线与功能的复用场合
        在使用任何一种开漏模式时,都需要接上拉电阻。
        */
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//针对某组的一个引脚进行初始化
        //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;//针对某组的两个引脚进行初始化
        //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//针对某组的16个引脚进行初始化
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        /*
         又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,
         用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,
         达到最佳的噪声控制和降低功耗的目的。)

    可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。

        (如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?)

        如果信号频率为10MHz,而你配置了2MHz的带宽,则10MHz的方波很可能就变成了正弦波。
        就好比是公路的设计时速,汽车速度低于设计时速时,可以平稳地运行,
        如果超过设计时速就会颠簸,甚至翻车。

        关键是: GPIO的引脚速度跟应用相匹配,速度配置越高,噪声越大,功耗越大。

        带宽速度高的驱动器耗电大、噪声也大,带宽低的驱动器耗电小、噪声也小。
        使用合适的驱动器可以降低功耗和噪声

        比如:高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,
        这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,
        但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。
        关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。
        */
        GPIO_Init(GPIOA,&GPIO_InitStructure);//进行GPIOA初始化
}

void Delay_ms(u16 ms)
{
        int i;
        while(ms--)
        {
                i = 12000;
                while(i--);
        }
               
}

void GPIO_Achieve(u8 n,u16 ms)
{
//        u8 Readoutbit;
//        u16 Readoutdate;
        if(n == 0)
        {
                GPIO_ResetBits(GPIOA,GPIO_Pin_1);//设置PA0引脚为低电平,清除引脚位
                Delay_ms(ms);//不精准的延时函数,毫秒单位
               
               
                /*这是GPIO_ResetBits(GPIOx,GPIO_Pin)代码
                void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
        {
  //Check the parameters
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  GPIOx->BRR = GPIO_Pin;//位复位寄存器赋值(将某个引脚变为低电平)
        }
                */
               
               
                //Readoutbit = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);//将PA0引脚输出的值赋给Readoutbit
                //Readoutdate = GPIO_ReadOutputData(GPIOA);//将PA所有引脚输出的值赋给Readoutdate
               
                //GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);//获取PA0引脚的值
                //GPIO_ReadInputData(GPIOA);//获取PA所有引脚的值
                //GPIO_WriteBit(GPIOA,GPIO_Pin_0,RESET);//将RESET值写入给PA0引脚(其实就是将PA0引脚置0)
                //GPIO_Write(GPIOA,0xffff);//将0xffff值写入PA端口(其实就是将PA所有引脚置1)
        }
        else
        {
                GPIO_SetBits(GPIOA,GPIO_Pin_1);//设置PA0引脚为高电平,置位引脚
                Delay_ms(ms);
                /*
                void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
        {
   //Check the parameters
                assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
                assert_param(IS_GPIO_PIN(GPIO_Pin));
                GPIOx->BSRR = GPIO_Pin;//位置位寄存器赋值(将某个引脚变为高电平)
        }
                */       
                //Readoutbit = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);
                //Readoutdate = GPIO_ReadOutputData(GPIOA,GPIO_Pin_0);
        }
}
/*
注释:
GPIOx->BSRR= GPIO_Pin;-----------位置位寄存器---这是单个引脚的
GPIOx->BRR= GPIO_Pin;------------位复位寄存器---这是单个引脚的
GPIOx-ODR= PortVal;--------------端口输出寄存器---这是16个引脚的
GPIOx-IDR= PortVal;--------------端口输入寄存器---这是16个引脚的


对于GPIO来说,还有其他函数

以上,是我对GPIO的部分理解,有些可能理解不到位,请谅解(有些是从网上查找的)
*/

 

 

 

分享到:
评论

相关推荐

    STM32的像51单片机一样操作STM32的GPIO

    在提供的"实验6-像51单片机一样操作STM32的GPIO"文件中,你应该能找到详细的代码示例和注释,这对于初学者理解STM32的GPIO操作非常有帮助。通过实践和学习,你可以逐步掌握STM32的GPIO编程技巧,为后续的项目开发...

    STM32GPIO例子

    这些示例代码可以帮助理解STM32 GPIO的基本操作,对于理解和使用STM32进行嵌入式开发非常有帮助。 学习STM32 GPIO的例子,你将接触到的关键步骤包括: - 初始化GPIO端口:设置端口的工作模式、速度、输出类型等。 -...

    Stm32Gpio_stm32_GPIO_

    STM32 GPIO(通用输入/输出)是STM32微控制器系列中的一个重要组成部分,它提供了对外部设备的接口,使得MCU能够与开关、LED、传感器等硬件进行通信。在这个基础例程中,我们将深入探讨STM32 GPIO的配置、读写以及...

    STM32的GPIO的编程

    从提供的文件内容中,我们可以提炼出以下关于STM32 GPIO编程的知识点: 1. STM32概述:STM32系列微控制...对于初学者来说,理解这些要点能够有助于他们快速上手STM32微控制器的GPIO编程,并有效地将理论应用到实践中。

    STM32_GPIO.rar_stm32 gpio_stm32GPIO

    提供的压缩包"STM32_GPIO.rar"内含现成的工程代码,可以帮助开发者快速理解和应用STM32的GPIO功能。这个工程可能包含了初始化配置、中断处理函数、读写GPIO的示例代码,以及必要的头文件和链接库。对于初学者来说,...

    STM32关于GPIO的控制程序

    9. **文档理解**:提供的详细讲解文档对于初学者来说是宝贵的资源,可以帮助理解STM32 GPIO的工作原理,掌握配置和编程方法。 10. **实践应用**:通过实际项目练习,如点亮LED灯、控制继电器、读取传感器数据等,能...

    stm32_GPIO.rar_STM32 keil_STM32_GPIO.rar

    对于初学者,理解STM32 GPIO的基本原理和配置方法至关重要,因为它是实现与外部设备交互的基础。同时,配合作者的博文,可以更深入地学习STM32 GPIO的实际应用和调试技巧,这对于嵌入式开发人员来说是非常宝贵的资源...

    stm32 GPIO 实例教程 解析

    ### STM32 GPIO 实例教程解析 #### 一、STM32 GPIO 输入输出管脚配置 ...以上内容涵盖了STM32 GPIO配置的基础知识以及一些具体的配置示例,希望能帮助初学者更好地理解和掌握STM32 GPIO的相关概念和技术细节。

    STM32 关于GPIO AFIO的用法及其相关库函数

    STM32的开发过程中,经常需要参考官方的参考手册,这本手册详细列出了所有寄存器的配置方法和功能说明。对于初学者而言,可能难以直接从手册中快速找到需要的配置方法,因此整理一份资料以便快速查阅和理解这些配置...

    STM32的GPIO输入-(软件延时方式)(直接操作寄存器)

    对于初学者来说,这是一份宝贵的资料,可以帮助他们深入理解STM32 GPIO的工作原理和实际应用。通过学习和实践这个教程,开发者能够更好地掌握STM32的GPIO控制,为进一步的嵌入式系统开发打下坚实基础。

    STM32-GPIO-的一些入门资料.rar

    STM32是一款基于ARM Cortex-M内核的微控制器系列,由意法半导体(STMicroelectronics)生产。在STM32的众多功能中,GPIO(General Purpose...这份PDF文档应该会详细解释这些内容,帮助初学者快速掌握STM32 GPIO的使用。

    GPIO.rar_GPIO stm32_stm32 gpio

    这个简单的示例程序可以帮助初学者快速理解STM32 GPIO的基本用法,进一步学习时可以尝试更复杂的GPIO应用,如GPIO扩展、中断处理、外部中断等。通过实践,开发者能够熟练掌握STM32 GPIO的使用,为后续的项目开发打下...

    gpio.zip_stm32f103 gpio_stm32f103 keil

    在本项目中,"gpio.zip_stm32f103 gpio_stm32f103 keil" 提供了基于STM32F103的GPIO编程实例,采用Keil uVision 3作为开发环境,非常适合初学者学习STM32的基础操作。 Keil uVision是一款强大的嵌入式开发工具,...

    STM32的GPIO输入-(软件延时方式)(库函数)

    这份"STM32的GPIO输入-(软件延时方式)(库函数)"的学习资料应该包含了详细的代码注释和说明,帮助初学者理解如何使用STM32的库函数实现GPIO输入,并通过软件延时保证信号的稳定读取。通过实践这个实验,你可以深入...

    CEPARK-IAR_Stm32Gpio.rar_CEPARK ARM_Stm32Gpio

    6. **示例代码**:压缩包中的CEPARK IAR_Stm32Gpio文件可能包含了示例代码,演示了如何初始化GPIO、设置工作模式、读写GPIO值以及配置中断等基本操作,这对于初学者理解STM32 GPIO的使用非常有帮助。 7. **应用实例...

    STM32gpio控制

    STM32 GPIO(通用输入/输出)是STM32微控制器系列中不可或缺的一部分,它允许开发者通过编程方式控制芯片上的引脚,实现对外部设备的开关、读取信号等多种功能。在嵌入式系统设计中,GPIO控制是基础且至关重要的,...

    GPIO.rar_GPIO stm32_STM32点亮灯_stm32 gpio_stm32单片机 灯

    这些代码对于初学者来说是宝贵的资源,通过阅读和实践,可以更好地理解和掌握STM32 GPIO的使用。在实际项目中,GPIO不仅用于点亮LED,还可以控制各种外围设备,如传感器、电机、通信接口等,是STM32开发的基础。

    从51到ARM裸机开发实验(004)STM32F401VE GPIO实验仿真电路图和源码

    1. **STM32 GPIO结构**:理解STM32F401VE的GPIO结构,包括GPIO端口(如GPIOA、GPIOB等)、引脚(如PA0、PB7等)以及相关的寄存器配置,如MODER、OTYPER、OSPEEDR、PUPDR等,这些寄存器控制GPIO的行为。 2. **GPIO...

    stm32 GPIO

    根据提供的标题“stm32 GPIO”以及描述“快速入门stm32”,...掌握STM32 GPIO的基本配置方法和常见应用场景对于初学者来说是非常重要的。通过不断实践和探索,可以更好地利用STM32 GPIO解决实际问题,提高开发效率。

Global site tag (gtag.js) - Google Analytics