zoukankan      html  css  js  c++  java
  • STM32F1-GPIO的操作

    GPIO 即通用输入输出口。凡事都要熟悉,熟能生巧。一定要掌握MDK软件的工程操作方法。

    对于GPIO的操作。

    Project里面要有以下几个文件夹(开发之前需要包含相应的库文件,这里默认已经包含)

    STEP BY STEP(以按键和LED灯为例):

    1.在USER文件夹里新建对应功能的C文件和H文件(这里对应 Key.c  Key.h  LED.c   LED.h)其中C文件用来进行对应外设的硬件配置,H文件是申明对应C文件里面定义的配置函数。注意H文件开头要检查以下时候需要检查以下重复定义的情况, 如下:

    #ifndef __EXTI_H
    #define __EXTI_H

    2.下面重点总结下功能C文件里面对应外设的硬件配置过程。

    STEP1建立数据结构,配置工作时钟

     STM32这种单片机和51单片机的很大不同就是,对应不同功能的硬件有相应的工作时钟与其对应。这个时钟是必不可少的,就像人的心脏一样。

    先建立数据结构GPIO_InitTypeDef GPIO_InitStructure;

    然后配置时钟,RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);

    可能每次你都不清楚,为什么硬件配置要那么来,从库开发的角度来说,要学会去看库的帮助文件,打开之后找到Data Structure这一块,找到对应的GPIO的数据结构。

    而库开发不同关于寄存器开发的地方是,库是间接的用数据结构去填充寄存器。所以首先得要有这个对应的数据结构,也就是这里的 GPIO_InitStructure;

    打开帮助中GPIO_InitTypeDef 这个结构体,里面的变量结构就可以看出来,分别是:管脚(pin),速度(speed),工作模式(Mode)

    00091 typedef struct
    00092 {
    00093   uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
    00094                                       This parameter can be any value of @ref GPIO_pins_define */
    00095 
    00096   GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
    00097                                       This parameter can be a value of @ref GPIOSpeed_TypeDef */
    00098 
    00099   GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
    00100                                       This parameter can be a value of @ref GPIOMode_TypeDef */
    00101 }GPIO_InitTypeDef;

    然后依照每个变量的值的情况进行赋值如:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;其实在GPIO_InitStructure结构体中的变量都是枚举型的,也就是说它的值都是一定的,是个常数。

    void GPIO_Init ( GPIO_TypeDef GPIOx,
        GPIO_InitTypeDef GPIO_InitStruct 
      )

    2.初始化寄存器(数据结构映射到寄存器中)

    
    
    到这里还没有好,这一步仅仅是把你申明的一个结构体变量的每个部分确定了,还没有映射到寄存器中去,那么怎么映射到寄存器中去呢?库开发早就已经设计了一个映射的功能函数在帮助里面可以看到,这个函数的用法如:GPIO_Init(GPIOC, &GPIO_InitStructure);
    #include "bsp_led.h"   
    
     /**
      * @brief  初始化控制LED的IO
      * @param  无
      * @retval 无
      */
    void LED_GPIO_Config(void)
    {        
            /*定义一个GPIO_InitTypeDef类型的结构体*/
            GPIO_InitTypeDef GPIO_InitStructure;
    
            /*开启LED的外设时钟*/
            RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); 
    
            /*选择要控制的GPIOB引脚*/                                                               
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;    
    
            /*设置引脚模式为通用推挽输出*/
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
    
            /*设置引脚速率为50MHz */   
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    
            /*调用库函数,初始化GPIOB0*/
            GPIO_Init(GPIOB, &GPIO_InitStructure);    
            
            /*选择要控制的引脚*/                                                               
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
          
            /*调用库函数,初始化GPIOC*/
            GPIO_Init(GPIOC, &GPIO_InitStructure);
    
            /* 关闭所有led灯    */
            GPIO_SetBits(GPIOB, GPIO_Pin_0);
            
            /* 关闭所有led灯    */
            GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);     
    }
    View Code
    
    
    LED头文件内容
    ***********************************
    #ifndef __LED_H
    #define    __LED_H
    
    #include "stm32f10x.h"
    
    void LED_GPIO_Config(void);
    
    #endif /* __LED_H */
    View Code

     结论:

    库开发的精髓是:初始化结构体和初始化函数的配合使用!

    GPIO的设置分为四步

    1.申明结构体     GPIO_InitTypeDef  GPIO_InitStructure;

    2.设置时钟        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);

    3.结构体赋值     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

                           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    4.初始化寄存器  GPIO_Init(GPIOC, &GPIO_InitStructure);

     

    设置多个GPIO的时候,如果Mode和Speed都是一样的,就只可以设置一次就行。

     
    厚积薄发,开物成务。 德才兼备、知行合一。 自强不息,厚德载物。
  • 相关阅读:
    05 drf源码剖析之认证
    04 drf源码剖析之版本
    03 drf源码剖析之视图
    02 drf源码剖析之快速了解drf
    OA之为用户设置角色和为用户设置权限
    EasyUI之datagrid的使用
    C#之反射
    EasyUI之Layout布局和Tabs页签的使用
    Memcached的使用
    Log4Net的简单使用
  • 原文地址:https://www.cnblogs.com/robohou/p/5898046.html
Copyright © 2011-2022 走看看