1.时钟配置如前面
2.定时器输入捕获通道一设置
3.主函数(注意开启定时器中断)
uint16_t capture = 0;
uint8_t End_status = 0;
uint16_t Cap_Timer = 0;
uint32_t H_Timer = 0;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM6_Init();
MX_TIM5_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim5); //开启定时器5中断
HAL_TIM_Base_Start_IT(&htim6); //开启定时器6中断
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1); //启动输入捕获
printf("STM32 定时器2 输入捕获 获取高电平脉冲");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(End_status == 1) //捕获成功
{
End_status = 0;
H_Timer = capture + Cap_Timer*0xFFFF;
printf("获取高电平脉冲时间: %d.%d ms",H_Timer/1000,H_Timer%1000);
}
}
/* USER CODE END 3 */
}
4.定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint16_t Timer = 0;
if(TIM5 == htim->Instance)
{
Cap_Timer++;
}
if(TIM6 == htim->Instance)
{
if(++Timer == 1000) //到1S LED取反
{
Timer = 0;
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}
}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint8_t First_status = 1;
if(TIM5 == htim->Instance )
{
if(First_status == 1)
{
Cap_Timer = 0;
capture = 0;
__HAL_TIM_SetCounter(&htim5,0); //清零
//修改定时器一通道的输入捕获极性 下降沿
__HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
First_status = 0;
}
else
{
//capture = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
capture = __HAL_TIM_GetCounter(&htim5); //获取高电平时间
__HAL_TIM_SetCounter(&htim5,0);
//修改定时器一通道的输入捕获极性 上升沿
__HAL_TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
First_status = 1;
End_status = 1; //捕获成功标志
}
}
}
4.调试结果(抓取PC0时间)