DA14580有两个TIMER,TIMER0和TIMER2,TIMER0有两路PWM,TIMER2有三路PWM。TIMER0和TIMER2的区别就是TIMER0是16位的,有PWM0和PWM1,而且这两个PWM是一起的。TIMER2是14位的,有PWM2、PWM3和PWM4,是三个独立的PWM,可分别设置占空比。
要IO口发出PWM,只需要将 IO配置为PWM输出,然后设置PWM的定时器即可:
1, 配置IO,作为PWM输出端口.
设置P1.0 口为PWM2功能:
RESERVE_GPIO(GPIO_PORT_1, GPIO_PIN_0,PID_PWM2);
将P1.0 配置为PWM2输出端口
GPIO_ConfigurePin(GPIO_PORT_1, GPIO_PIN_0,OUTPUT,PID_PWM2,false);
2, 设置定时器时钟
//Enables TIMER0,TIMER2 clock
set_tmr_enable(CLK_PER_REG_TMR_ENABLED);
// Sets TIMER0,TIMER2 clock division factor to 8, so TIM0 Fclk is F = 16MHz/8 = 2Mhz
set_tmr_div(CLK_PER_REG_TMR_DIV_8);
这里
set_tmr_enable(CLK_PER_REG_TMR_ENABLED);
为使能定时器 TIMER0 和TIMER2 的时钟。
set_tmr_div(CLK_PER_REG_TMR_DIV_8);
为将系统晶振 16MHz 进行8分频,然后提供给定时器0和定时器2,
TIM0/TIM2 fHz= 16MHz/8 = 2Mhz 。
3, 设置PWM的频率, 设置为独立函数,可以在再调用,然后不同时间调整设置为所需频率。
void SetFrequency(uint16_t frequency)
{
timer2_enable(TRIPLE_PWM_DISABLED);
timer2_init(HW_CAN_NOT_PAUSE_PWM_2_3_4, PWM_2_3_4_SW_PAUSE_ENABLED, 2000000/frequency); // 2M/500=4000Hz=4K Hz
timer2_set_pwm2_duty_cycle(1000000/frequency);
timer2_set_sw_pause(PWM_2_3_4_SW_PAUSE_DISABLED);
timer2_enable(TRIPLE_PWM_ENABLED);
}
1,配置定时器0.
//Enables TIMER0,TIMER2 clock
set_tmr_enable(CLK_PER_REG_TMR_ENABLED);
// Sets TIMER0,TIMER2 clock division factor to 8, so TIM0 Fclk is F = 16MHz/8 = 2Mhz
set_tmr_div(CLK_PER_REG_TMR_DIV_8);
// Set timer with 2MHz source clock divided by 10 so Fclk = 2MHz/10 = 200kHz
timer0_init(TIM0_CLK_FAST, PWM_MODE_ONE, TIM0_CLK_DIV_BY_10);
timer0_set(2000, 0, 0);//no pwm // 1s/200KHz * 2000 = 10ms
// enable SWTIM_IRQn irq
timer0_enable_irq();
// start pwm0
timer0_start();
timer0_init(TIM0_CLK_FAST, PWM_MODE_ONE, TIM0_CLK_DIV_BY_10);
再TIM0时钟在set_tmr_div()8分频为2MHz后,在进行10分频,f= 2MHz/10 = 200kHz
这里:
TIM0_CLK_FAST: 指使用 6MHz (fast)的快速时钟,也设置成 TIM0_CLK_32K, 如果是TIM0_CLK_32K,就是使用32kHz (slow)的慢速时钟。
pwm_mode:是用PWM_MODE_ONE模式,及set_tmr_div()分频后的时钟模式,
或者是PWM_MODE_CLOCK_DIV_BY_TWO模式, 直接系统16MHz,时钟2分频的时钟模式。
TIM0_CLK_DIV_t: 可以设置 TIM0_CLK_DIV_BY_10 将时钟再10分频。
或者是TIM0_CLK_NO_DIV,不分频,直接使用。
timer0_set(2000, 0, 0);//no pwm // 1s/200KHz *2000 = 10ms
这里是设置TIM0计数重载值, 第一个设置总的数值: 2000,意思是用上面设置的200kHz的速度计数2000所用的时间,即为定时时间200KHz / 2000 = 10ms。
后面两个0,第一个0位高电平计数,第二个0为低电平计数。
timer0_enable_irq(); 使能定时器0的中断。
2, 开启定时器0的中断后, 每隔10ms,就会进入中断函数
pwm.c 文件中
/**
****************************************************************************************
@brief SWTIM_Handler. The SWTIM_IRQn interrupt handler
****************************************************************************************
*/
void SWTIM_Handler(void)
{
}
这里面写中断处理函数。
参考:https://blog.csdn.net/wangdingjian/article/details/51440518