历史上的今天
今天是:2024年11月05日(星期二)
2021年11月05日 | STM32F103ZET6 — TIM6/TIM7
2021-11-05 来源:eefocus
介绍
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--;
}
}
}
史海拾趣
|
《嵌入式Linux免费体验班》(1天) 今年5.1放假干嘛去?参加嵌入式Linux免费体验活动! ————————名额有限,限定12人,先报先得! 课程目标: 本课程针对嵌入式Linux开发的初学人员,能快速了解嵌入式Linux系统,了解嵌入式Linux ...… 查看全部问答> |
|
我现在用的是WINCE5.0,一般的FRAMEWORK中有PRINTDIALOG之类的打印类提供,但是在WINCE5.0的FRAMEWORK中没有,现在不知道该如何实现打印,或者是否也可以通过调用API来实现呢. 其中打印机驱动已经提供. 望高人给予指点.谢谢先.… 查看全部问答> |
|
我写了一段STM32低功耗的程序,采用RTC唤醒,但是发现总是不会醒来。而我一旦只要打开了DEBUG,在KEIL 调试时,如果我设置一下或是停止一下断点,就能够醒过来,奇怪: 我的代码如下: /** * @brief Main program. ...… 查看全部问答> |
|
多功能调试测试助手-完整PCB工程包 格式说明:protel99se 需要的朋友可以直接拿去制版,不过要注意器件的封装哦! 一、交流信号发生器(DDS直接频率合成):频率,相位,幅度可控 二、16*64点阵屏人机面板 … 查看全部问答> |
|
玩转MSP-EXP430FR5969 LaunchPad 实用问答! 下面汇总了部分网友在TI 首届低功耗大赛中出现的一些问题。用到FR5969开发板的你如果也遇到一些问题,同时已经解决,请将问题及解决方法跟帖与大家分享,我将会汇总到一楼。 5969的供电出现的一些奇怪现象 https://bbs.eeworld.com.cn/thread-452 ...… 查看全部问答> |




