目录
硬件资源介绍:
笔者使用的是STM32F407VET6是魔女开发板,因为RT不支持CMSIS-DAP烧录,所以我又准备了一个ST-link,一个红色的LED。我所使用的是TIM2-CH3通道,在我这个板子上对应的是PA2口。原理图如下所示。
可以看到PA2上对应的有TIM2_3。
前期准备:
首先是创建RTT项目
第一步:打开RT的Settings
第二步:接着打开项目中的baord.h进行如下几步修改
第三步:打开CubeMX生成代码将其中的有用代码贴到board.c后
第四步:打开stm32xxxx_hal_config.h进行修改
第五步:添加一句代码到drv_pwm.c
笔者也是找了很久bug才知道要加这句话,之前的时候一直都没解决,现在将他分享出来。
第六步:检查是否有所用定时器(TIM2是有的,一般通用定时器的有,高级定时器比如TIM1就没有,不过也可以模仿着TIM2的格式复制写一个TIM1)
代码编写:
在main.c中编写代码
/*
* Copyright (c) 2006-2024, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-06-13 RT-Thread first version
*/
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include <rtdbg.h>
#define PWM_DEV "pwm2"
#define PWM_DEV_CHAN 3
struct rt_device_pwm *pwm_dev;
rt_uint32_t period = 500000; //周期值 500000ns 频率 2kHz
rt_uint32_t pulse = 0; //脉宽变量
rt_uint8_t dir = 0; //方向值
int main(void)
{
//查找设备
pwm_dev = (struct rt_device_pwm*)rt_device_find(PWM_DEV);
if(pwm_dev == RT_NULL)
{
rt_kprintf("not find!");
return RT_ERROR;
}
//设置参数
//rt_pwm_set(pwm_dev, PWM_DEV_CHAN, period, pulse);
rt_pwm_set(pwm_dev,PWM_DEV_CHAN, period, pulse);
//启动设备
rt_pwm_enable(pwm_dev, PWM_DEV_CHAN);
while(1)
{
if(dir == 0)
{
pulse += 5000;
if(pulse >= period)
{
dir = 1;
}
}
if(dir == 1)
{
pulse -= 5000;
if(pulse <= 0)
{
dir = 0;
}
}
rt_pwm_set(pwm_dev, PWM_DEV_CHAN, period, pulse);
rt_thread_mdelay(50);
}
return RT_EOK;
}
总结:
RT中的PWM还是比较方便的,就是遇到了一个Bug,导致这个F4系列的STM32连呼吸灯都实现不了,找到后也是立马总结一下,希望可以帮助到广大朋友们。