STM32F7 IO输出

1. STM32F7 IO资源:

  • 九组IO:x=A/B/C/D/E/F/G/H/I
  • 可实现八种模式:
    • 输入浮空
    • 输入上拉
    • 输入下拉
    • 模拟输入
    • 开漏输出
    • 推挽输出
    • 推挽式复用功能
    • 开漏式复用功能

2. 初始化相关寄存器:

  • MODER:控制GPIO端口工作模式
    • 这里写图片描述
    • 默认为输入模式
  • OTYPER:控制输出类型
    • 这里写图片描述
    • 推挽输出:可以直接用于驱动负载电路,无电阻分压
    • 输出开漏:不输出电压,低电平接地,高电平不接地,无法输出高电平
  • OSPEEDR:控制GPIOx的输出速度
    • 这里写图片描述
  • PUPDR:控制GPIOx的上拉/下拉
    • 这里写图片描述
    • 关于上下拉的设定,左边为上拉及输出一时为低电平,输出0时为高电平,下拉反之。图为上拉输出,输出高电平时,则开关闭合
      这里写图片描述
  • 初始化方法:
    • 配置相关的结构体并调用以下函数:
        typedef struct {
        uint32_t Pin; //指定IO口
        uint32_t Mode;//模式设置
        uint32_t Pull;//上下拉设置
        uint32_t Speed;//速度设置
        uint32_t Alternate;//复用映射配置
        }GPIO_InitTypeDef;
        void HAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef *GPIO_Init);
    //例子:
    GPIO_InitTypeDef GPIO_Initure;
    GPIO_Initure.Pin=GPIO_PIN_0; //PB0 GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);

上面代码的意思是设置 PB0 端口为推挽输出模式,输出速度为高速,上拉。

3. 实现IO口输出的控制

  • 相关寄存器:
    • ODR寄存器:
      • 这里写图片描述
      • 1为高电平,0为低电平
    • BSRR寄存器:
      • 这里写图片描述
      • 对于低16位(0-15),我们往相应的位写1,那么对应的IO口会输出高电平,往相应的位写0, 对 IO 口没有任何影响。高 16 位(16-31)作用刚好相反,对相应的位写 1 会输出低电平,写 0 没有任何影响。也就是说,对于 BSRR 寄存器,你写 0 的话,对 IO 口电平是没有任何影响的。 我们要设置某个 IO 口电平,只需要相关位设置为 1 即可。而 ODR 寄存器,我们要设置某个 IO 口电平,我们首先需要读出来 ODR 寄存器的值,然后对整个 ODR 寄存器重新赋值来达到设置
        某个或者某些 IO 口的目的,而 BSRR 寄存器,我们就不需要先读,而是直接设置即可,这在 多任务实时操作系统中作用很大。
    • 设置方法如下:
         GPIOA->BSRR=1<<1; //设置 GPIOA.1 为高电平 
         GPIOA->BSRR=1<<(16+1)//设置 GPIOA.1 为低电平
         //使用函数来进行操作:
         void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin, GPIO_PinState PinState);
         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET); //GPIOB.5输出高
         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET); //GPIOB.5 输出低

通过以上方法配合时延函数,能够实现IO端口的数据输出

  • IDR寄存器:
    • 这里写图片描述
    • 该寄存器用于读取IO的电平,1为高电平,2为低电平
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//例子
HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_5);//读取 PF5 的输入电平

操作步骤:

  1. 使能 IO 口时钟,调用函数为__HAL_RCC_GPIOX_CLK_ENABLE(其中 X=A~K)。
  2. 初始化 IO 参数。调用函数 HAL_GPIO_Init();
  3. 操作 IO 输入输出。操作 IO 的方法就是上面讲解的方法。
//例子
//初始化 PB1 为输出.并使能时钟 
//LED IO 初始化
void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE();
//开启 GPIOB 时钟
    GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0 
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 
    GPIO_Initure.Pull=GPIO_PULLUP; //上拉 
    GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB0 置 1 ,默认灯灭
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB1 置 1 ,默认灯灭 
}
//在循环函数添加以下内容实现IO口交替输出:
while(1)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
//LED0 对应引脚 PB1 拉低,亮,等同于 LED0(0)
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
//LED1 对应引脚 PB0 拉高,灭,等同于 LED1(1)
    delay_ms(500); //延时 500ms HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
//LED0 对应引脚 PB1 拉高,灭,等同于 LED0(1)
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
//LED1 对应引脚 PB0 拉低,亮,等同于 LED1(0)
    delay_ms(500); //延时 500ms 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值