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

embedded/2024/10/18 20:04:10/

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/embedded/123654.html

相关文章

服务保护sentinel

线程隔离 - 线程池隔离&#xff1a;给每个服务调用业务分配一个线程池&#xff0c;利用线程池本身实现隔离效果。 - 信号量隔离&#xff1a;不创建线程池&#xff0c;而是计数器模式&#xff0c;记录业务使用的线程数量&#xff0c;达到信号量上限时&#xff0c;禁止新的请求。…

如何使用ssm实现民族大学创新学分管理系统分析与设计+vue

TOC ssm763民族大学创新学分管理系统分析与设计vue 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不…

H.264编解码工具 - x264

一、简介 x264是一个开源的H.264/AVC视频编码库,它可以将视频数据压缩成H.264格式,并且可以从H.264格式解码出原始视频数据。 x264是以C语言编写的,并且可以在多个平台上使用,包括Windows、Linux和Mac OS等操作系统。 x264具有很高的编码效率和视频质量,它支持多种编码…

Python人工智能使用OpenCV进行图片形状的中心检测

我们都知道正方形(长方形)的中心是2条对角线的交点,圆的中心是一个圆的圆心,如何在对象检测以及图片检测与识别领域,判断一个形状的中心,便是计算机视觉领域中的一个基础检测 中心检测 Opencv+python 实现物体形状的质心检测 OpenCV(Open Source Computer Vision Libr…

美容院管理创新:SpringBoot系统设计与开发

摘 要 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;因此传统管理方式就不适合。为了让美容院信息的管理模式进行升级&#xff0c;也为了更好的维护美容院信息&#xff0c;美容院管理系统的开发运用就显得很有必要。并且通过开发…

Python中的仅限位置参数与仅限关键字参数

Python中的仅限位置参数与仅限关键字参数 仅限位置参数仅限关键字参数总结 仅限位置参数 仅限位置参数指的是必须通过位置来传递的参数&#xff0c;不能通过关键字传递。Python 使用 / 符号来定义仅限位置参数&#xff0c;任何放在 / 前面的参数都必须通过位置传递。 def fun…

C++:静态成员

静态成员涉及到的关键字尾static 静态成员变量要在类外初始化 去掉static关键字类型类名&#xff1a;&#xff1a;变量名 静态成员变量不属于任何对象 所有对象共享一份 静态成员可以不通过对象直接访问 类名&#xff1a;&#xff1a;成员名 静态成员依旧受访问修饰符的约束 …

25维谛技术面试最常见问题面试经验分享总结(包含一二三面题目+答案)

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费&#xff01;全文干货。 【免费】25维谛技术面试最常见问题面试经验分享总结&#xff08;包含一二三面题目答案&#xff09;资源-CSDN文库https://download.csdn.net/download/m0_72216164/8979…