介绍
STM32F103ZET6 定时器资源非常丰富,根据 datasheet 描述,涵盖如下几种类型:
高级定时器 TIM1 / TIM8
通用定时器 TIM2 / TIM3 / TIM4 / TIM5
基本定时器 TIM6/ TIM7
本次描述的重点是基本定时器 TIM6/ TIM7
基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。
时钟
可以看到来自 APB1 的低频时钟经过频率x2供给了 TIM2~TIM7,其中包含了 TIM6/ TIM7,所以供给此部分的时钟为 72MHz
在 TIM6 / TIM7 中存在一个预分频器,支持输入的时钟进行预分频,计数器使用预分频后的时钟进行计数:
预分频的参数配置支持 1~65536
模式
TIM6 / TIM7 支持基本的循环计数,计数方式是从小到大。并且可以支持在任何时间内进行预分频系数的配置,配置在下一个UEV产生后生效。(UEV指的是一个更新时间,即一次计数溢出,当然,也可以支持软件进行主动触发)
可以支持 auto reload 和 one shot 的模式,即计数器完成一次计数之后,是自动重载之前的值,继续计数,还是完成一次计数任务后,停止计数。通过配置 TIMx_CR1 的 OPM单脉冲模式 (One-pulse mode) 来选择:
中断
可以通过配置中断,来达到计数器上溢出时刻产生对应的中断
配置过程
1. 打开 TIM6 / TIM7 的时钟
2. 配置中断优先级 NVIC 并使能中断
3. 配置分频系数和计数器的达到溢出的上限数值
4. 启用自动重装载预装载
5. 选择auto reload模式
6. 选择更新源(全开)
7. 开启溢出中断
8. 使能定时器
代码
初始化部分
这里 72MHz 的时钟输入,预分频为 7200(7200 - 1,这里是 datasheet中描述的预分频计算方法),计数为10000次溢出,故产生的是 1s 的定时器:
#define TIM6_CNT (10000 - 1)
#define TIM6_PSC (7200 - 1)
static SK_TIM6_NVICConifg(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* PE5/PE6 */
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void SK_TIM6_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
SK_TIM6_NVICConifg();
/// Step 1 : Open TIM6&TIM7 Clock
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
/// Step 2 : Set basic settings
// Input CLOCK = 72MHz
TIM_TimeBaseStructure.TIM_Period = TIM6_CNT;
TIM_TimeBaseStructure.TIM_Prescaler = TIM6_PSC;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM6, ENABLE);
TIM_SelectOnePulseMode(TIM6, TIM_OPMode_Repetitive);
TIM_UpdateRequestConfig(TIM6, TIM_UpdateSource_Global);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM6, ENABLE);
}
中断处理部分
void TIM6_IRQHandler(void)
{
static uint8_t cnt = 0;
if (TIM_GetITStatus(TIM6, TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
if (!cnt)
{
SK_SetLedStatus(SK_LED_1, SK_LED_ON);
cnt++;
}
else
{
SK_SetLedStatus(SK_LED_1, SK_LED_OFF);
cnt--;
}
}
}
上一篇:STM32F103ZET6 — RTC
下一篇:STM32F103ZET6 — TIM6/TIM7
推荐阅读最新更新时间:2024-11-10 12:38
设计资源 培训 开发板 精华推荐
- C3001879_基于CH340T芯片的USB转串口方案验证板
- 经济型RGB转VGA模块
- 使用 Analog Devices 的 LT1587CM-3.45 的参考设计
- 使用 Microchip Technology 的 LX8820 的参考设计
- 使用 Broadcom Inc 的 HCPL-7860 的参考设计
- LT6658BHMSE-2.5 汽车基准和电源电压应用的典型应用电路
- GD32萌新智能小车
- 使用 ROHM Semiconductor 的 BU4229 的参考设计
- ADD5045-915-1-GEVK:用于 DVK-2 评估套件的 AX5045 915 MHz 附加模块
- FS4508评估板, 系统基础芯片