灵动微电子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. 数据结构之LinkedList | 让我们一块来学习数据结构

    highlight: monokai theme: vue-pro 上一篇文章中使用列表(List)对数据排序,当时底层储存数据的数据结构是数组.本文将讨论另外一种列表:链表.我们会解释为什么有时链表 ...

  2. 034- do_while语句

    语法 初始化语句; do { 循环体语句; 控制条件语句; }while(boolean表达式); 执行过程: 首先会执行do循环体中的语句,然后运算while中的boolean表达式,如果是true ...

  3. 洛谷P1085 不高兴的津津

    题目描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会不高兴,而 ...

  4. hdu5025 状态压缩广搜

    题意:       悟空要救唐僧,中途有最多就把钥匙,和最多五条蛇,要求就得唐僧并且拿到所有种类的钥匙(两个1只拿一个就行),拿钥匙i之前必须拿到钥匙i-1,打蛇多花费一秒,问救出唐僧并且拿到所有种类 ...

  5. 模板templates的使用

    目录 模板及其渲染 模板查找路径 DTL模板语法 常用的模板标签 DTL常用过滤器 模块结构优化 加载静态文件 模板及其渲染 视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面 ...

  6. 一文详解MySQL如何同时自增自减多个字段

    本文将带大家聊一下如何同时自增自减多个字段 开始之前,先分享一套MySQL教程,小白入门或者学习巩固都可以看 MySQL基础入门-mysql教程-数据库实战(MySQL基础+MySQL高级+MySQL ...

  7. 『政善治』Postman工具 — 7、Postman中保存请求(Collections集合)

    目录 1.创建Collection 2.保存Request请求 3.查看保存的请求 4.Collection下还可以创建文件夹 5.补充:Postman中的变量 6.总结 1.创建Collection ...

  8. C++ primer plus读书笔记——第12章 类和动态内存分配

    第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化 ...

  9. Spark大数据处理框架入门(单机版)

    导读 引言 环境准备 安装步骤 1.下载地址 2.开始下载 3.解压spark 4.配置环境变量 5.配置 spark-env.sh 6.启动spark服务 7.测试spark stay hungry ...

  10. Dart 2.13 版现已发布

    作者 / Kevin Moore & Michael Thomsen Dart 2.13 版现已发布,其中新增了类型别名功能,这是目前用户呼声第二高的语言功能.Dart 2.13 还改进了 D ...