历史上的今天
今天是:2025年08月14日(星期四)
2018年08月14日 | STM32F103ZET6 — TIM6/TIM7
2018-08-14 来源: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--;
}
}
}
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 前几天在公交站牌上看到那个led屏上字符移动的效果,看了之后回来想玩玩,就做了这个,发上来分享一下!! … 查看全部问答> |
|
我用ADS1.2+JTAG调试程序的时候,定义的全局变量在赋值的时候赋不进去。当在初始化汇编代码init.s中加入存储寄存器初始化的代码,就可以赋值进去,这是什么原因呢 ? 加入的存储寄存器初始化代码如下: SMRDATA DATA ; Memory configuration sho ...… 查看全部问答> |
|
我将axsample在WM5模拟器上可以显示,为何连上手机却显示不了控件(我已经按照说明将证书加到了手机上)?请大虾们帮帮忙。… 查看全部问答> |
|
请教个问题,小弟的公司有一台设备A是西门子300的,安装s7后打不开,后来按照厂家的意思安装了s7的升级包(就是sp4),然后就可以看到。第二天因需要小弟装了s7-200的软件并用了一个上午,然后再打开300的时候设备A就看不到了,只能看到硬件组态。 ...… 查看全部问答> |
|
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SRC_Buffer; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DST_Buffer;采用M2M模式,在本地RAM测试通过。即SRC_Buffer[x]={}; DST_ ...… 查看全部问答> |
|
对于ti推出的msp430低功耗的16位单片机,评论很多。在这个时候推出16位的单片机,是否能够占领市场? 我们知道8位单片机在中国是处于龙头地位的。要动摇51单片机的地位,确实在中国有一定的困难。在中国,特别要考虑的是中国的国情。 比 ...… 查看全部问答> |




