一、准备工作:
有关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)——通用定时器接口使用(输入捕获测量脉宽)