stm32cubemx hal学习记录:TIMER输入捕获

一、实验功能描述

使用一个定时器输出一路PWM,然后使用另一个定时器测量出占空比可频率

二、参数配置

1、配置RCC、SYS、USART1、时钟84MHz

2、使用TIM2的CH1通道输出1kHz,占空比为40%的方波

 3、使用TIM3的CH1和CH2的输入捕获功能进行检测占空比和测量频率

Counter Setting:

Prescaler(时钟预分频数):84-1  最大捕获频率84MHz/(83+1) = 1MHz

Counter Period(自动重装载值):65535,设置为最大值,若为32位则设置为4294967295

Input Capture Channel1:

Polarity Selection:Rising Edge(上升沿捕获)

Input Capture Channel2:

Polarity Selection:Failing Edge(下降沿捕获)

三、代码编写

1、TIM2输出一路PWM

    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);

    __HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,40);

2、在TIM3代码处启动TIM3 IC

	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);

 3、编写输入捕获函数

void TIM3_GetCapture(uint16_t *pucBuf)
{
	pucBuf[0]=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1;
	pucBuf[1]=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1;
}

4、在main中定义变量和调用函数

uint16_t ucCapt[2];
uint16_t Freq;
uint16_t Duty;


  while (1)
  {
		TIM3_GetCapture(ucCapt);
		
		Freq=1000000/ucCapt[0];
		Duty=ucCapt[1]*100/ucCapt[0];
		
  }

5、进行debug,结果正确

四、需要背的

1、输入捕获初始化

HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);

2、输入捕获函数

void TIM3_GetCapture(uint16_t *pucBuf)
{
	pucBuf[0]=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1;
	pucBuf[1]=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1;
}

3、频率与占空比计算公式

Freq=1000000/ucCapt[0];
Duty=ucCapt[1]*100/ucCapt[0];

### STM32CubeMX中配置输入捕获中断 在STM32微控制器的应用开发过程中,通过STM32CubeMX工具可以快速完成定时器输入捕获功能的初始化配置。以下是关于如何利用STM32CubeMX配置输入捕获中断的具体方法。 #### 1. 定时器模式的选择 为了实现输入捕获功能,需将定时器的工作模式设置为 **Input Capture Mode**。这可以通过STM32CubeMX图形化界面中的Timer模块进行操作。具体来说,选择目标定时器(如TIM2),并将其通道配置为输入捕获模式[^1]。 #### 2. 配置输入捕获参数 进入定时器高级控制选项后,可进一步调整以下参数: - **Polarity**: 设置捕获信号的有效边沿触发方式(上升沿、下降沿或双边沿)。 - **Prescaler**: 设定预分频系数以匹配所需的计数频率。 - **IC Filter**:输入信号施加滤波机制,减少噪声干扰的影响。 #### 3. 启用中断服务程序 为了让处理器能够响应外部事件的变化,在软件层面还需要开启相应的中断向量。此过程同样可以在STM32CubeMX里轻松达成——只需勾选对应定时器下的“CCxIE”项即可激活捕捉比较寄存器更新请求所引发的中断通知[^2]。 #### 示例代码展示 下面给出一段基于上述描述编写的简单示例代码用于演示目的: ```c #include "stm32f4xx_hal.h" void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){ if (htim->Instance == TIM2) { uint32_t inputCaptureValue = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1); // Process the captured value here... } } int main(void){ /* Initialization */ MX_GPIO_Init(); MX_TIM2_Init(); while(1){ ; } } ``` 以上片段展示了当发生特定条件满足时执行回调函数`HAL_TIM_IC_CaptureCallback()`来读取实际测量得到的时间戳数值,并可根据项目需求做后续处理逻辑扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值