今天写代码发现了JL701N的一个定时器PWM输出可以同时映射到两个管脚,不过输出是同步的,并不能单独调节频率和占空比:

具体实现方式如下,在SDK原有的timer_pwm_init函数中增加多一个映射管脚即可,或者自己重新写一个PWM初始化函数:
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_och_sel_output_signal(pwm_io, OUTPUT_CH_SIGNAL_TIMER0_PWM);
gpio_och_sel_output_signal(USR_LED10_IO, OUTPUT_CH_SIGNAL_TIMER0_PWM);
gpio_set_die(USR_LED10_IO, 1);
gpio_set_pull_up(USR_LED10_IO, 0);
gpio_set_pull_down(USR_LED10_IO, 0);
gpio_set_direction(USR_LED10_IO, 0);
break;
case (u32)JL_TIMER1 :
gpio_och_sel_output_signal(pwm_io, OUTPUT_CH_SIGNAL_TIMER1_PWM);
break;
case (u32)JL_TIMER2 :
gpio_och_sel_output_signal(pwm_io, OUTPUT_CH_SIGNAL_TIMER2_PWM);
gpio_och_sel_output_signal(USR_LED12_IO, OUTPUT_CH_SIGNAL_TIMER2_PWM);
gpio_set_die(USR_LED12_IO, 1);
gpio_set_pull_up(USR_LED12_IO, 0);
gpio_set_pull_down(USR_LED12_IO, 0);
gpio_set_direction(USR_LED12_IO, 0);
break;
case (u32)JL_TIMER3 :
bit_clr_ie(IRQ_TIME3_IDX);
gpio_och_sel_output_signal(pwm_io, OUTPUT_CH_SIGNAL_TIMER3_PWM);
gpio_och_sel_output_signal(USR_LED14_IO, OUTPUT_CH_SIGNAL_TIMER3_PWM);
gpio_set_die(USR_LED14_IO, 1);
gpio_set_pull_up(USR_LED14_IO, 0);
gpio_set_pull_down(USR_LED14_IO, 0);
gpio_set_direction(USR_LED14_IO, 0);
break;
case (u32)JL_TIMER4 :
gpio_och_sel_output_signal(pwm_io, OUTPUT_CH_SIGNAL_TIMER4_PWM);
break;
case (u32)JL_TIMER5 :
gpio_och_sel_output_signal(pwm_io, OUTPUT_CH_SIGNAL_TIMER5_PWM);
break;
default:
return;
}
u32 u_clk = 24000000;
//初始化timer
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; //设置初始占空比,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, 0);
gpio_set_direction(pwm_io, 0);
printf("JL_TIMERx->PRD = 0x%x\n", JL_TIMERx->PRD);
printf("JL_TIMERx->CON = 0x%x\n", JL_TIMERx->CON);
}
调用初始化函数选择用到的定时器和管脚后,再调用 set_timer_pwm_duty 函数设置占空比即可。
JL701N共有定时器6个,其中Time1不可以用(SDK占用了),所以总共有5个用户可用的定时器,这样一来如果项目中有需要同步输出的PWM,则可以使用一个定时器来完成,节省芯片资源。
所用SDK版本:jl701n_soundbox_release_v1.4.1
测试硬件环境:JL701N(QFN88) MCU TOP V1.0
JL7016C\7018F\杰理JL7016C\7018F
852

被折叠的 条评论
为什么被折叠?



