TIM_HandleTypeDef htim14;
/* TIM14 init function */
void MX_TIM14_Init(void)
{
/* USER CODE BEGIN TIM14_Init 0 */
/* USER CODE END TIM14_Init 0 */
/* USER CODE BEGIN TIM14_Init 1 */
/* USER CODE END TIM14_Init 1 */
htim14.Instance = TIM14;
htim14.Init.Prescaler = 42-1;
htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
htim14.Init.Period = 4-1;
htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM14_Init 2 */
/* USER CODE END TIM14_Init 2 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM14)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
}
}
}
以STM32F405RGT6为例,使用外部有源晶振。
中断里只做翻转IO操作。
TIM14的时钟是84MHz,故
更新周期为:time = 4*(42/84000000)*1000000 = 2us
逻辑分析仪采集检测正确。但当
htim14.Init.Prescaler = 21-1;
htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
htim14.Init.Period = 4-1;
更新周期理论为:time = 4*(21/84000000)*1000000 = 1us
实际采集并不是1us。
所以想通过更新中断输出高精度PWM波形的家人们还是选择硬件Timer输出PWM吧