STM32之高级定时器输出有限个周期的PWM波

在STM32中的高级定时器有2个分别是:TIM1 、TIM8

高级定时器除了拥有通用定时器的所有功能外,还具有以下功能:

  1. 死区时间可编程的互补输出。
  2. 断路输入信号(刹车输入信号)。
  3. 重复计数器。

1.设计需求描述

用寄存器实现。输出5个周期的PWM波,频率2Hz,观察发光二极管闪烁5次,或者用示波器观察波形。

**需求实现思路:**使用高级定时器的重复计数器,当计数器溢出时,在溢出中断中停止定时器工作。重复计数器寄存器的值设置为4,即可输出5个周期的PWM波,发光二极管会闪烁5次。

2.硬件电路设计

设置高级定时器TIM1的CH1。

3.软件程序设计

Driver_TIM1.h

cpp 复制代码
#ifndef __DRIVER_TIM1_H
#define __DRIVER_TIM1_H

#include "stm32f10x.h"

void Driver_TIM1_Init(void);
void Driver_TIM1_Start(void);
#endif

​​​​​​​Driver_TIM1.c

cpp 复制代码
#include "Driver_TIM1.h"
#include "stdio.h"
#include "Driver_USART.h"

void Driver_TIM1_Init(void)
{
    /* 1. 开启时钟 */
    /* 1.1 TIM1的时钟 */
    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
    /* 1.2 GPIO的时钟 */
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

    /* 2. 给PA8配置复用推挽输出 CNF=10  MODE=11*/
    GPIOA->CRH |= (GPIO_CRH_CNF8_1 | GPIO_CRH_MODE8);
    GPIOA->CRH &= ~GPIO_CRH_CNF8_0;

    /* 3. 时基单元的配置  频率是2Hz的PWM*/
    /* 3.1 预分频 */
    TIM1->PSC = 7200 - 1;
    /* 3.2 自动重装载寄存器的值 */
    TIM1->ARR = 5000 - 1;
    /* 3.3 计数方向 0=向上计数 1=向下计数*/
    TIM1->CR1 &= ~TIM_CR1_DIR;
    /* 3.4 重复寄存器 RCR=4 表示CNT计数器溢出5次,才会产生更新时间(中断)*/
    TIM1->RCR = 4;

    /* 4. 输出部分配置 */
    /* 4.1 把通道1配置为输出*/
    TIM1->CCMR1 &= ~TIM_CCMR1_CC1S;
    /* 4.2 配置捕获比较寄存器的值 */;
    TIM1->CCR1 = 2500; /* 占空比 50% */
    /* 4.3 输出的极性 0=高电平有效 1=低电平有效 */;
    TIM1->CCER &= TIM_CCER_CC1P;
    /* 4.4 使能通道1 */;
    TIM1->CCER |= TIM_CCER_CC1E;
    /* 4.5 配置通道1输出模式: PWM1=110   */
    TIM1->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1);
    TIM1->CCMR1 &= ~TIM_CCMR1_OC1M_0;
    /* 4.6 主输出使能(只有高级定时器需要配置)*/
    TIM1->BDTR |= TIM_BDTR_MOE;
    
    /* 4.7 防止一启动就进入更新中断: 1. 使用UG位产生一个更新事件 2.然后预分频和重复计数器的值更新到影子寄存器 */;
    TIM1->EGR |= TIM_EGR_UG;
    TIM1->SR &= ~TIM_SR_UIF;
    
    /* 5. 配置中断 */
    /* 5.1 定时器更新中断使能 */
    TIM1->DIER |= TIM_DIER_UIE;
    /* 5.2 NVIC的配置 */
    NVIC_SetPriorityGrouping(3);
    NVIC_SetPriority(TIM1_UP_IRQn, 3);
    NVIC_EnableIRQ(TIM1_UP_IRQn);
}

void Driver_TIM1_Start(void)
{
    TIM1->CR1 |= TIM_CR1_CEN;     
}

void Driver_TIM1_Stop(void)
{
    TIM1->CR1 &= ~TIM_CR1_CEN;
}

void TIM1_UP_IRQHandler(void)
{
    // 停掉计数器
    printf("a\r\n");
    TIM1->SR &= ~TIM_SR_UIF;
    Driver_TIM1_Stop();
}

4.测试 展示

观察到示波器上显示如下波形:

再观察到STM32 的LED连续灯闪灭5次

相关推荐
俊基科技2 小时前
A-59U工业级多模语音处理模块在矿山矿井通信与呼叫报警系统中的应用
嵌入式硬件·嵌入式开发·硬件开发·ai降噪·回音消除·拾音降噪
周周记笔记4 小时前
GD32F450xx MCU Datasheet 解读:硬件测试工程师的测试方法论
单片机·嵌入式硬件
潘潘的嵌入式日记6 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
AOI小白新手上路7 小时前
江科协51单片机16-1 AD/DA ADC 三通道综合显示(LCD1602 版)改造说明
单片机·嵌入式硬件·51单片机
HUI-4748 小时前
EG1135|SSOP‑16 同步整流降压控制器,大功率外置 MOS 降压优选
单片机·嵌入式硬件·硬件工程
单片机仿真设计9 小时前
【proteus仿真】基于 STM32 单片机恒温箱控制系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
国科安芯9 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构
新晨单片机设计10 小时前
S003A-基于STM32单片机温度计(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·stm32单片机功能定制
一条破秋裤10 小时前
TIM 输入捕获与 PWMI:从边沿到频率、占空比
笔记·stm32·学习
AOI小白新手上路10 小时前
江科协51单片机16-1 DA数模转换实验(PWM 呼吸灯)
单片机·嵌入式硬件·51单片机