【STM32单片机_(HAL库)】4-2-1【定时器TIM】定时器输出PWM实现呼吸灯实验

ops/2024/10/9 2:01:58/

1.硬件

2.软件

  • pwm驱动文件添加
  • 定时器HAL驱动层文件添加
  • GPIO常用函数
  • 定时器输出PWM配置步骤
  • main.c程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "pwm.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */led_init();                         /* 初始化LED灯 */pwm_init(500 - 1, 72 - 1);//arr=499,psc=71uint16_t i = 0;while(1){ for(i = 0; i < 300; i++){pwm_compare_set(i);//修改CCR值delay_ms(10);}for(i = 0; i < 300; i++){pwm_compare_set(300 - i);delay_ms(10);}
//        led1_on();
//        led2_off();
//        delay_ms(500);
//        led1_off();
//        led2_on();
//        delay_ms(500);}
}
  • **timer_init(500 - 1, 720 - 1);//定时500ms**语句定时参考

在这里插入图片描述

  • led.c程序
#include "led.h"
#include "sys.h"//初始化GPIO函数
void led_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟//调用GPIO初始化函数gpio_initstruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;          // 两个LED对应的引脚gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速HAL_GPIO_Init(GPIOB, &gpio_initstruct);//关闭LEDled1_off();led2_off();
}//点亮LED1的函数
void led1_on(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);   // 拉低LED1引脚,点亮LED1
}//熄灭LED1的函数
void led1_off(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);     // 拉高LED1引脚,熄灭LED1
}//翻转LED1状态的函数
void led1_toggle(void)
{HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
}//点亮LED2的函数
void led2_on(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);   // 拉低LED2引脚,点亮LED2
}//熄灭LED2的函数
void led2_off(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);     // 拉高LED2引脚,熄灭LED2
}//翻转LED2状态的函数
void led2_toggle(void)
{HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
}
  • led.h程序
#ifndef __LED_H__
#define __LED_H__void led_init(void);
void led1_on(void);
void led1_off(void);
void led1_toggle(void);
void led2_on(void);
void led2_off(void);
void led2_toggle(void);#endif
  • pwm.c程序
#include "pwm.h"TIM_HandleTypeDef pwm_handle = {0};
// init函数
void pwm_init(uint16_t arr, uint16_t psc)
{TIM_OC_InitTypeDef pwm_config = {0};pwm_handle.Instance = TIM4;pwm_handle.Init.Prescaler = psc;pwm_handle.Init.Period = arr;pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP;HAL_TIM_PWM_Init(&pwm_handle);pwm_config.OCMode = TIM_OCMODE_PWM1;//指定定时器工作模式1pwm_config.Pulse = arr/2;//CCR初值pwm_config.OCPolarity = TIM_OCPOLARITY_LOW;//有效电平HAL_TIM_PWM_ConfigChannel(&pwm_handle, &pwm_config, TIM_CHANNEL_3);//通道3HAL_TIM_PWM_Start(&pwm_handle, TIM_CHANNEL_3);
}//msp函数
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM4)//判断是否为TIM4{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();//GPIO口时钟                           // 使能GPIOB时钟__HAL_RCC_TIM4_CLK_ENABLE();//TIM4时钟//调用GPIO初始化函数gpio_initstruct.Pin = GPIO_PIN_8;                    // 两个LED对应的引脚gpio_initstruct.Mode = GPIO_MODE_AF_PP;             // 推挽输出gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速HAL_GPIO_Init(GPIOB, &gpio_initstruct);}
}//修改CCR值的函数
void pwm_compare_set(uint16_t val)
{__HAL_TIM_SET_COMPARE(&pwm_handle, TIM_CHANNEL_3, val);
}
  • pwm.h程序
#ifndef __PWM_H__
#define __PWM_H__#include "sys.h"void pwm_init(uint16_t arr, uint16_t psc);
void pwm_compare_set(uint16_t val);#endif

3.实物效果

  • 硬件模块接线
    LED1正—>VCC
    LED1负—>PB8
    ST-Link下载方式
  • 实验现象
    使用定时器4通道3生成PWM波控制LED1实现呼吸灯。
    频率:2kHz,PSC=71,ARR=499

这里是引用

在这里插入图片描述
LED1连接STM32F103的PB8管脚,通过产品手册可知其在定时器4通道3。
在这里插入图片描述
在这里插入图片描述

定时器输出PWM实现呼吸灯实验keil源文件


http://www.ppmy.cn/ops/122919.html

相关文章

Thinkphp/Laravel基于vue.js的社区健康服务管理系统Vscode毕业设计成品源码_0i0k4

目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点&#xff1a;框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发&#xff0c;开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…

免费 Oracle 各版本 离线帮助使用和介绍

文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包&#xff1a;解压离线文档&#xff1a;访问离线文档&#xff1a;导航使用&#xff1a;目录介绍Install and Upgrade&#xff08;安装和升级&#xff09;&#xff1a;Administration&#xff08;管理&#…

留存率的定义与SQL实现

1.什么是留存率 留存率是指在特定时间段内&#xff0c;仍然继续使用某项产品或服务的用户占用户总数的百分比。 通常&#xff0c;留存率会以日&#xff0c;周&#xff0c;或月为单位进行统计和分析。 2.SQL留存率常见问题 1.计算新用户登录的日期的次日留存率以及3日留存率 …

【堆排】为何使用向下调整法建堆比向上调整法建堆更好呢?

文章目录 前言一、堆排代码一、计算使用向上调整法建堆的时间复杂度二、计算使用向下调整法插入的时间复杂度总结 前言 在博主的上一篇博客堆排(链接在这里点击即可)的总结中提出啦使用向下调整法建堆比使用向上调整法建堆更好&#xff0c;是因为使用向上调整法建堆的时间复杂…

Spring Boot:打造下一代医院管理系统

3系统分析 3.1可行性分析 通过对本医院管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

数据提取之JSON与JsonPATH

第一章 json 一、json简介 json简单说就是javascript中的对象和数组&#xff0c;所以这两种结构就是对象和数组两种结构&#xff0c;通过这两种结构可以表示各种复杂的结构 > 1. 对象&#xff1a;对象在js中表示为{ }括起来的内容&#xff0c;数据结构为 { key&#xff1…

机械臂路径规划基本概念

机械臂路径规划是机器人学中的一个重要研究领域&#xff0c;旨在确定机械臂从起始位置到目标位置的最优路径。以下是机械臂路径规划的基本概念&#xff1a; 1. 笛卡尔空间与关节空间 笛卡尔空间&#xff08;Cartesian Space&#xff09;&#xff1a;在笛卡尔空间中进行路径规…

Vue3 指令详解

一、构建指令 1. 生命周期 created&#xff1a;在指令被绑定到元素之前调用。这个钩子很少使用&#xff0c;因为指令通常在元素存在时才需要进行操作。 beforeMount&#xff1a;在指令绑定的元素被插入到 DOM 之前调用。 mounted&#xff1a;在指令绑定的元素被插入到 DOM 后调…