STM32c092包括一个高级控制定时器、六个通用定时器、两个看门狗定时器和一个SysTick定时器。表7比较了高级控制定时器和通用定时器的功能。
一:高级控制定时器(TIM1)
先进的控制定时器可以看作是在6个通道上多路复用的三相PWM单元。它具有具有可编程插入死区的互补PWM输出。它也可以看作是一个完整的一般用途定时器。四个独立的通道可用于:
输入捕捉
输出比较
PWM输出(边缘或中心对齐模式),具有全调制能力(0-100%)单脉冲模式输出。
除此之外,还有两个内部通道可供使用。
在调试模式下,高级控制定时器计数器可以被冻结,PWM输出被禁用,从而可以关闭由这些输出驱动的电源开关。
许多特性与通用TIMx定时器(在3.15.2节中描述)共享,使用相同的架构因此高级控制定时器可以通过Timer Link功能与TIMx定时器一起工作,以实现同步或事件链。
二:其他定时说明
通用定时器(TIM2、3、14、15、16、17)设备中嵌入了六个可同步的一般用途定时器(参见表7进行比较)。每个一般用途定时器都可以用于生成PWM输出或作为简单的定时器。
TIM2, TIM3
这些是功能齐全的一般计时器:
-TIM2具有32位自动重载上/下计数器和16位预分频器-TIM3 具有 16 位自动上/下计数器和 16 位预分频器它们有四个独立的通道用于输入捕获/输出比较、PWM或单脉冲模式输出。它们可以与其他通用定时器通过定时器链接功能进行组合操作,以实现同步或事件链。它们可以生成独立的DMA请求并支持正交编码器。它们的计数器可以在调试模式下冻结。
TIM14
这个定时器基于16位自动重载计数器和16位预分频器。它有一个通道用于输入捕获/输出比较、PWM输出或单脉冲模式输出。它的计数器可以在调试模式下冻结。
TIM15.TIM16.TIM17
这些是通用计时器,具有以下功能:
16位自动重新加载计数器和16位预分频器2个通道和1个用于TIM15的辅助通道
-1个通道和1个互补通道用于TIM16和TIM17
所有通道都可以用于输入捕获/输出比较、PWM或单脉冲模式输出。定时器可以通过定时器链接功能一起操作以实现同步或事件链。它们可以生成独立的DMA请求。它们的计数器可以在调试模式下冻结。
三:STM32cube MX 配置如下:
3.1 配置定时器2的基本参数,预分频系数和分频系数,重装值等等。
3.2 配置定时器的中断部分
四:软件编写:
1:使能定时器时钟。
2:初始化定时器,配置ARR,PSC。
3:开启定时器中断,配置NVIC。
4:使能定时器中断,配置优先级。
5: 编写定时器回调函数。
定时器初始化部分
void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 47;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_DISABLE;
sSlaveConfig.InputTrigger = TIM_TS_ITR0;
if (HAL_TIM_SlaveConfigSynchro(&htim2, &sSlaveConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END TIM2_Init 2 */
}
回调函数的编写:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
/* USER CODE BEGIN Callback 1 */
if (htim->Instance == TIM2) {
Time2point++;
if(Time2point >=1000)
{
Time2point = 0 ;
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
//HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
}
}
}
试验现象:LED灯以1S的时间间隔闪烁。
|