OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1987|回复: 1

GPIO初始化和状态如何判断?

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-12-16
在线时间
7 小时
发表于 2019-12-24 20:57:52 | 显示全部楼层 |阅读模式
设置PB12,13为上拉输入,PB14,15为推挽输出。实验:给PB12输入2.52V电压,判断是否为高,为高则PB14输出高电平。但是PB14没输出高电平,LED1也没有亮。请教为什么没有跳进if中,或者初始化出错了吗?

GPIO初始化程序

#include "sys.h"
#include "gpio.h"
//PB11,PB12,PB13设置成输入
void INIO_Init(void)
{
    RCC->APB2ENR|=1<<3;//使能PORTB时钟   
    GPIOB->CRH&=0XFF000FFF;//PB11,PB12,PB13设置成输入
    GPIOB->CRH&=0XFF888000;//PB11,PB12,PB13设置成上拉输入
}
//PB14,PB15设置成输出
void OUTIO_Init(void)
{
    RCC->APB2ENR|=1<<3;   
    GPIOB->CRH&=0X11FFFFFF;//PB14,PB15设置成输出
    GPIOB->CRH&=0X33FFFFFF;//PB14,PB15设置成推挽输出
    GPIOB->ODR|=1<<14;
    GPIOB->ODR|=1<<15;
}
主程序
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "gpio.h"

int main(void)
{
    Stm32_Clock_Init(9);     //系统时钟设置
    delay_init(72);         //延时初始化
    uart_init(72, 9600);     //串口初始化为 9600
    LED_Init();
    INIO_Init();
    OUTIO_Init();
    while(1)
    {
        LED0 = !LED0;
        delay_ms(50);        
        if(GPIOB->IDR&GPIO_IDR_IDR12)
        {
            LED1=!LED1;
            GPIOB->BSRR|=1<<14;
        }
        else if(GPIOB->IDR&GPIO_IDR_IDR13)
        {
            GPIOB->BSRR|=1<<15;
        }
    }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-12-16
在线时间
7 小时
 楼主| 发表于 2019-12-25 21:37:02 | 显示全部楼层
本帖最后由 刘泽鹏 于 2019-12-26 11:24 编辑

初始化很明显有问题啊。
void GPIO_Init(void)
{
        RCC->APB2ENR|=1<<3;//使能PORTB时钟
        GPIOB->CRH&=0X0000FFFF;//PB12,PB13,PB14,PB15清除之前的设置
        GPIOB->CRH|=0X33880000;//PB12,PB13设置成下拉输入,PB14,PB15设置成推挽输出
}
个人理解:
下拉输入是指没有高电平接入的时候,io的值为0,有高电平接入(百度2V以上,实验用了2.53V)的时候就是1。
推挽输出,不设置ODR时,应该默认是0的。实验确实如此。可执行PBout(14)=1,使其输出高电平3.25V。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 03:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表