【RT-Thread潘多拉(iot board)】使用PWM设备点亮LED
准备:潘多拉开发板、源码、env工具,(cube mx 5.0在添加外设时也需要的)
使用潘多拉开发板,使用LED_B (PE9),是TIMER1的ch1,使能pwm驱动该led。
该bsp暂时不支持TIMER1,所以需要使用cube进行配置、修改Kconfig文件。
1、cube配置,生成代码
2、修改kconfig文件
打开 bsp\stm32\stm32l475-atk-pandora\board\kconfig
3、env使能PWM1 CH1,保存
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、结果
————————————
6、总结:使用方法
初始化pwm设备:
- 查找设备rt_device_find
- 设置一个默认输出频率rt_pwm_set
- 使能设备 rt_pwm_enable
使用pwm设备:
- 可以在某个线程中 ,直接使用rt_pwm_set进行频率设置输出