CubeMx笔记 --pwm输出+输入捕获

所用芯片:stm32f429
本文实现了(包含cubemx的配置)
1、利用PWM制作呼吸灯:定时器3通道4 (1.2)
2、定时器捕获按键的高电平时间:定时器5通道1(3.2)
3、定时器捕获方波的周期和占空比:定时器5通道1(4.2)
参考:
正点原子:STM32F429开发指南-HAL库版本_V1.1
自动重装载值

1、PWM制作呼吸灯

1.1、pwm输出原理

在这里插入图片描述我们假定定时器工作在向上计数 PWM模式,
且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1
所以:
当 CNT 值小于 CCRx 的时候, 输出低电平,
当 CNT 值大于等于 CCRx 的时候, 输出高电平,
当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数。
改变 CCRx 的值,就可以改变 PWM 输出的占空比
改变 ARR 的值,就可以改变 PWM 输出的频率

1.2、cubemx的设置

在这里插入图片描述

  • Clock Source
    选内部时钟
  • Channel的设置
    具体看自己开发板的手册
    这里我的板子上的led是连接在PB5上的,而定时器3的通道2又是映射在PB5的
  • Prescaler
    预分频 psc
  • Counter Period
    重载值 arr
  • 占空比:
    在一个脉冲周期,高电平相对于总时间所占的比例
    占空比 = Pulse(脉冲时长)/Counter Period(重装载值)
  • 脉冲周期
    T = (psc + 1)*(arr + 1)/72Mhz 72Mhz是定时器对应的时钟频率
    T= (71+1)( 499+1))/72Mhz=500us

1.3、keil设置

其他代码用cubemx自动生成的就行

uint8_t sta = 1; //防止pulse自加太多
uint32_t pwmval = 0; //用于修改CCRx 改变占空比
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);//启动pwm输出

while (1)
{
   
	if(sta)
	{
   
		pwmval++;
	}
	else
	{
   
		pwmval--;
	}
	
	if(pwmval > 300) //可以加到500,但300以后就灯很暗了
	{
   
		sta = 0;
	}
	if(pwmval == 0)
	{
   
	  sta = 1;
	}
	HAL_Delay(5);//控制自加的速度
	TIM3->CCR2 = pwmval;//修改寄存器的值,即修改CCRx
}

如果与LED绑定的引脚没有复用到任何一个定时器,可以选一个有定时器的引脚,将两个引脚相连,配置LED的那个引脚为输入模式即可

2、上升沿捕获

2.1、控制寄存器

TIMx_CR1 控制寄存器 1
TIMx control register 1
在这里插入图片描述

  • 位 9:8 CKD:
    时钟分频 (Clock division)
    此位域指示定时器时钟 (CK_INT) 频率与数字滤波器所使用的采样时钟( ETR、TIx)之间的
    分频比,
    00: tDTS = tCK_INT
    01: tDTS = 2 × tCK_INT
    10: tDTS = 4 × tCK_INT
    11:保留
  • 位 7 ARPE:
    自动重载预装载使能 (Auto-reload preload enable)
    0: TIMx_ARR 寄存器不进行缓冲
    1: TIMx_ARR 寄存器进行缓冲

TIMx 控制寄存器 2 (TIMx_CR2)
在这里插入图片描述

  • 位 6:4 MMS:主模式选择
    (Master mode selection)
    这些位可选择主模式下将要发送到从定时器以实现同步的信息 (TRGO)。这些位的组合如下:
    000: 复位––TIMx_EGR 寄存器中的 UG 位用作触发输出 (TRGO)。如果复位由触发输入
    生成(从模式控制器配置为复位模式),则 TRGO 上的信号相比实际复位会有延迟。
    001: 使能––计数器使能信号 (CNT_EN) 用作触发输出 (TRGO)。该触发输出可用于同时
    启动多个定时器,或者控制在一段时间内使能从定时器。计数器使能信号可由CEN控制位产
    生。当配置为门控模式时,也可由触发输入产生。
    当计数器使能信号由触发输入控制时, TRGO 上会存在延迟,选择主/从模式时除外(请参见
    TIMx_SMCR 寄存器中 MSM 位的说明)。
    010: 更新––选择更新事件作为触发输出 (TRGO)。例如,主定时器可用作从定时器的预分
    频器。
    011: 比较脉冲––一旦发生输入捕获或比较匹配事件,当 CC1IF 被置 1 时(即使已为高电
    平),触发输出都会发送一个正脉冲 (TRGO)。 (TRGO)
    100: 比较––OC1REF 信号用作触发输出 (TRGO)
    101: 比较––OC2REF 信号用作触发输出 (TRGO)
    110: 比较––OC3REF 信号用作触发输出 (TRGO)
    111: 比较––OC4REF 信号用作触发输出 (TRGO)

2.2、事件生成寄存器

TIMx event generation register
在这里插入图片描述

  • 位 0 UG:
    更新生成 (Update generation)
    该位可通过软件置 1,并由硬件自动清零。
    0:不执行任何操作
    1:重新初始化计数器并生成寄存器更新事件。
    请注意,预分频器计数器也将清零(但预分频比不受影响)。如果选择中心对齐模式或 DIR=0(递增计数),计数器将清零;如果 DIR=1(递减计数),计数器将使用自动重载值 (TIMx_ARR)。
  • 计数器使能信号 (CNT_EN)

2.3、从模式控制寄存器

TIMx_SMCR
TIMx slave mode control register
在这里插入图片描述

  • 位 7 MSM:
    主/从模式 (Master/Slave mode)
    0:不执行任何操作
    1:当前定时器的触发输入事件( TRGI)的动作被推迟,以使当前定时器与其从定时器实现
    完美同步(通过 TRGO)。此设置适用于单个外部事件对多个定时器进行同步的情况。

2.4、CubeMx设置

其他的看上面的寄存器
在这里插入图片描述

2.5、捕获上升沿

当检测到PA0上升沿就触发中断
定时器5
在这里插入图片描述

  • 开启中断

### STM32CubeMX 中的 PWM 同步功能配置 在 STM32 微控制器中,PWM 的同步功能通常通过 TIMx 外设实现。TIMx 提供了多种模式来支持多个定时器之间的同步操作。以下是关于如何在 STM32CubeMX 工具中配置 PWM 同步功能的相关说明。 #### 配置基础 STM32CubeMX 是一个图形化工具,用于初始化外设并生成相应的代码框架。为了启用 PWM 同步功能,需要关注以下几个方面: 1. **选择合适的定时器** 在 STM32 系列微控制器中,高级控制定时器(如 TIM1 和 TIM8)以及通用定时器(如 TIM2 至 TIM5)都可以用来生成 PWM 波形。这些定时器可以通过外部触发信号或其他定时器事件进行同步[^2]。 2. **设置主从模式 (Master-Slave Mode)** 主从模式允许一个定时器作为主设备,其他定时器作为从设备工作。这种机制可以确保多个通道上的 PWM 输出保持一致的时间关系。具体来说,在 STM32CubeMX 中: - 将主定时器配置为主模式。 - 设置其输出比较寄存器更新事件为触发源。 - 对于从属定时器,则需将其输入捕获单元绑定到主定时器的 TRGO 信号上。 3. **定义触发条件** 可以利用软件中断或者硬件连接的方式指定何时启动/停止计数过程。例如,当检测到来自主机的一个特定边沿变化时重新装载预分频值和自动重载寄存器的内容从而达到精确同步的目的[^3]。 4. **调整 DMA 请求映射表项** (可选) 如果计划采用直接存储访问(DMA)传输数据至DAC转换器之类的应用场景下,还需要额外考虑DMA请求优先级等问题. #### 示例代码片段 下面展示了一段简单的 HAL 库风格 C++ 实现部分: ```c // 初始化主从模式结构体变量 __HAL_TIM_SET_CLOCKSOURCE(&htim1,TIM_CLOCKSOURCE_INTERNAL); __HAL_TIM_ENABLE_IT(&htim1,TIM_IT_UPDATE); // 假定我们正在处理的是 TIM2 作为从设备的情况. void MX_TIM2_Init(void){ htim2.Instance=TIM2; htim2.Init.Prescaler=(SystemCoreClock/(1000*1))-1;//假设期望频率为1kHz ... } ``` 上述代码仅提供了一个非常基本的例子,并未完全体现实际项目中的复杂程度。更多细节请参照官方文档或应用笔记获取进一步指导[^4]. ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值