首先在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);
}