灵动微电子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的描述。

灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置的更多相关文章

  1. 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据

    灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据 目录: 1.MM32F0010UART简介 2.MM32F0010UART特性 3.MM32F0010使用 ...

  2. 灵动微电子ARM Cortex M0 MM32F0010 GPIO 的配置驱动LED灯

    灵动微电子ARM Cortex M0 MM32F0010 GPIO的配置 目录: 1.前言 2.学习方法简要说明 3.要点提示 4.注意事项 5.MM32F0010系统时钟的配置 6.MM32F001 ...

  3. STM32——通用定时器基本定时功能

    STM32——————通用定时器基本定时功能                                                                           1.  ...

  4. 第十四章 ZYNQ TIMER定时器中断

      上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 本文所使用的开发板是Miz702 PC 开发环 ...

  5. 第十三章 ZYNQ-MIZ701 TIMER定时器中断

      上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 本文所使用的开发板是Miz701 PC 开发环 ...

  6. ARM Cortex M0 程序映像和启动流程

  7. cortex m0 lpc1114的NVIC中断如何使用

    LPC1114单片机的NVIC中断函数,有开中断.关中断.设置优先级.挂起等操作函数.这些函数位于core_cm0.h文件里面.比如开中断的函数如下: /** \brief Enable Extern ...

  8. C#中WebService 的 Timer定时器过段时间后自动停止运行

    我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.n ...

  9. 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)

    浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...

随机推荐

  1. 3、带你一步一步学习ASP.NET Core中的配置之Configuration

    如果你是刚接触ASP.NET Core的学习的话,你会注意到:在ASP.NET Core项目中,看不到.NET Fraemwork时代中的web.config文件和app.config文件了.那么你肯 ...

  2. Python 并行计算那点事 -- 译文 [原创]

    Python 并行计算的那点事1(The Python Concurrency Story) 英文原文:https://powerfulpython.com/blog/python-concurren ...

  3. SSDT表的遍历

    //VS2005创建的工程,系统xp sp2 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  4. POJ 1386 欧拉路的判定

    题意:       给你n个单词,问你有没有一种排列方式可以所有单词的首部是相邻单词的尾部. 思路:       这个题目还挺基础的,就是个欧拉的判定,首先对于每一个单词,我们把他抽象成边,每个单词两 ...

  5. 360加固保so动态脱壳

    环境及工具 手机    : 中兴 U887 系统版本:   Android 2.3.5 工具    :   IDA pro 6.6 .0101Editor 目前so加壳有很多家,我己知的有 爱加密,梆 ...

  6. UVA10294项链和手镯(等价类计数问题)

    题意:       给你一串珠子(连接成了一个环),共有n个珠子组成,你有t种颜色,现在你来给这个珠子染色,问染成项链有多少种方法?染成手镯有多少种方法?在项链里,经过顺时针旋转后相同的算一个,在手镯 ...

  7. CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)

    0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...

  8. Windows核心编程笔记之错误处理

    0x01 GetLastError() 函数用于获取上一个操作的错误代码 #include <Windows.h> #include <iostream> using name ...

  9. 【python】Leetcode每日一题-反转链表 II

    [python]Leetcode每日一题-反转链表 II [题目描述] 给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 ...

  10. 密码学系列之:NIST和SHA算法

    目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...