基于STM32F103+RT-thread的PWM应用(呼吸灯)

1 硬件设备

1、STM32F103最小系统板

2、面包板

3、LED灯

(可以直接使用江科协的板子【STM32入门教程-2023持续更新中】 https://www.bilibili.com/video/BV1th411z7sn/?p=16&share_source=copy_web&vd_source=ae745a959b82433d54166d583dec1f4b)

2 软件工具

1、RT-Thread Studio(2.2.7)

2、STM32CubeMX(6.9.1)

3 创建RT-Thread工程

1、文件->新建->RT-Thread项目

2、配置芯片

根据自己的板子选择芯片型号

如果用到了串口调试就需要选择控制台串口号,不用串口调试直接忽略。

调试器选择ST-Link

3、打开board.h,查看配置PWM的步骤

4、启动PWM设备

注意组件里面不用添加外部定时器HWTIMER选项,很多教程都让选这个但实际上不需要,这里的PWM选择内部时钟。这里用PWM1就要选择定时器1,用PWM2就选择用定时器2。在之前学习STM32的定时器时,PWM1-PWM4对应的是某一个定时器的通道1-通道4,但是这里的PWMx是直接对应TIMx,而通道则用PWM_CHx来对应。

5、进入RT-Thread Setting设置

4 使用STM32CubeMX生成配置文件

这里一定要注意,不要直接从rt-thread stdio里面点开CubeMX Setting!!!

1、创建CubeMX工程

从CubeMX应用直接打开,建一个新的project:File->New Project->选择芯片型号

双击圈圈位置即可创建新的工程

2、配置定时器

选择Timer->TIM1

选择时钟源为内部时钟,选择通道1为PWM Generation CH1,配置好这些后就能看到PWM脉冲的输出引脚为PA8。

3、生成项目代码

点击项目管理,设置工程名和IDE,这里直接选择MDK-ARM即可,生成的工程可以用Keil打开,当然不用keil打开也可以,只要能生成工程,哪怕用txt打开。

另外注意,Code Generator->Generate files中的第一个选项一定不要勾上了!!!不然是无法生成想要的代码的

4、获取所需代码

生成后的代码直接选择Open Project就是KEIL打开,但是没有keil的话用vscode也行,用txt也行,最终目的是找到工程中stm32f1xx_hal_msp.c文件,获取HAL_TIM_Base_MspInit和HAL_TIM_MspPostInit这两个函数。我这边的代码如下:

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
  if(htim_base->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspInit 0 */

  /* USER CODE END TIM1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM1_CLK_ENABLE();
  /* USER CODE BEGIN TIM1_MspInit 1 */

  /* USER CODE END TIM1_MspInit 1 */
  }

}

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(htim->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspPostInit 0 */

  /* USER CODE END TIM1_MspPostInit 0 */

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM1 GPIO Configuration
    PA8     ------> TIM1_CH1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM1_MspPostInit 1 */

  /* USER CODE END TIM1_MspPostInit 1 */
  }

}

5、回到RT-Thread Stdio的工程当中,打开board.c文件,将刚刚复制的两个函数粘贴在board.c文件的最后面。并将HAL_TIM_Base_MspInit改成HAL_TIM_PWM_MspInit

5 查看所有宏定义是否打开

1、在stm32f1xx_hal_conf.h文件中查看HAL_TIM_MODULE_ENABLED和HAL_PWR_MODULE_ENABLED两个宏是否打开,确保定时器和PWM的宏定义开启。

2、在pwm_config.h文件中,确保PWM1_CONFIG已经开启。这个文件本身只有PWM2、PWM3、PWM4、PWM5的配置,如果需要用到PWM1就需要自己把这个加上去(直接复制PWM的配置,然后把所有2改成1)。由于前面已经开启了PWM1的宏定义,因次这里的PWM1配置就是白底的,没有开的都是灰底的。

至此,所有配置工作就完成了

5 实现呼吸灯代码

呼吸灯代码就很简单了,直接获取PWM句柄然后控制脉冲频率和占空比即可。main.c文件代码如下:

#include <rtthread.h>

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

#define PWM_DEV_NAME "pwm1"
#define PWM_DEV_CHAN 1

struct rt_device_pwm * pwm_dev;
rt_uint32_t period = 500000;
rt_uint32_t pulse = 0;
rt_uint8_t dir = 0;

int main(void)
{
    pwm_dev = (struct rt_device_pwm*)rt_device_find(PWM_DEV_NAME);
    if(pwm_dev == RT_NULL)
    {
        rt_kprintf("device error\n");
        return RT_ERROR;
    }

    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;
            }
        }
        else{
            pulse -= 5000;
            if(pulse <= 0)
            {
                dir = 0;
            }
        }
        rt_pwm_set(pwm_dev, PWM_DEV_CHAN, period, pulse);
        rt_thread_mdelay(10);
    }



    return RT_EOK;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是意法半导体(STMicroelectronics)生产的一款32位嵌入式微控制器,具有高性能和低功耗的特点。RT-Thread Nano是RT-Thread实时操作系统的一个轻量级版本,适用于资源受限的嵌入式系统。 在将RT-Thread Nano移植到STM32F103上之前,需要先了解RT-Thread Nano的架构和STM32F103的硬件特性。 首先,需要确保RT-Thread Nano的源代码和STM32F103的开发环境已经准备好。接着,根据STM32F103的芯片手册和引脚映射表,需要对RT-Thread Nano的硬件抽象层进行适配,确保操作系统可以正确地访问外设和中断。 其次,需要根据STM32F103的内存和存储器大小来合理配置RT-Thread Nano的内存管理器和文件系统。可以根据实际需求对系统进行裁剪,移除不必要的模块和功能,以减小系统的内存占用和代码体积。 然后,需要配置STM32F103的系统时钟和中断向量表,并在启动代码中初始化硬件资源和系统任务。可以参考RT-Thread Nano的官方文档和示例代码,根据具体的硬件平台和应用需求进行相应的设置和调试。 最后,进行系统的编译、烧录和调试。可以使用STM32F103的开发工具链和调试器,对编译后的固件进行烧录和调试,确保系统能够正确地启动和运行。 总结来说,将RT-Thread Nano移植到STM32F103上需要进行硬件适配、内存管理和系统配置等工作,最终通过编译、烧录和调试来验证移植的正确性。这样可以使得STM32F103可以运行使用RT-Thread Nano操作系统的应用程序,实现更灵活和可靠的嵌入式系统设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值