【STM32+HAL】定时器功能小记

一、准备工作:

有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置

二、所用工具:

1、芯片: STM32F407ZGT6

2、STM32CubeMx软件

3、IDE: MDK-Keil软件

4、STM32F4xxHAL库

三、实现功能:

定时器中断、定时器输入捕获、定时器输出PWM波、定时器配置编码器模式

四、定时器中断:

1、初始化配置:

频率 f = APB2 Timer clocks (168MHz) / PSC / ARR;

2、开启中断

3、代码填写

//开启定时器中断
HAL_TIM_Base_Start_IT(&htim1);       

//定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim -> Instance == TIM1){
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	}
}

五、定时器5输入捕获:

1、开启定时器5输入捕获功能

如图,我开启了定时器五的输入通道二,配置PSC和ARR使得计数频率为1us一次,开启自动重装,滤波值设置为8

2、开启定时器五中断,并设置优先级

3、设置串口通信及定时器中断

设置为每0.5s串口打印当前频率,并开启中断,设置优先级

4、初始化TIM5及TIM2

  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start(&htim5);
	HAL_TIM_Base_Start_IT(&htim2);
	printf("Hello World!\r\n");
	HAL_Delay(200);
  /* USER CODE END 2 */

5、定义变量

/* USER CODE BEGIN PV */
uint32_t capture_Buf[4] = {0};
uint8_t capture_Cnt = 0;
uint32_t high_time;
int all_time=0;
/* USER CODE END PV */

6、编写定时器输入捕获代码

/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)   
{
	if(TIM5 == htim->Instance){
		switch(capture_Cnt){
			case 1:       //开始计算低电平
				capture_Buf[0] = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_2);
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_2,TIM_ICPOLARITY_FALLING);
				capture_Cnt++;
				break;
			case 2:       //开始计算高电平
				capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_2);
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);
				capture_Cnt++;
				break;
			case 3:       //一个周期结束
				capture_Buf[2] = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_2);
				HAL_TIM_IC_Stop_IT(&htim5,TIM_CHANNEL_2);
				capture_Cnt++;
				break;
		}
	}
}

/* USER CODE END 4 */

7、在主函数中循环计算结果

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	switch (capture_Cnt){
	case 0:
		capture_Cnt++;
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);
		HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2);
		break;
	case 4:
		high_time = capture_Buf[1]- capture_Buf[0];//高电平持续时间
		all_time = capture_Buf[2]- capture_Buf[0];//一个周期持续时间
//		HAL_Delay(100);
		capture_Cnt = 0;
		break;
	}
 }
  /* USER CODE END 3 */
}

六、定时器生成PWM波

1、初始化配置

2、代码填写

// 定时器参数配置
TIM2->ARR = 8400;
TIM2->CCR1 = 0;
TIM2->CCR2 = 0;


/* 开启PWM波 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);

七、定时器编码器模式

1、初始化配置

2、滤波

3、代码填写

/* 使能编码器输出 */
HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL);



/**************************************************************************
Function: Read encoder count per unit time
Input   : TIMX:Timer
Output  : none
函数功能:单位时间读取编码器计数
入口参数:TIMX:定时器
返回  值:速度值
**************************************************************************/
int Read_Encoder(uint8_t TIMX)
{
	int Encoder_TIM;
	switch(TIMX)
	{
		case 3:  Encoder_TIM = (short)TIM3 -> CNT;  TIM3 -> CNT = 0;break;
		case 4:  Encoder_TIM = (short)TIM4 -> CNT;  TIM4 -> CNT = 0;break;
		default: Encoder_TIM = 0;
	}
	return Encoder_TIM;
}

八、巨人之肩

【STM32】HAL库 STM32CubeMX教程八---定时器输入捕获

STM32CubeMX学习笔记(23)——通用定时器接口使用(输入捕获测量脉宽)

九、源码提供

【STM32+HAL】定时器输入捕获实现

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值