灵动微电子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的描述。
灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置的更多相关文章
- 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据
灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据 目录: 1.MM32F0010UART简介 2.MM32F0010UART特性 3.MM32F0010使用 ...
- 灵动微电子ARM Cortex M0 MM32F0010 GPIO 的配置驱动LED灯
灵动微电子ARM Cortex M0 MM32F0010 GPIO的配置 目录: 1.前言 2.学习方法简要说明 3.要点提示 4.注意事项 5.MM32F0010系统时钟的配置 6.MM32F001 ...
- STM32——通用定时器基本定时功能
STM32——————通用定时器基本定时功能 1. ...
- 第十四章 ZYNQ TIMER定时器中断
上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 本文所使用的开发板是Miz702 PC 开发环 ...
- 第十三章 ZYNQ-MIZ701 TIMER定时器中断
上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 本文所使用的开发板是Miz701 PC 开发环 ...
- ARM Cortex M0 程序映像和启动流程
- cortex m0 lpc1114的NVIC中断如何使用
LPC1114单片机的NVIC中断函数,有开中断.关中断.设置优先级.挂起等操作函数.这些函数位于core_cm0.h文件里面.比如开中断的函数如下: /** \brief Enable Extern ...
- C#中WebService 的 Timer定时器过段时间后自动停止运行
我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.n ...
- 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)
浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...
随机推荐
- 面试题:让你捉摸不透的 Go reslice
面试题: package main func a() []int { a1 := []int{3} a2 := a1[1:] return a2 } func main() { a() } 看到这个题 ...
- Mybatis3源码笔记(二)SqlSession
1. 核心层次 2. SqlSession 先从顶层的SqlSession接口开始说起.SqlSession是MyBatis提供的面向用户的API,表示和数据库的会话对象,用于完成对数据库的一系列CR ...
- C++ sort()函数使用简介
Sort函数简介 sort()函数是C++的一个排序函数,可以对传入参数给定的区间的所有元素进行排序,默认是升序,也可以是降序,如果需要其他排序规则需要自行编写compare()函数作为参数. ...
- Day12_59_Java多线程
多线程 1. 什么是进程? * 每个进程是一个应用程序,都有独立的内存空间,一个进程对应一个应用程序. * 例如:在windows操作系统中启动了word就是启动了一个进程,一边听音乐,一边打游戏就是 ...
- json 标准库
1. 序列化的简单概念 2. json 标准库 2.1 json.dumps() 2.2 json.loads() 2.3 json.dump() 2.4 json.load() 1. 序列化的简单概 ...
- 10.for循环
for循环 语法: for(初始化; 布尔表达式; 更新) { //代码语句 } 初始化最先执行,可以声明一种类型,可初始化一个或多个循环控制变量,也可以是一个空语句. 布尔值判断,为 true 执行 ...
- 40 图 |我用 Mac M1 玩转 Spring Cloud
我的开源 Spring Cloud 项目 PassJava 一直可以在 Windows 上正常运行,最近不是换 Mac M1 了么,想把这个项目在 M1 上跑起来,毕竟我的那台 Windows 用起来 ...
- Python数模笔记-Sklearn(1) 介绍
1.SKlearn 是什么 Sklearn(全称 SciKit-Learn),是基于 Python 语言的机器学习工具包. Sklearn 主要用Python编写,建立在 Numpy.Scipy.Pa ...
- 解决GET http://localhost:8080/js/layui/layui.js net::ERR_ABORTED 404
用ssm+layui在写页面的时候,发现无法找到资源路径 <script src="js/layui/layui.js" charset="utf-8"& ...
- Asp.NetCore Web开发之初始文件解析
在写代码之前,有必要了解一下.net帮我们生成的文件都是干什么用的,在开发过程中他们都负责那些地方(下面以MVC模板举例). 先简单介绍一下什么是MVC,MVC(model-view-controll ...