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.
  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/liangzid/p/10910037.html
Copyright © 2011-2022 走看看