灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置
灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置
目录:
1、Timer1高级定时器Timer3通用定时器Timer14基本定时器简介
2、Timer1高级定时器Timer3通用定时器Timer14基本定时器功能特性
3、Timer1高级定时器Timer3通用定时器Timer14基本定时器实现基本定时中断功能的初始化配置
4、Timer1高级定时器Timer3通用定时器Timer14基本定时器实现基本定时中断功能,分别定时1ms/5ms/1s并分别翻转LED1/LED2/LED3的状态
1、Timer1高级定时器Timer3通用定时器Timer14基本定时器简介:
(1)高级控制定时器 (TIM1) 由一个 16 位的自动装载计数器组成,它由一个可编程的预分频器驱动,适合多种用途,包含测量输入信号的脉冲宽度 (输入捕获),或者产生输出波形 (输出比较、PWM、嵌入死区时间的互补PWM 等)。使用定时器预分频器和 RCC 时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。高级控制定时器 (TIM1) 和通用定时器 (TIMx)是完全独立的,它们不共享任何资源。它们可以同步操作。
(2)通用定时器(TIM3)是一个通过可编程预分频器驱动的 16 位自动装载计数器构成,适用于多种场合,包括测量输入信号的脉冲长度 (输入捕获) 或者产生输出波形 (输出比较和 PWM)。使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。TIMx 定时器是完全独立的,而且没有互相共享任何资源。它们可以一起同步操作。
(3)基本定时器TIM14由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动,适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较和 PWM)。使用定时器预分频器和 RCC 时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。基本定时器 TIM14 是完全独立的,不共享任何资源。
2、Timer1高级定时器Timer3通用定时器Timer14基本定时器功能特性:
(1)TIM1 定时器的功能特性包括:
• 16 位向上、向下、向上/下自动装载寄存器
• 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536 之间的
任意数值
• 多达 4 个独立通道
– 输入捕获
– 输出比较
– PWM 生成 (边缘或中间对齐模式)
– 单脉冲模式输出
• 死区时间可编程的互补输出
• 使用外部信号控制定时器和定时器互联的同步电路
• 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
• 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
• 支持针对定位的增量 (正交) 编码器和霍尔传感器电路
• 触发输入作为外部时钟或者按周期的电流管理
(2)通用 定时器(TIM3) 定时器功能特性:
• 16 位向上、向下、向上/向下自动装载计数器
• 16 位可编程 (可以实时修改) 预分频器,计数器时钟频率的分频系数为 1~65536 之间
的任意数值
• 3 个独立的通道
– 输入捕获
– 输出比较
– PWM 生成 (边缘或中间对齐模式)
– 单脉冲模式输出
• 使用外部信号控制定时器和定时器互连的同步电路
• 支持针对定位的增量 (正交) 编码器和霍尔传感器电路
• 触发输入作为外部时钟或者按周期的电流管理
(3)基本 定时器(TIM14) 定时器功能特性:
• 16 位自动装载计数器
• 16 位可编程 (可以实时修改) 预分频器,计数器时钟频率的分频系数为 1~65536 之间
的任意数值
• 独立通道
– 输入捕获
– 输出比较
– PWM 生成 (边缘对齐模式)
• 如下事件发生时产生中断
– 更新:计数器溢出,计数器初始化 (通过软件)
– 输入捕获
– 输出比较
3、Timer1高级定时器Timer3通用定时器Timer14基本定时器实现基本定时中断功能的初始化配置:
(1)在MDK Keil工程中新建bsp_timerx.c和bsp_timerx.h文件,在bsp_timerx.c中包含bsp_timerx.h文件,
(2)编写Timer1实现1ms定时中断初始化函数以及中断函数
1 #include "bsp_timerx.h" 2 3 //Timer1 1ms Flag 4 u8 TIM1_1ms_Flag = 0; 5 //Timer3 5ms Flag 6 u8 TIM3_5ms_Flag = 0; 7 //Timer14 1s Flag 8 u8 TIM14_1s_Flag = 0; 9 10 /** 11 *********************************************************************************************************************** 12 *@函数名称:void Bsp_TIM1_Init(u16 Prescaler,u16 Period) 13 *@功能描述:TIM1 Init 14 *@输入参数:Prescaler:预分频系数1-65536、Period:周期值 15 *@返回参数:None 16 *********************************************************************************************************************** 17 */ 18 void Bsp_TIM1_Init(u16 Prescaler,u16 Period) 19 { 20 TIM_TimeBaseInitTypeDef TIM_StructInit; 21 NVIC_InitTypeDef NVIC_StructInit; 22 23 //使能TIM1外设时钟 24 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM1, ENABLE); 25 //配置TIM1重载计数周期值 26 TIM_StructInit.TIM_Period = Period; 27 //配置TIM1 预分频系数 28 TIM_StructInit.TIM_Prescaler = Prescaler; 29 //配置TIM1时钟分割 30 TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1; 31 //向上计数模式 32 TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up; 33 //配置脉冲周期计数 34 TIM_StructInit.TIM_RepetitionCounter = 0; 35 //根据以上配置参数初始化 TIM1结构体成员参数 36 TIM_TimeBaseInit(TIM1, &TIM_StructInit); 37 //使能TIM1 NVIC中断优先级通道 38 NVIC_StructInit.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn; 39 //配置TIM1 NVIC中断优先级 40 NVIC_StructInit.NVIC_IRQChannelPriority = 0; 41 //使能NVIC中断优先级 42 NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE; 43 //根据配置的中断优先级参数初始化TIM1中断优先级 44 NVIC_Init(&NVIC_StructInit); 45 //TIM1计时之前清向上计数标志 46 TIM_ClearFlag(TIM1, TIM_FLAG_Update); 47 //使能TIM1向上计时中断 48 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); 49 //使能TIM1 工作 50 TIM_Cmd(TIM1, ENABLE); 51 }
1 /** 2 *********************************************************************************************************************** 3 *@函数名称:void TIM1_BRK_UP_TRG_COM_IRQHandler(void) 4 *@功能描述:TIM1中断服务程序 5 *@输入参数:None 6 *@返回参数:None 7 *********************************************************************************************************************** 8 */ 9 void TIM1_BRK_UP_TRG_COM_IRQHandler(void) 10 { 11 if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) 12 { 13 TIM_ClearITPendingBit(TIM1, TIM_IT_Update); 14 //1ms 15 TIM1_1ms_Flag = 1; 16 } 17 }
(3)编写Timer3实现5ms定时中断初始化函数以及中断函数
1 /** 2 *********************************************************************************************************************** 3 *@函数名称:void Bsp_TIM3_Init(u16 Prescaler,u16 Period) 4 *@功能描述:TIM3 Init 5 *@输入参数:Prescaler:预分频系数1-65536、Period:周期值 6 *@返回参数:None 7 *********************************************************************************************************************** 8 */ 9 void Bsp_TIM3_Init(u16 Prescaler,u16 Period) 10 { 11 TIM_TimeBaseInitTypeDef TIM_StructInit; 12 NVIC_InitTypeDef NVIC_StructInit; 13 14 //使能TIM3外设时钟 15 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 16 //配置TIM3重载计数周期值 17 TIM_StructInit.TIM_Period = Period; 18 //配置TIM3 预分频系数 19 TIM_StructInit.TIM_Prescaler = Prescaler; 20 //配置TIM3时钟分割 21 TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1; 22 //向上计数模式 23 TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up; 24 //配置脉冲周期计数 25 TIM_StructInit.TIM_RepetitionCounter = 0; 26 //根据以上配置参数初始化 TIM3结构体成员参数 27 TIM_TimeBaseInit(TIM3, &TIM_StructInit); 28 29 //使能TIM3 NVIC中断优先级通道 30 NVIC_StructInit.NVIC_IRQChannel = TIM3_IRQn; 31 //配置TIM3 NVIC中断优先级 32 NVIC_StructInit.NVIC_IRQChannelPriority = 1; 33 //使能NVIC中断优先级 34 NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE; 35 //根据配置的中断优先级参数初始化TIM3中断优先级 36 NVIC_Init(&NVIC_StructInit); 37 38 //TIM3计时之前清向上计数标志 39 TIM_ClearFlag(TIM3, TIM_FLAG_Update); 40 //使能TIM3向上计时中断 41 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); 42 //使能TIM3 工作 43 TIM_Cmd(TIM3, ENABLE); 44 }
1 /** 2 *********************************************************************************************************************** 3 *@函数名称:void TIM3_IRQHandler(void) 4 *@功能描述:TIM3中断服务程序 5 *@输入参数:None 6 *@返回参数:None 7 *********************************************************************************************************************** 8 */ 9 void TIM3_IRQHandler(void) 10 { 11 if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 12 { 13 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); 14 //5ms 15 TIM3_5ms_Flag = 1; 16 } 17 }
(4)编写Timer14实现1s定时中断初始化函数以及中断函数
1 /** 2 *********************************************************************************************************************** 3 *@函数名称:void Bsp_TIM14_Init(u16 Prescaler,u16 Period) 4 *@功能描述:TIM14 Init 5 *@输入参数:Prescaler:预分频系数1-65536、Period:周期值 6 *@返回参数:None 7 *********************************************************************************************************************** 8 */ 9 void Bsp_TIM14_Init(u16 Prescaler,u16 Period) 10 { 11 TIM_TimeBaseInitTypeDef TIM_StructInit; 12 NVIC_InitTypeDef NVIC_StructInit; 13 14 //使能TIM14外设时钟 15 RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM14, ENABLE); 16 //配置TIM14重载计数周期值 17 TIM_StructInit.TIM_Period = Period; 18 //配置TIM14预分频系数 19 TIM_StructInit.TIM_Prescaler = Prescaler; 20 //配置TIM14时钟分割 21 TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1; 22 //向上计数模式 23 TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up; 24 //配置脉冲周期计数 25 TIM_StructInit.TIM_RepetitionCounter = 0; 26 //根据以上配置参数初始化 TIM14结构体成员参数 27 TIM_TimeBaseInit(TIM14, &TIM_StructInit); 28 29 //使能TIM14 NVIC中断优先级通道 30 NVIC_StructInit.NVIC_IRQChannel = TIM14_IRQn; 31 //配置TIM14 NVIC中断优先级 32 NVIC_StructInit.NVIC_IRQChannelPriority = 2; 33 //使能NVIC中断优先级 34 NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE; 35 //根据配置的中断优先级参数初始化TIM14中断优先级 36 NVIC_Init(&NVIC_StructInit); 37 38 //TIM14计时之前清向上计数标志 39 TIM_ClearFlag(TIM14, TIM_FLAG_Update); 40 //使能TIM14向上计时中断 41 TIM_ITConfig(TIM14, TIM_IT_Update, ENABLE); 42 //使能TIM14 工作 43 TIM_Cmd(TIM14, ENABLE); 44 }
1 /** 2 *********************************************************************************************************************** 3 *@函数名称:void TIM14_IRQHandler(void) 4 *@功能描述:TIM14中断服务程序 5 *@输入参数:None 6 *@返回参数:None 7 *********************************************************************************************************************** 8 */ 9 void TIM14_IRQHandler(void) 10 { 11 if(TIM_GetITStatus(TIM14, TIM_IT_Update) != RESET) 12 { 13 TIM_ClearITPendingBit(TIM14, TIM_IT_Update); 14 //1s 15 TIM14_1s_Flag = 1; 16 } 17 }
(5)编写bsp_timerx.h头文件
1 #ifndef __BSP_TIMX__H__ 2 #define __BSP_TIMX__H__ 3 4 #include "mm32_device.h" 5 #include "hal_conf.h" 6 #include "bsp_gpio_led.h" 7 8 //Timer1 1ms Flag 9 extern u8 TIM1_1ms_Flag; 10 //Timer3 5ms Flag 11 extern u8 TIM3_5ms_Flag; 12 //Timer14 1s Flag 13 extern u8 TIM14_1s_Flag; 14 15 //声明初始化TIM1 16 void Bsp_TIM1_Init(u16 Prescaler,u16 Period); 17 //声明初始化TIM3 18 void Bsp_TIM3_Init(u16 Prescaler,u16 Period); 19 //声明初始化TIM14 20 void Bsp_TIM14_Init(u16 Prescaler,u16 Period); 21 22 #endif
4、Timer1高级定时器Timer3通用定时器Timer14基本定时器实现基本定时中断功能,分别定时1ms/5ms/1s并分别翻转LED1/LED2/LED3的状态:
(1)在main.c文件中包含#include "bsp_gpio_led.h"和#include "bsp_timerx.h"头文件
(2)在main函数中分别调用LED、TIM1、TIM3、TIM14定时器中断初始化函数,并在 "bsp_timerx.h"头文件包含的mm32_device.h头文件中对SystemCoreClock参数作extern声明,while(1)大循环中分别判断TIM1_1ms_Flag、TIM1_5ms_Flag、TIM1_1s_Flag的时间标志,时间到即分别
翻转LED1、LED2、LED3的电平状态,代码如下所示:
1 #include "bsp_gpio_led.h" 2 #include "bsp_timerx.h" 3 4 /** 5 *********************************************************************************************************************** 6 *@函数名称:int main(void) 7 *@功能描述:main函数,主函数入口代码在这里开始执行 8 *@输入参数:None 9 *@返回参数:int:0(和编译器有关) 10 *********************************************************************************************************************** 11 */ 12 int main(void) 13 { 14 //LED Init 15 Bsp_LED_Init(); 16 //TIM1 Init Config 1ms 17 Bsp_TIM1_Init(SystemCoreClock/100000-1,100-1); 18 //TIM3 Init Config 5ms 19 Bsp_TIM3_Init(SystemCoreClock/100000-1,500-1); 20 //TIM14 Init Config 1s 21 Bsp_TIM14_Init(SystemCoreClock/1000-1,1000-1); 22 23 while(1) 24 { 25 //1ms Flag 26 if(TIM1_1ms_Flag == 1) 27 { 28 LED1_TOGGLE(); 29 TIM1_1ms_Flag = 0; 30 } 31 //5ms Flag 32 if(TIM3_5ms_Flag == 1) 33 { 34 LED2_TOGGLE(); 35 TIM3_5ms_Flag = 0; 36 } 37 //1s Flag 38 if(TIM14_1s_Flag == 1) 39 { 40 LED3_TOGGLE(); 41 TIM14_1s_Flag = 0; 42 } 43 } 44 45 }
结束语:
关于Timx定时器的初始化配置可参考MM32F0010的库函数外设:hal_tim.c和hal_tim.h以及hal_rcc.c和hal_rcc.h的描述。