1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Jieli-Tech-fw-AC63_BT_SDK

 / Детали:

[Поделиться содержимым]: Инициализация таймера timer_pwm в AC632N может привести к появлению короткого...

Предстоит сделать
Владелец
Создано  
21.04.2025

периода высокого уровня сигнала.

Использование таймера timer для вывода PWM на AC632N

При вызове функции timer_pwm_init() может случайно появиться высокий уровень сигнала.#### Методы оптимизации:
Функция timer_pwm_init() изменена следующим образом:

void timer_pwm_init(JL_TIMER_TypeDef *JL_TIMERx, u32 pwm_io, u32 fre, u32 duty)
{
    switch ((u32)JL_TIMERx) {
    case (u32)JL_TIMER0 :
        gpio_set_fun_output_port(pwm_io, FO_TMR0_PWM, 0, 1);
        break;
    case (u32)JL_TIMER1 :
        gpio_set_fun_output_port(pwm_io, FO_TMR1_PWM, 0, 1);
        break;
    case (u32)JL_TIMER2 :
        gpio_set_fun_output_port(pwm_io, FO_TMR2_PWM, 0, 1);
        break;
    case (u32)JL_TIMER3 :
        bit_clr_ie(IRQ_TIME3_IDX);
        gpio_set_fun_output_port(pwm_io, FO_TMR3_PWM, 0, 1);
        break;
    default:
        return;
    }
    u32 u_clk = 24000000;
    // Инициализация таймера
+    if (duty == 0) {
+        JL_TIMERx->CNT = 0;                                                // Сброс счетчика
+        JL_TIMERx->PRD = 0;                                                // Установка периода
+    } else {
+        JL_TIMERx->PRD = u_clk / (4 * fre);                                // Установка периода
+        JL_TIMERx->CNT = JL_TIMERx->PRD;                                   // Сброс счетчика
+    }
+    JL_TIMERx->PWM = (JL_TIMERx->PRD * duty) / 10000;  // Установка начального Duty, 0~10000 соответствует 0~100%
+
    JL_TIMERx->CON = 0;
    JL_TIMERx->CON |= (0b110 << 10);                                   // Выбор источника тактового сигнала STD_24M
    JL_TIMERx->CON |= (0b0001 << 4);                                   // Деление тактового сигнала на 4
-    JL_TIMERx->CNT = 0;                                                    // Сброс счетчика
-    JL_TIMERx->PRD = u_clk / (4 * fre);                                    // Установка периода
-    JL_TIMERx->PWM = (JL_TIMERx->PRD * duty) / 10000;  // Установка начального Duty, 0~10000 соответствует 0~100%
    JL_TIMERx->CON |= (0b01 << 0);                                             // Выбор режима счета
    JL_TIMERx->CON |= BIT(8);                                                  // Включение PWM
    // Установка состояния вывода
    gpio_set_die(pwm_io, 1);
    gpio_set_pull_up(pwm_io, 0);
}
```    gpio_set_pull_down(pwm_io, GPIO_PULL_DOWN);
   gpio_set_direction(pwm_io, GPIO_DIRECTION);     printf("JL_TIMERx->PRD = 0x%x\n", JL_TIMERx->PRD);
    printf("JL_TIMERx->CON = 0x%x\n", JL_TIMERx->CON);
}

Комментарий (0)

GitLife Service Account Задача создана
GitLife Service Account добавлено
 
enhancement
label.
Развернуть журнал операций

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/Jieli-Tech-fw-AC63_BT_SDK.git
git@api.gitlife.ru:oschina-mirror/Jieli-Tech-fw-AC63_BT_SDK.git
oschina-mirror
Jieli-Tech-fw-AC63_BT_SDK
Jieli-Tech-fw-AC63_BT_SDK