Loading

Rthread+Cubemx快速构建工程

首先下载并安装如下两个软件
RT_Thread下载链接:https://www.rt-thread.org/page/studio.html
CubeMX下载链接:https://www.st.com/en/embedded-software/stm32cubeg0.html#get-software

<------------------------------------------------------------------------------------------------------------------------------------->
点击新建工程:

选择自己芯片类型建立相应的工程,根据自己开发板上的usb转串口选择控制台串口(这里使用的是stm32f103vex)

三个按钮分别是:1、构建 2、串口终端 3、下载

将文件构建好并下载到开发板后可以看见实例程序正在运行

现在我们进一步向工程中添加pwm驱动并结合cubemx设置相应的底层初始化。
选择如下选项即可在rtthread中使能pwm

点击如下按钮打开cubemx(必须先安装cubemx)

首先打开外部时钟并配置时钟树(时钟树的配置建议查看相应的数据手册)

配置pwm初始化和uart1初始化 一切设置好了后直接关闭cubemx相应的文件会自动加载到工程中(这里使用的pwm3 channel4)

板上资源都可以通过board.h文件来设置,并且官方为每个外设都写了简易的教程,跟着相应的步骤即可配置完成,此处step1已经在之前完成
step3,step4由cubemx完成,因此只需完成step2

完成相应的设置后在main中添加如下代码即可完成pwm的输出

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

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#define LED0 GET_PIN(B,1)
#include <rtdbg.h>

#define PWM_DEV_NAME        "pwm3"  /* PWM设备名称 */
#define PWM_DEV_CHANNEL     4       /* PWM通道 */

struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */

int main(void)
{

    rt_uint32_t period, pulse, dir;

       period = 500000;    /* 周期为0.5ms,单位为纳秒ns */
       dir = 1;            /* PWM脉冲宽度值的增减方向 */
       pulse = 0;          /* PWM脉冲宽度值,单位为纳秒ns */

       /* 查找设备 */
       pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
       if (pwm_dev == RT_NULL)
       {
           rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
           return RT_ERROR;
       }

       /* 设置PWM周期和脉冲宽度默认值 */
       rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
       /* 使能设备 */
       rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);

       while (1)
       {
           rt_thread_mdelay(50);
           if (dir)
           {
               pulse += 5000;      /* 从0值开始每次增加5000ns */
           }
           else
           {
               pulse -= 5000;      /* 从最大值开始每次减少5000ns */
           }
           if (pulse >= period)
           {
               dir = 0;
           }
           if (0 == pulse)
           {
               dir = 1;
           }

           /* 设置PWM周期和脉冲宽度 */
           rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
       }
}

如需更多关于pwm的资料请转到rtthreat官方网站https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm

posted @ 2022-01-01 08:59  Chilo  阅读(777)  评论(0)    收藏  举报