首页 > 代码库 > stm32打怪升级之瞥眼定时器

stm32打怪升级之瞥眼定时器

定时器TIM------->DMA
(不用看功能直接忽略介绍)

外部中断得开启复用功能

定时器TIM)
时钟源:stm32时钟系统框图(需要下载)
外部中断得开启复用功能
实验目的:定时1s让灯亮
库:定时用到了stm3210x_tim.h库
模版:工程模版+TIM3_IRQHandler模版

流程
1.复制工程模版
2.打开工程模版在app中新建文件定时器
3.新建time.h和time.c文件添加至app定时器中
4.在time.h文件中写入声明voidtime_init
(void),且修改#define _TIME_H
5.在time.c文件中#include “time.h”,
6.在app中添加time.c中文件
7.在option中的c/c++中包含定时器路径
8.由于使用定时器使用了stm32f10x_tim.h库,所以在存放所用库fwilb中添加stm32f10x_tim.h,并且在公共函数库public中添加#include "stm3210x_tim.h"
9.开始在time.h中编写time_init()函数(查阅固件库中文手册)
10.编写完毕后,在stmf10x_it.h文件中编写定时器中断函数void TIM3_IRQHandler(),没有声明需要在.h中进行声明
11.编写主函数
注意:
1.我们用到了定时器,必须在此工程使用的头文件fwilb中添加此头文件
而且得把这个头文件添加到公共头文件里面,不然会报错
.\output\工程模板.axf: Error: L6218E: Undefined symbol TIM_TimeBaseInit (referred from time.o).
2.每次编写中断函数的时候,必须先进行擦除操作,即 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);

以下是time_init()模版代码

 1 void time_init(void)
 2 {
 3     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;  //定时结构体  
 4 
 5     NVIC_InitTypeDef NVIC_InitStructure;                 //中断结构体
 6 
 7     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //系统时钟,注意APB1和TIM3的关系
 8 
 9     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);        //清除之前的中断数据,必须用,包括写中断函数的时候     
10     TIM_TimeBaseInitStructure.TIM_Period = 2000;    
11     TIM_TimeBaseInitStructure.TIM_Prescaler = 35999;  
#计算定时时间=TIM_Period\72M\
TIM_Prescaler+1
12   TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //是否时钟分割 

13   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式
14   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

15  TIM_Cmd(TIM3,ENABLE); //使能
16
17  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE ); //设置中断参数TIM3
18
19
20   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置NVIC参数,注意groop_1

21   NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //全局中断设置

22   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; 配对groop_1

23   NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

24   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能

25   NVIC_Init(&NVIC_InitStructure);

26 }

 

打下划线的是根据自己需求而改的

思路:定时1s的流水灯,需要使用定时器,所以使用tim.h库,通过配置time_init(计算定时时间=TIM_Period\72M\TIM_Prescaler+1)定时1s,编写中断函数void TIM3_IRQHandler()对灯进行控制

可能对TIM3和APBx有疑问,在stm32时钟分配图中有介绍

 TIM1/8---->APB2    TIM2-7-------->APB1

这也可以在库中可以找到

stm32f10x.h  ,

类似于结构体可以搜索InitStructure找到相关结构体写法,然后使用go to definition直接找到结构体里面的参数

stm32打怪升级之瞥眼定时器