- 最近在使用ESP系列做开发,在初始化上遇到了一点问题,先记录以下后面再慢慢找问题
- 关于使用IDF做ESP系列开发外设的初始化结构体必须和示例里面写的那样,在声明的同时马上赋值,如果想像stm32那样声明后一个一个赋值则无法初始化引脚,这个问题如果有人遇到并解决希望能分享一下思路
-
如下则无法初始化这个GPIO17作为pwm输出
ledc_channel_config_t ledc_channel;
ledc_channel.channel = LEDC_CHANNEL_1;
ledc_channel.duty = 8000;
ledc_channel.gpio_num = 17;
ledc_channel.speed_mode = LEDC_LOW_SPEED_MODE;
ledc_channel.hpoint = 0;
ledc_channel.timer_sel = LEDC_TIMER_0;
ledc_channel_config(&ledc_channel);
- 但是下面这种则可以,就是例程里的写法。
ledc_channel_config_t channel_conf = {
.gpio_num = 17, // 设置 GPIO 号
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_1,
.timer_sel = LEDC_TIMER_0,
.duty = 8000, // 设置占空比为 0
.hpoint = 0
};
// 配置 LEDC 通道
ledc_channel_config(&channel_conf);
-
这里是个什么问题呢,C在初始化结构体有两种方式,其中声明同时赋值的方式,若没有将某些参数直接赋值,会被默认为0
-
但是若是使用单步赋值来显式赋值的话,C要求将结构体中所有参数都进行赋值,不用的也要赋值为0之列的,所以对于单步赋值要将所有参数列出来。
-
上面的单步配置应该如下写就能解决这个问题。
ledc_channel_config_t ledc_channel;
ledc_channel.channel = LEDC_CHANNEL_1;
ledc_channel.duty = 8000;
ledc_channel.gpio_num = 17;
ledc_channel.speed_mode = LEDC_LOW_SPEED_MODE;
ledc_channel.hpoint = 0;
ledc_channel.timer_sel = LEDC_TIMER_0;
ledc_channel.intr_type= LEDC_INTR_DISABLE;
ledc_channel_config(&ledc_channel);