嵌入式STM32学习笔记(9)——RT-Thread Studio stm32使用PWM

首先在RT-Thread Studio新建一个stm32项目:

一、添加驱动,settings->drivers->更多->找到pwm设备驱动;

二、修改board.h,根据自己需要添加宏配置

三、修复stm32f1xx_hal_conf.h文件内容启动设备:

四、在cubeMx中添加pwm设置配置,然后复制stm32f1xx_hal_msp.c,到rtt文件中driver里:

五、在drv_pwm.c中添加启动:

六、main函数添加:

以下代码是stm32f103c8的板子的main代码:

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

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define LED0_PIN GET_PIN(C,13)    /* led */

#define PWM_DEV_NAME        "pwm3"  /* PWM设备名称 */
#define PWM_DEV_CHANNEL     1       /* PWM通道 */
struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */

/* 定义线程控制块 */
static rt_thread_t led1_thread = RT_NULL;
static void led1_thread_entry(void* parameter);

/* 定义线程控制块 */
static rt_thread_t pwm_thread = RT_NULL;
static void pwm_thread_entry(void* parameter);


int main(void)
{
    int count = 1;
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

//    while (count++)
//    {
//        //       LOG_D("Hello RT-Thread!");
//        //        rt_thread_mdelay(1000);
//
//        rt_pin_write(LED0_PIN, PIN_HIGH);
//        rt_thread_mdelay(500);
//        rt_pin_write(LED0_PIN, PIN_LOW);
//        rt_thread_mdelay(500);
//        rt_kprintf("led1闪烁,LED1_ON\r\n");
//        rt_kprintf("gdk 中文一二三 \r\n");
//    }
//
//    return RT_EOK;



    led1_thread =                          /*线程控制块指针 */
              rt_thread_create( "led1",    /*线程名字 */
                      led1_thread_entry,   /*线程入口函数 */
                      RT_NULL,             /*线程入口函数参数 */
                      512,                 /*线程栈大小 */
                      3,                   /*线程的优先级*/
                      20);                 /*线程时间片 */

      /*  */
      if (led1_thread != RT_NULL)
          rt_thread_startup(led1_thread);
      else
          return -1;


      pwm_thread =                          /*线程控制块指针 */
              rt_thread_create( "pwm",     /*线程名字 */
                      pwm_thread_entry,   /*线程入口函数 */
                      RT_NULL,             /*线程入口函数参数 */
                      512,                 /*线程栈大小 */
                      3,                   /*线程的优先级*/
                      20);                 /*线程时间片 */

      /*  */
      if (pwm_thread != RT_NULL)
          rt_thread_startup(pwm_thread);
      else
          return -1;
}

static void led1_thread_entry(void* parameter)
{

    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_delay(100);   /*  */
        rt_kprintf("led1_thread running,LED1_ON\r\n");

        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_delay(1000);   /*  */
        rt_kprintf("led1_thread running,LED1_OFF\r\n");
        rt_kprintf("led1关闭了,LED1_OFF\r\n");
    }
}

static void pwm_thread_entry(void* parameter)
{
    rt_uint32_t period, pulse, dir;
    period = 500000; /* 周 期 为0.5ms, 单 位 为 纳 秒ns */
    dir = 100; /* PWM脉 冲 宽 度 值 的 增 减 方 向 */
    pulse =450000; /* 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;
     }
     rt_kprintf("pwm sample run ! find %s device!\n", PWM_DEV_NAME);
     /* 设 置PWM周 期 和 脉 冲 宽 度 默 认 值 */
     rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
     /* 使 能 设 备 */
     rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值