本帖最后由 MianQi 于 2021-9-16 13:19 编辑
将示例代码上传以后,并没有看到PWM的效果:
#include <rtthread.h>
#include "board.h"
/**********************************************************************************/
/******************************** PWM_DEV_NAME ***********************************/
/*** timer3 pwm *** timer4 pwm *** timer5 pwm *** lpwm0 *** lpwm1 *** lpwm2 ***/
/*** t3pwm *** t4pwm *** t5pwm *** lpwm0 *** lpwm1 *** lpwm2 ***/
/**********************************************************************************/
#define PWM_DEV_NAME "t5pwm" /* PWM设备名称 */
#define PWM_DEV_CHANNEL 1 /* PWM通道 */
struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
ALIGN(RT_ALIGN_SIZE)
static uint8_t PWM_Thread_Stack[1024];
static void PWM_Thread_Entry(void *para);
static struct rt_thread pwm_thread;
rt_uint32_t period, pulse;
void Pwm_Init(void){
period = 1000000; /* 周期 = 1M/period kHz */
pulse = 0; /* PWM脉冲宽度值(0 - period) */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
RT_ASSERT(pwm_dev != RT_NULL);
/* 设置PWM周期和脉冲宽度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
/* 使能设备 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
}
static void PWM_Thread_Entry(void *para){
Pwm_Init();
while(1){
/*使RGB灯红灯闪烁*/
for (int var = 0; var < period; var += 10000) {
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, var);
rt_thread_mdelay(1000);
}
}
}
int Pwm_Thread_Init(void){
rt_thread_init(&pwm_thread, "pwm_thread", PWM_Thread_Entry, RT_NULL,
&PWM_Thread_Stack[0], sizeof(PWM_Thread_Stack), 10, 10);
rt_thread_startup(&pwm_thread);
return 0;
}
INIT_APP_EXPORT(Pwm_Thread_Init);
而且,看不懂这两行注释:
period = 1000000; /* 周期 = 1M/period kHz */
pulse = 0; /* PWM脉冲宽度值(0 - period) */
用跳线逐个测试6个写有PWM的管脚,只有PE1有信号输出,但是实物照跟配置文件中的说明却对不上:
经过一番查证发现,要将这个宏定义改为“2”,LED才会闪:
#define PWM_DEV_CHANNEL 2 /* PWM通道 */
想要效果明显一点,这个for语句中的参数应作如下调整:
/*使RGB灯红灯闪烁*/
for (int var = 0; var < period; var += 100) {
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, var);
rt_thread_mdelay(1000);
}
演示视频:
|