1、新建空白工程:
输入工程名称,点击create完成,生成工程.
2、打开device confige tools来配置设备
3、首先创建一个定时器,用于周期修改pwm的占空比。
4、配置GPIO,使用CYBSP_USER_LED1这pwm输出,配置CYBSP_USER_LED2为普通IO输出。
5、返回外设配置窗口,配置Pwm
到此为此,配置就完成了,下面编写用户代码:
6、声明定时器结构体,与Pwm结构体,同时配置一个计数器
cyhal_timer_t timer_obj;
uint16_t timer_count = 2000;
cyhal_pwm_t pwm_led1_control;
7、实现定时器回调函数,在函中,每次进入中断,都更新计数器,在达到半值时,翻转一次LED,同时修改pwm的占空比,实现呼吸灯的效果:
static void isr_timer(void* callback_arg, cyhal_timer_event_t event)
{
(void)callback_arg;
(void)event;
if(timer_count > 0)
timer_count -= 1;
if(timer_count == 0)
{
timer_count = 2000;
cyhal_gpio_toggle(CYBSP_USER_LED2);
}
if(timer_count < 1000)
{
cyhal_pwm_set_duty_cycle(&pwm_led1_control,timer_count/10.0,10000);
}
else {
cyhal_pwm_set_duty_cycle(&pwm_led1_control, (2000-timer_count)/10.0,10000);
}
}
8、编写用户初始化函数:
void app_timer_init(void)
{
cyhal_pwm_init_cfg(&pwm_led1_control,&tcpwm_0_group_1_cnt_3_hal_config);
cyhal_pwm_start(&pwm_led1_control);
cyhal_timer_init_cfg(&timer_obj, &tcpwm_0_group_1_cnt_0_hal_config);
cyhal_timer_register_callback(&timer_obj, isr_timer, NULL);
cyhal_timer_enable_event(&timer_obj, CYHAL_TIMER_IRQ_TERMINAL_COUNT,3, true);
cyhal_timer_start(&timer_obj);
}
在初始化代码中,首先初始化pwm,然后启动定时器。再初始化普通定时器,指定定时回调函数,最后启动定时器。
9、在main函数中,添回初始化函数
【实验现象】
下载代码后,两个用户LED,一个周期闪烁,一个实现呼吸灯效果,视频如下图:
|