[STM32F1]

stm32基础篇 ————定时器

[复制链接]
1083|8
手机看帖
扫描二维码
随时随地手机跟帖
aizaixiyuanqian|  楼主 | 2017-12-9 12:07 | 显示全部楼层 |阅读模式
我们将向大家介绍如何使用 STM32 的通用定时器, STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和 TIME7 等基本定时器。
实验目标:
利用 TIM3 的定时器中断来控制板子上面 8 个 LED 循环点亮的效果。

aizaixiyuanqian|  楼主 | 2017-12-9 12:10 | 显示全部楼层
STM32  通用定时器简介
STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。STM3 的通用 TIMx (TIM2、 TIM3、 TIM4 和 TIM5)定时器功能包括:

1)16 位向上、向下、向上/向下自动装载计数器。
2)16 位可编程预分频器,计数器时钟频率的分频系数为 1~65535 之间的任意数值。
3) 4 个独立通道,这些通道可以用来作为:
A.输入捕获
B.输出比较
C. PWM 生成(边缘或中间对齐模式)
D.单脉冲模式输出
4)可使用外部信号控制定时器和定时器的同步电路。
5)如下事件发生时产生中断/DMA:
A.更新:计数器向上溢出/向下溢出,计数器初始化
B.触发事件
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路
F.触发输入作为外部时钟或者按周期的电流管理


使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-9 12:11 | 显示全部楼层
更详细的大家可以参考中文手册

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-9 12:14 | 显示全部楼层
定时器库函数
/* 开启定时器 3 时钟 */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

定时器的初始化参数是通过初始化函数 TIM_TimeBaseInit 实现的:
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*
TIM_TimeBaseInitStruct);


函数里面定时器中断使能是通过 TIM_ITConfig 函数来实现的:
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalStateNewState);



TIM_Cmd(TIM3, ENABLE); //使能 TIMx 外设



使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-9 12:15 | 显示全部楼层
本帖最后由 aizaixiyuanqian 于 2017-12-9 12:16 编辑

定时器初始化参数结构体指针,结构体类型为 TIM_TimeBaseInitTypeDef,下面我们看看这个结构体的定义 :
typedef struct
{
uint16_t TIM_Prescaler;
uint16_t TIM_CounterMode;
uint16_t TIM_Period;
uint16_t TIM_ClockDivision;
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
这个结构体一共有 5 个成员变量。
第一个参数 TIM_Prescaler 是用来设置分频系数的,刚才上面有讲解。
第二个参数 TIM_CounterMode 是用来设置计数方式,上面讲解过,可以设置为向上计数,向下计数方式还有中央对齐计数方式, 比较常用的是向上计数TIM_CounterMode_Up 和向下计数模式 TIM_CounterMode_Down。
第三个参数是设置自动重载计数周期值,这在前面也已经讲解过。
第四个参数是用来设置时钟分频因子。

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 5000;
TIM_TimeBaseStructure.TIM_Prescaler =7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-9 12:17 | 显示全部楼层
初始化函数
void time_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //声明一个结
构体变量,用来初始化 GPIO
NVIC_InitTypeDef NVIC_InitStructure;
/* 开启定时器 3 时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除 TIMx 的中断待处理
位:TIM 中断源
TIM_TimeBaseInitStructure.TIM_Period = 2000;//设置自动重装载寄存器
周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 35999;//设置用来作为 TIMx
时钟频率预分频值,100Khz 计数频率
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //设置时钟分
割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode =
TIM_CounterMode_Up;//TIM 向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_Cmd(TIM3,ENABLE); //使能或者失能 TIMx 外设
/* 设置中断参数,并打开中断 */
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE ); //使能或者失能指定的
TIM 中断
/* 设置 NVIC 参数 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //打开 TIM3_IRQn 的全
局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优
先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为 1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-9 12:17 | 显示全部楼层
定时器中断 函数
void TIM3_IRQHandler() //定时器 3 中断函数
{
static u8 i=0;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
GPIO_Write(GPIOC,(u16)~(0x01<<i++));
if(i==8)i=0;
}

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-9 12:18 | 显示全部楼层
主函数部分直接调用即可。

使用特权

评论回复
aizaixiyuanqian|  楼主 | 2017-12-9 12:18 | 显示全部楼层
大家可以自己练习其它定时器的方式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝