1. 程式人生 > >stm32打怪升級之瞥眼定時器

stm32打怪升級之瞥眼定時器

idt blog app include 定時器 rip 搜索 lcm clas

定時器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打怪升級之瞥眼定時器