乐鑫技术交流
直播中

Arvinhw

9年用户 956经验值
擅长:嵌入式技术
私信 关注
[问答]

LEDC_TIMERx_OVF_INT,LED PWM的计数器溢出中断在IDF的里怎么开启?

35.2.2.3 14 位计数器
每个定时器有一个以ref_pulsex 为基准时钟的14 位时基计数器。LEDC_tiMERx_DUTY_RES 字段用
于配置14 位计数器的最大值。因此,PWM 信号的最大精确度为14 位。计数器最大可计数至2LEDC_TIMERx_DUTY _RES−
1,然后溢出重新从0 开始计数。软件可以读取、复位、暂停计数器。
计数器可在每次溢出时触发(LEDC_TIMERx_OVF_INT) 中断,这个中断为硬件自动产生,不需要配置。

手册上说硬件自己产生这个中断,请问我再IDF里面怎样注册这个中断的回调函数呢?

回帖(1)

李军

2024-6-12 17:26:51
在ESP-IDF中,要注册LEDC(LED Pulse Width Modulation Controller)计数器溢出中断的回调函数,您可以按照以下步骤操作:

1. 首先,确保您已经安装了ESP-IDF开发框架,并正确设置了环境。

2. 在您的项目中,包含所需的头文件:
   ```c
   #include "driver/ledc.h"
   #include "esp_intr_alloc.h"
   ```

3. 定义一个中断处理函数,例如:
   ```c
   void ledc_overflow_isr(void* arg)
   {
       // 处理中断
       printf("LEDC overflow interrupt triggeredn");
   }
   ```

4. 在初始化LEDC之前,配置中断:
   ```c
   intr_handle_t ledc_intr_handle = NULL;
   esp_err_t ret = esp_intr_alloc(ETS_LEDC_INTR_SOURCE, 0, ledc_overflow_isr, NULL, &ledc_intr_handle);
   if (ret != ESP_OK) {
       printf("Error allocating LEDC interruptn");
       return;
   }
   ```

5. 初始化LEDC,配置定时器和通道。这里是一个示例:
   ```c
   ledc_timer_config_t ledc_timer = {
       .duty_resolution = LEDC_TIMER_13_BIT, // 设置定时器的分辨率
       .freq_hz = 5000,                     // 设置定时器的频率
       .speed_mode = LEDC_LOW_SPEED_MODE,  // 设置定时器的速度模式
       .timer_num = LEDC_TIMER_0,          // 设置定时器编号
   };
   ledc_timer_config(&ledc_timer);

   ledc_channel_config_t ledc_channel = {
       .gpio_num = 4,                      // 设置PWM输出的GPIO编号
       .speed_mode = LEDC_LOW_SPEED_MODE,  // 设置通道的速度模式
       .channel = LEDC_CHANNEL_0,          // 设置通道编号
       .intr_type = LEDC_INTR_DISABLE,     // 禁用中断
       .timer_sel = LEDC_TIMER_0,          // 设置通道使用的定时器编号
       .duty = 500,                        // 设置初始占空比
   };
   ledc_channel_config(&ledc_channel);
   ```

6. 启用中断:
   ```c
   esp_intr_enable(ledc_intr_handle);
   ```

7. 在适当的时候,禁用中断:
   ```c
   esp_intr_disable(ledc_intr_handle);
   ```

8. 最后,不要忘记在程序结束时释放中断资源:
   ```c
   esp_intr_free(ledc_intr_handle);
   ```

通过以上步骤,您可以在ESP-IDF中注册LEDC计数器溢出中断的回调函数。当计数器溢出时,中断会自动触发,并调用您定义的回调函数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分