灵动微电子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. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  2. JAVAEE_Servlet_19_重定向可以解决页面刷新问题(sendRedirect)

    重定向可以解决页面刷新问题(sendRedirect) 在向数据库中添加数据的时候,如果使用转发(getRequestDispatcher),数据插入成功后,转发到提示插入成功页面,在数据插入成功页面 ...

  3. Python基础语法和数据类型最全总结

    摘要:总结了Python最全基础语法和数据类型总结,一文带你学会Python. 本文分享自华为云社区<Python最全基础语法和数据类型总结>,原文作者:北山啦 . 人生苦短,我用Pyth ...

  4. EasyCode Entity 实体类模板 IDEA

    自己修改了一份EasyCode的实体类模板,防止日后找不到在这里存一下 修改了如下内容: 取消生成GetSet方法,改用Lombok 修改默认命名规则,改为[表名Entity.java] 取消了实现序 ...

  5. PDF转HTML工具——用springboot包装pdf2htmlEX命令行工具

    Convert PDF to HTML without losing text or format. 用springboot把pdf2htmlEX命令行工具包装为web服务, 使得PDF转HTML更方 ...

  6. 听说你买的基金又“绿了”,手把手教你用 Python选出好基金

    打工人打工魂打工都是人上人,红基金绿基金绿了又绿你基金.今天教大家一招不再被(基金)绿. 01 开发环境 Windows10 Python3 Pycharm 一些必要的库 02 步骤 1. 获取基金排 ...

  7. 路由协议之OSPF

    目录 OSPF协议 OSPF的七种状态 OSPF的11种LSA Stub和Nssa OSPF中的防环机制 OSPF中的路由汇总和路由过滤 OSPF中的虚拟链路 虚拟链路有两种存在的意义 OSPF中的认 ...

  8. UVA10780幂和阶乘

    题意:       输入两个整数n,m(1<m<5000,0<n<10000)求最小的k使得m^k是n!的因子. 思路:      比较容易想,一开始手残wa了好几次,我们直接 ...

  9. Python爬虫之requests库的使用

    requests库 虽然Python的标准库中 urllib模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests宣传是 "HTTP for ...

  10. 基于蒙特卡洛树搜索(MCTS)的多维可加性指标的异常根因定位

    摘要:本文是我在从事AIOps研发工作中做的基于MCTS的多维可加性指标的异常根因定位方案,方案基于清华大学AIOPs实验室提出的Hotspot算法,在此基础上做了适当的修改. 1        概述 ...