IO初始化出错

Moderator: ESP_ZT

gezhia
Posts: 38
Joined: Thu Nov 24, 2022 10:45 am

IO初始化出错

Postby gezhia » Tue Jan 17, 2023 4:11 am

1.IO口设置成输出状态,实际执行出来的却是输入请问是什么原因?
2.IO口宏定义成数字时,直接赋值给gpio_reset_pin等函数会提示数据类型错误,需要在宏定义时加入(gpio_num_t)强制类型转换,不过例程都不需要,是怎么回事?

Code: Select all

#define LED_B ((gpio_num_t)4)
#define LED_W ((gpio_num_t)2)

    ESP_LOGI(TAG, "Hello, OB_helth!");

    st_key_queue = xQueueCreate(1, sizeof(enum SYS_KEY_STATE));
    power_state_Semaphore = xSemaphoreCreateBinary();

    gpio_reset_pin(LED_B);
    gpio_reset_pin(LED_W);

    gpio_set_direction(LED_B, GPIO_MODE_OUTPUT);
    gpio_set_direction(LED_W, GPIO_MODE_OUTPUT);

    gpio_set_level(LED_B, 1);
    gpio_set_level(LED_W, 0);

    ESP_LOGI(TAG, "LED INIT");
    
    
 I (315) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (325) app_main: Hello, OB_helth!
I (325) gpio: GPIO[4]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
I (335) gpio: GPIO[2]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
I (345) app_main: LED INIT
I (355) motor: MOTOR_deal


ESP_ZB2
Posts: 21
Joined: Wed Dec 28, 2022 12:33 pm

Re: IO初始化出错

Postby ESP_ZB2 » Tue Jan 17, 2023 11:05 am

  1. 1、你是怎么判断输入和输出的,输入和输出是一种相对的状态,假如你输出高电平,然后把引脚接GND,那么内部读取当然是低电平了,内部默认配置上拉电阻使能,相当于内部一个电阻接VCC,然后接单片机引脚,这只是一个状态,内部寄存器去读取当前引脚的电平,你可以外部去干扰它,也可以去读取程序输出设置的状态,一般不建议输出模式下外部强制改变状态,可能会烧掉单片机引脚。
  2. 2、我们的IO是采用枚举的方案实现的,是可以直接用数字去代替枚举变量,但是有的编译器的筛查等级比较高的话,就会识别出这是枚举类型的变量,不能用立即数,一般都会以警告的方式提醒,如果你想深入的理解这个知识点的话,可以去百度枚举enum的使用。

gezhia
Posts: 38
Joined: Thu Nov 24, 2022 10:45 am

Re: IO初始化出错

Postby gezhia » Wed Jan 18, 2023 3:17 am

谢谢回复!

对于输入输出状态的判断是根据程序运行后的LOG判断的,跟我写的程序不一致。

Code: Select all

I (315) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (325) app_main: Hello, OB_helth!
I (325) gpio: GPIO[4]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
I (335) gpio: GPIO[2]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
I (345) app_main: LED INIT
I (355) motor: MOTOR_deal

ESP_ZB2
Posts: 21
Joined: Wed Dec 28, 2022 12:33 pm

Re: IO初始化出错

Postby ESP_ZB2 » Wed Jan 18, 2023 6:25 am

  1. 你看到的打印是这个gpio_reset_pin()函数默认配置的打印,并不是你自己的配置,你可进入这个函数里面去查看,可以看到下面这个函数
  2. [Codebox=c file=Untitled.c]ESP_LOGI(GPIO_TAG, "GPIO[%"PRIu32"]| InputEn: %d| OutputEn: %d| OpenDrain: %d| Pullup: %d| Pulldown: %d| Intr:%d ", io_num, input_en, output_en, od_en, pu_en, pd_en, pGPIOConfig->intr_type);
而且这里并没有显示是输入的状态,这里是说输入和输出都没有开启,只是开启了内部上拉电阻。对于每个结构体变量的含义,我们的结构体定义的位置都有解释是什么意思,Pullup: 1 这是上拉的意思,并不是输入
你自己配置的我们并没有提供打印,你可以自己去读取对应的IO的寄存器配置状态,然后打印出来查看。
[/Codebox]

gezhia
Posts: 38
Joined: Thu Nov 24, 2022 10:45 am

Re: IO初始化出错

Postby gezhia » Thu Jan 19, 2023 4:28 am

关于打印是这个gpio_reset_pin()函数默认配置的打印表述不正确,我讲程序修改如下后,删除了gpio_reset_pin函数,用gpio_config函数来配置,就能打印出正确的配置了。

Code: Select all

    gpio_config_t io_conf = {};
    ESP_LOGI(TAG, "Hello, OB_helth!");

    st_key_queue = xQueueCreate(1, sizeof(enum SYS_KEY_STATE));
    power_state_Semaphore = xSemaphoreCreateBinary();


    io_conf.intr_type = GPIO_INTR_DISABLE;
    io_conf.mode = GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask = ((1ULL<<LED_W)|(1ULL<<LED_B));
    io_conf.pull_down_en = 0;
    io_conf.pull_up_en = 0;

    gpio_config(&io_conf);

    

    //gpio_reset_pin(LED_B);
    //gpio_reset_pin(LED_W);

    //gpio_set_direction(LED_B, GPIO_MODE_OUTPUT);
    //gpio_set_direction(LED_W, GPIO_MODE_OUTPUT);

    gpio_set_level(LED_B, 1);
    gpio_set_level(LED_W, 0);
    
I (315) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (325) app_main: Hello, OB_helth!
I (325) gpio: GPIO[2]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 
I (335) gpio: GPIO[4]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 

ESP_ZB2
Posts: 21
Joined: Wed Dec 28, 2022 12:33 pm

Re: IO初始化出错

Postby ESP_ZB2 » Thu Jan 19, 2023 10:44 am

  1. 不是打印不正确,是你对打印的理解不对,你可以进入函数定义里面去仔细看打印的函数定义的位置。

Who is online

Users browsing this forum: No registered users and 12 guests