STM32F103系列TIM1~TIM8库函数初始化代码批量发布⼲货 前⾔:⼤家学⽣平时使⽤STM32F103系列的单⽚机⽐较多,我发布了⼀个串⼝2和串⼝3的帖⼦深受⼤家欢迎。
为了⽅便⼤家使⽤,本帖⼦贴出来了⾼级定时器TIM1和TIM8,普通定时器TIM2~TIM5,低级定时器TIM6和TIM7共8个定时器的库函数初始化代码,⽅便⼤家使⽤,还请⼤家继续⽀持我。
⾼级定时器
TIM1初始化.h头⽂件
1#ifndef __TIMER1_H
2#define __TIMER1_H
3#include "stm32f10x.h"
4
5void TIM1_Init(unsigned int arr,unsigned int psc);
6
7#endif
TIM1初始化.c源⽂件
6void TIM1_Init(unsigned int arr,unsigned int psc)
7{
8
9 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
10 NVIC_InitTypeDef NVIC_InitStructure;
11
12 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定时器1时钟
13
14 //初始化TIM1
15 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下⼀个更新事件装⼊活动的⾃动重装载寄存器周期的值
16 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置⽤来作为TIMx时钟频率除数的预分频值
17 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
18 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
19 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位20 21 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //参数初始化
22 TIM_ClearFlag(TIM1, TIM_FLAG_Update);//清中断标志位 23 TIM_ITConfig(TIM1, TIM_IT_Update|TIM_IT_Trigger,ENABLE ); //使能指定的TIM1中断,允许更
新中断允许触发中断源
24
25 //中断优先级NVIC设置
26 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1中断
27 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
28 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
29 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
30 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
31
32 TIM_Cmd(TIM1, ENABLE); //使能TIM1
33
34}
35
36//定时器1中断服务程序
37void TIM1_UP_IRQHandler(void) //TIM8中断
38{
39 if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)//检查指定的TIM中断发⽣与否:TIM 中断源
40 {
41 //应⽤代码编写区
42
43 TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除TIMx的中断待处理位:TIM 中断源
44 }
45}
TIM8初始化.h头⽂件
1#ifndef __TIMER8_H
2#define __TIMER8_H
3#include "stm32f10x.h"
4
5void TIM8_Init(unsigned int arr,unsigned int psc);
6
7#endif
TIM8初始化.c源⽂件
5//psc:时钟预分频数
引道结构图
散堆填料6void TIM8_Init(unsigned int arr,unsigned int psc)
7{
8 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
9 NVIC_InitTypeDef NVIC_InitStructure;
10
11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); //使能定时器1时钟
12
13 //初始化TIM8
14 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下⼀个更新事件装⼊活动的⾃动重装载寄存器周期的值
15 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置⽤来作为TIMx时钟频率除数的预分频值
智能家居系统
16 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
17 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
18 TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位19
20 TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //参数初始化
21 TIM_ClearFlag(TIM8, TIM_FLAG_Update);//清中断标志位
22 TIM_ITConfig(TIM8, TIM_IT_Update|TIM_IT_Trigger,ENABLE ); //使能指定的TIM8中断,允许更新中断允许触发中断源
23
24 //中断优先级NVIC设置
25 NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn; //TIM8中断
26 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
27 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
28 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
29 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
30
31 TIM_Cmd(TIM8, ENABLE); //使能TIM8
32
33}
34
35//定时器8中断服务程序
36void TIM8_UP_IRQHandler(void) //TIM8中断
37{
38 if(TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)//检查指定的TIM中断发⽣与否:TIM 中断源
39 {
40 //代码应⽤区
41
42 TIM_ClearITPendingBit(TIM8, TIM_IT_Update);//清除TIMx的中断待处理位:TIM 中断源
43 }
44}
普通定时器
TIM2初始化.h头⽂件
1#ifndef __TIMER2_H
2#define __TIMER2_H
3#include "stm32f10x.h"
4
5void TIM2_Init(unsigned int arr,unsigned int psc);
6
7#endif
TIM2初始化.c源⽂件
1#include "sys.h"
2#include "timer2.h"
3
4//arr:⾃动重装值
5//psc:时钟预分频数
6void TIM2_Init(unsigned int arr, unsigned int psc)
7{
8 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
9 NVIC_InitTypeDef NVIC_InitStructure;
10
11 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
12 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
13
14 TIM_TimeBaseStructure.TIM_Period = arr; //⾃动重装载周期值
15 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频值
16 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
17 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
18 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx
19
20 TIM_ITConfig( TIM2,TIM_IT_Update | TIM_IT_Trigger, ENABLE );//使能更新触发TIM中断21
22 //中断分组设置
23 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断
24 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级0级
25 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
26 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
触摸调光ic
27 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器28
29 TIM_Cmd(TIM2, ENABLE); //使能TIMx外设
30
31}
32
33//定时器2中断服务程序
34void TIM2_IRQHandler(void)
35{
36 //判断TIM2更新中断是否发⽣
37 if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
38 {
39 //代码应⽤区
40
41 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
42 }
43}
TIM3初始化.h头⽂件
1#ifndef __TIMER3_H
2#define __TIMER3_H
3#include "stm32f10x.h"
4
5void TIM3_Init(unsigned int arr,unsigned int psc);
6
7#endif
TIM3初始化.c源⽂件
1#include "sys.h"
2#include "timer3.h"
3
4//arr:⾃动重装值
5//psc:时钟预分频数
6void TIM3_Init(unsigned int arr, unsigned int psc)
7{
8 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
57cao9 NVIC_InitTypeDef NVIC_InitStructure;
10
11 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
12
13 TIM_TimeBaseStructure.TIM_Period = arr; //⾃动重装载周期值
14 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频值
15 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
16 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
17 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx
18
19 TIM_ITConfig( TIM3,TIM_IT_Update | TIM_IT_Trigger, ENABLE );//使能更新触发TIM中断
20
21 //中断分组设置
22 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
23 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级0级
24 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
宿主化25 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
26 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
27
28 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
29}
30
31//中断服务程序
32void TIM3_IRQHandler(void)
33{
34 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发⽣与否:TIM 中断源
35 {
36 //代码应⽤区
37
38 TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
39 }
40}
TIM4初始化.h头⽂件
1#ifndef __TIMER4_H
2#define __TIMER4_H
3#include "stm32f10x.h"
4
5void TIM4_Init(unsigned int arr,unsigned int psc);
6
7#endif
TIM4初始化.c源⽂件