当前位置: 首页 > news >正文

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

1.硬件

  • STM32单片机最小系统
  • LED灯模块

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.lryc.cn/news/455823.html

相关文章:

  • 计算机网络:物理层 —— 信道复用技术
  • 期权懂|期权交易涨跌幅限制会随时调整吗?
  • 阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?
  • web:js原型污染简单解释
  • 【C++打怪之路Lv7】-- 模板初阶
  • 实战OpenCV之模板匹配
  • 【C++ 11】for 基于范围的循环
  • 创建索引时需要考虑的关键问题详解
  • 【JavaEE】【多线程】Thread类讲解
  • 硬件面试(一)
  • 9-贪心算法
  • 前端编程艺术(3)---JavaScript
  • 动态规划算法题目练习——91.解码方法
  • 每天一个数据分析题(四百九十二)- 主成分分析与因子分析
  • Linux shell编程学习笔记86:sensors命令——硬件体温计
  • 基于SSM车位租赁系统【附源码】
  • JAVA开源项目 新生报到网站 计算机毕业设计
  • QT将QBytearray的data()指针赋值给结构体指针变量后数据不正确的问题
  • 修改银河麒麟操作系统V10(SP1)网卡名称为ethx
  • MySQL多表查询:标量子查询
  • C++学习笔记----8、掌握类与对象(六)---- 操作符重载(1)
  • Ascend C 自定义算子开发:高效的算子实现
  • 面向对象技术——设计模式
  • 2024 Mysql基础与进阶操作系列之MySQL触发器详解(20)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
  • 找不到concrt140.dll如何修复,快来试试这6种解决方法
  • 年会工作会议会务报名签到小程序开源版开发
  • UE C++ 实时加载模型的总结
  • 实施威胁暴露管理、降低网络风险暴露的最佳实践
  • 51.哀家要长脑子了!
  • Overleaf 无法显示图片