1.时钟配置HSI主频配置64M
2.配置好串口,选择异步模式
3.配置TIM1_CH1产生1KHz的信号,主频64MHz,分频(64-1),计数周期(1000-1),这样即可生成1KHz信号。
4.配置TIM3_CH1和TIM3_CH2做输入捕获。
配置好需要的开发环境并获取代码
修改main.c
串口重定向
#include "stdio.h"
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
串口重定向一定要勾选Use Micro LIB
增加TIM1_Channel1_Set函数
void TIM1_Channel1_Set(uint8_t val)
{uint16_t temp = 0;temp = (val * 10);TIM_OC_InitTypeDef sConfigOC = {0};sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = temp;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}printf("temp = %d\r\n", temp);//HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
MX_TIM3_Init函数修改
void MX_TIM3_Init(void)
{/* USER CODE BEGIN TIM3_Init 0 *//* USER CODE END TIM3_Init 0 */TIM_SlaveConfigTypeDef sSlaveConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_IC_InitTypeDef sConfigIC = {0};/* USER CODE BEGIN TIM3_Init 1 *//* USER CODE END TIM3_Init 1 */htim3.Instance = TIM3;htim3.Init.Prescaler = 64-1;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 65535;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim3) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_Init(&htim3) != HAL_OK){Error_Handler();}sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sSlaveConfig.TriggerFilter = 0;if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){Error_Handler();}sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0xf;if (HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;sConfigIC.ICFilter = 0;if (HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_2) != HAL_OK){Error_Handler();}HAL_TIM_IC_Start(&htim3, TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim3, TIM_CHANNEL_2);/* USER CODE BEGIN TIM3_Init 2 *//* USER CODE END TIM3_Init 2 */}
主函数修改
int main(void)
{uint16_t Pulse_Value = 0;uint16_t Duty_Value = 0;uint16_t freq;uint16_t duty;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM1_Init();MX_TIM3_Init();MX_USART1_UART_Init();printf("main init\r\n");TIM1_Channel1_Set(30);while (1){Pulse_Value = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);Duty_Value = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_2);HAL_Delay(1000);if(Pulse_Value != 0){freq = 1000000 / (Pulse_Value + 1);duty = 100 * (Duty_Value + 1) / Pulse_Value;printf("freq = %d\r\n", freq);printf("duty = %d\r\n", duty);printf("Pulse_Value = %d\r\n", Pulse_Value);printf("Duty_Value = %d\r\n", Duty_Value);}}
}
串口打印