Слияние кода завершено, страница обновится автоматически
периода высокого уровня сигнала.
При вызове функции 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);
}
Вход Перед тем как оставить комментарий