zoukankan      html  css  js  c++  java
  • 2018-7-17 GPIO口之输出模式

    2018-7-17 GPIO口之输出模式

    stm32 笔记 一 GPIO(一)

    存放地址:./FWLib/stm32f10x_gpio.c

    IO口可以配置的8种模式:

    1. 输入浮空
    2. 输入上拉
    3. 输入下拉
    4. 模拟输入
    5. 开漏输出
    6. 推挽输出
    7. 推挽式复用功能
    8. 开漏复用功能

    stm32IO口配置表
    stm32IO口配置表

    stm32输出模式配置表

    端口低配置寄存器 CRL

    1. 复位值:0x4444 4444(相当于是浮空输入)
    2. 控制每个IO端口(A~G)的低八位模式
    3. 每个IO端口的位占用CRL的四个位,高两位是CNF,低两位是MODE

    常用配置:

    1. 0x0:模拟输入模式(ADC用)
    2. 0X3:推免输出模式(做输出口用,50M速率)

    CRH与CRL相似,只不过控制的是高八位。

    GPIO相关函数之 GPIO_init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct):

    参数说明

    GPIO_TypeDef:代表的是指定的io接口(GPIOA~GPIOG)

    GPIO_InitTypeDef* : 初始化参数结构体指针

    结构体的定义为:

    typedef struct
    {
      uint16_t GPIO_Pin;           /*这里的Pin是用来指定对哪一个或者哪些端口进行初始化*//*!< Specifies the GPIO pins to be configured.
                                          This parameter can be any value of @ref GPIO_pins_define */
    
      GPIOSpeed_TypeDef GPIO_Speed;  /*IO串口的传输速度*//*!< Specifies the speed for the selected pins.
                                          This parameter can be a value of @ref GPIOSpeed_TypeDef */
    
      GPIOMode_TypeDef GPIO_Mode;    /*IO端口的输入输出模式(前面已经给出)*//*!< Specifies the operating mode for the selected pins.
                                          This parameter can be a value of @ref GPIOMode_TypeDef */
    }GPIO_InitTypeDef;

    在跑马灯示例中对一个接口的初始化代码为:

    1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置 
    2. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 
    3. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz 
    4. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8 
    5. GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高 

    其中对Mode属性的初始化在MDK中是用一个枚举进行定义的:

    1. typedef enum 
    2. { GPIO_Mode_AIN = 0x0,//模拟输入 
    3. GPIO_Mode_IN_FLOATING = 0x04,//浮空输入 
    4. GPIO_Mode_IPD = 0x28,//下拉输入 
    5. GPIO_Mode_IPU = 0x48,//上拉输入 
    6. GPIO_Mode_Out_OD = 0x14,//开漏输入 
    7. GPIO_Mode_Out_PP = 0x10,//通用推免输出 
    8. GPIO_Mode_AF_OD = 0x1C,//复用开漏输出 
    9. GPIO_Mode_AF_PP = 0x18//复用推免 
    10. }GPIOMode_TypeDef; 

    端口输入数据寄存器 IDR &&端口输出寄存器ODR

    IDR

    只能以16位的形式读出,只读(r)。低16位(对应着一个IO口的16个引脚)。
    可以通过读取这个寄存器的某个位的状态来获得那个IO口的引脚的电平状态。
    读取函数:

    1. uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 

    返回的是1(SET)或者0(RESET)。

    ODR

    只能以16位的形式输出,可读可写(rw)。可读相当于判断当前IO口的输出状态,而可写相当于控制IO口的输出电平是高还是低。
    读取函数:

    1. void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
    2. //示例代码:GPIO_Write(GPIOD,0x0100) //使PD8置高 这个定要认真理解!!!!! 

    BSRR寄存器——端口位设置/清除寄存器

    这个寄存器也可以控制端口的输出,首先给出这个寄存器的内部结构:
    BSRR寄存器结构和32位的用处

    对端口的低位(低16位)送1表示置1,高位置1表示置0;注意:所有的寄存器都是32位的
    例子:

    1. GPIOA ->BSRR=1<<1; //这里表示对AIO接口的1号端口(引脚)置高电平 
    2. GPIOA ->BSRR=1<<(16+1);//置低电平 

    在这里必须要解释一下这两行容易误导人的代码:首先控制的是A口的“1”号端口,这个“1”是代码中的<<右边的1,左边的1代表的是把右边的1的数置为1。
    由于之前的寄存器都是只有前16位有效,后16位不起作用,所以这里没有太好的理解。事实是这样的:一个端口对应着32位寄存器中的两个数字(比如
    0号端口对应着0和16,1号端口对应着1和(16+1),这就是上面的代码的原理)

    BRR寄存器——端口位清零寄存器

    功能与BSRR的高16位雷同。

    如若通过固件库函数来进行实现,则可以将之变为:

    1. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
    2. void GPIO_ResetBits(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)

    IO操作步骤总结:

    1. 使能IO口时钟;
    1. RCC_APB2PeriphClockCmd( ); 
    1. 初始化IO参数,调用GPIO_init();
    2. 利用上述的寄存器和固件库函数操作IO.
  • 相关阅读:
    vmware 安装 centos7
    Centos7 开机启动命令行模式
    Get、Post 提交的乱码问题
    RabbitMQ消息队列(一):详细介绍
    spring boot 整合 RabbitMq (注解)
    CF Tavas and Nafas
    HDU 2295 Radar (DLX + 二分)
    CF Drazil and Factorial (打表)
    CF Drazil and His Happy Friends
    CF Drazil and Date (奇偶剪枝)
  • 原文地址:https://www.cnblogs.com/liangzid/p/10910037.html
Copyright © 2011-2022 走看看