【RT-Thread潘多拉(iot board)】使用PWM设备点亮LED

准备:潘多拉开发板、源码、env工具,(cube mx 5.0在添加外设时也需要的)

使用潘多拉开发板,使用LED_B (PE9),是TIMER1的ch1,使能pwm驱动该led。

 

该bsp暂时不支持TIMER1,所以需要使用cube进行配置、修改Kconfig文件。

1、cube配置,生成代码

 

【RT-Thread潘多拉(iot board)】使用PWM设备点亮LED

2、修改kconfig文件

 

打开 bsp\stm32\stm32l475-atk-pandora\board\kconfig

【RT-Thread潘多拉(iot board)】使用PWM设备点亮LED

3、env使能PWM1 CH1,保存

【RT-Thread潘多拉(iot board)】使用PWM设备点亮LED

4、增加示例代码进行验证

该示例代码使用的是三色led中的蓝色led,链接的是TIMER1 CH1,为了效果明显,将main中的红色led关闭。

示例代码源码:设置周期为0.5ms,步进单位为20000us

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define PWM1_DEVICE_NAME "pwm1"
#define PWM1_DEVICE_CHANNEL 1


#define PWM1_PERIOD 500000  //周期的单位是ns,0.5ms
#define PWM1_STEP   20000   //pwm变化量
static struct rt_device_pwm  *pwm_dev;

#define LED_B       GET_PIN(E, 9)

void pwm_led_entry(void *pra)
{
   static rt_uint32_t pwm_pulse = 0;
   static int  dir = 0;
    
    while(1)
    {
        switch(dir)
        {
            case 0: pwm_pulse += PWM1_STEP;
                pwm_pulse = (pwm_pulse >= PWM1_PERIOD)? PWM1_PERIOD : pwm_pulse;
                if(pwm_pulse == PWM1_PERIOD)dir = 1; 
            
        break;
        
            case 1:pwm_pulse -= PWM1_STEP;
                pwm_pulse = (pwm_pulse <= 0)? 0 : pwm_pulse;
                if(pwm_pulse == 0)dir = 0;  
        break;
        
            default:
                break;
        }
        rt_pwm_set(pwm_dev,PWM1_DEVICE_CHANNEL,PWM1_PERIOD,pwm_pulse);
        rt_thread_mdelay(50);         
    }   
}

int pwm_sample(void)
{
    static rt_thread_t  pwm_led_thread;
    
    
    //初始化pwm设备
    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM1_DEVICE_NAME);
    if(pwm_dev == RT_NULL)
    {
        rt_kprintf("cannot find pwmdev\n");
        return RT_ERROR;
    }
    
    rt_pwm_set(pwm_dev,PWM1_DEVICE_CHANNEL,PWM1_PERIOD,0);//初始默认值
    rt_pwm_enable(pwm_dev,PWM1_DEVICE_CHANNEL);
    
    
    //创建一个使用pwm设备的线程,如点亮led的线程
    pwm_led_thread = rt_thread_create("led_thread",pwm_led_entry,0,1024,10,10);
    
    if(pwm_led_thread == RT_NULL)
    {
        rt_kprintf("create pwm thread failed\n");
        return RT_ERROR;
    }
    
    rt_thread_startup(pwm_led_thread);
    
    return RT_EOK;

}
MSH_CMD_EXPORT(pwm_sample,pwm sample);

5、结果

【RT-Thread潘多拉(iot board)】使用PWM设备点亮LED【RT-Thread潘多拉(iot board)】使用PWM设备点亮LED

————————————

6、总结:使用方法

初始化pwm设备:

  1. 查找设备rt_device_find
  2. 设置一个默认输出频率rt_pwm_set
  3. 使能设备 rt_pwm_enable

使用pwm设备:

  1. 可以在某个线程中 ,直接使用rt_pwm_set进行频率设置输出