STM32定时器中断显示时间
前言
利用STM32的定时器中断,实现时间的显示。我们知道利用定时器中断只能进行tick的计算,然而用来显示时间我们应该怎么办呢?经过项目的实际运用,我发现利用定时器中断配合串口通讯也能实现时间显示。
这种方法应用的前提是,我们的板件不能装电池无法保存时钟,我们的板件会与其他可以保存时钟的板件通讯。
原理介绍
(1)硬件资源:有通讯功能的STM32板件、可以保存时钟且能通讯的其他任意板件
(2)软件设计:定时器中断、通讯接收(串口接收)
(3)设计思路:利用定时器中断获得稳定的tick(假设tick为1ms,那么我们就1ms进入定时器中断计数一次),编写时钟进位函数,通过通讯获得当前时间。
功能实现
定时器中断实现
我们选用STM32的基本定时器,具体操作看代码。
#include "stm32f10x.h"
#define BASIC_TIM TIM6
#define BASIC_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define BASIC_TIM_CLK RCC_APB1Periph_TIM6
#define BASIC_TIM_IRQ TIM6_IRQn
#define BASIC_TIM_IRQHandler TIM6_IRQHandler
void BASIC_TIM_Config(void);
void BASIC_TIM_NVIC_Config(void) ;
void system_time_increase(void);
void BASIC_TIM_Config(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //使能定时器时钟,内部时钟48MBASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE); //自动重装载寄存器的值TIM_TimeBaseStructure.TIM_Period=1000;//时钟预分频数为47,则定时器时钟(47+1)/48=1M,每1ms进入中断一次TIM_TimeBaseStructure.TIM_Prescaler= 47; //初始化定时器TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure); //清除计数器中断标志位TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);//使能计数器1中断TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);//定时器使能TIM_Cmd(BASIC_TIM, ENABLE);BASIC_TIM_NVIC_Config();
}
void BASIC_TIM_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure; //配置中断向量组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//配置中断源NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ; //配置中断优先级NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置中断子优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //中断使能NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}
以上为STM32定时器中断的配置部分代码,要想实现计数我们还要编写中断服务函数,代码如下:
void BASIC_TIM_IRQHandler(void)
{if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET ){system_time_increase();//时钟进位函数 IM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);}
}
时钟进位函数
我们中断服务函数的关键就是时钟进位,这个函数的具体代码如下:
void system_time_increase(void)
{uint8_t month_day_tab[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; //每月的天数TIME.msec++;if(TIME.msec >= 1000) //1ms进入中断一次,1000次就是1ms{TIME.msec = 0L;TIME.second++;//秒进位if(TIME.second >= 60){TIME.second = 0;TIME.minute++;//分钟进位if(TIME.minute >= 60){TIME.minute = 0;TIME.hour++;//小时进位if(TIME.hour >= 24){TIME.hour = 0;TIME.day++;//天进位if(TIME.day > (((TIME.year%4 == 0) && (TIME.month == 2))?month_day_tab[TIME.month]+1:month_day_tab[TIME.month]) ){TIME.day = 1;TIME.month++;//月进位if(TIME.month > 12){TIME.month = 1;TIME.year++;//年进位if(TIME.year > 99){TIME.year = 0;}}}}}}}
}
这里说明一下,我们做了一个TIME的结构体,我们可以通过访问操作这个结构体实现通讯,实现时间显示等后续功能。结构体如下:
typedef struct _TDateTime
{uint8 year;uint8 month;uint8 day;uint8 hour;uint8 minute;uint8 second;uint16 msec;
}TDateTime;
我们在定时器中断服务函数中实现时间进位功能,到这一步我们就能实现正确的计时了。但是我们每次开启的时候时间都会是00年00月00日00:00:00。我们要想实现实时显示时间还需要最后一步:通讯。
通讯获取当前时间
在这里我们利用串口通讯的方式获取其他板件的当前时间。我们使用私有协议报文的方式获得当前时间报文,当然也有其他的方式。大致的原理就是,时间板件把时间信息封装成一串十六进制报文,我们的程序进行解析获取当前时间,然后在进行进位。具体的代码量比较大,这里就不贴出来了。我们还可以把时间通过液晶屏显示出来,关于液晶屏的操作可以借鉴这篇博客STM32F103成功点亮12864点阵液晶屏。
效果展示
最后给大家展示一下效果
STM32定时器中断显示时间相关推荐
- stm32定时器中断的配置步骤
stm32定时器中断的配置步骤 1>TIM3 时钟使能 位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上): RCC_APB1PeriphClockCmd(RCC_APB1Pe ...
- 【CubeMX配置stm32定时器中断】
CubeMX配置stm32定时器中断 一.使用CubeMX对STM32进行基础的配置 1.选择需要使用的定时器 选择TIM2和TIM3示例, 注意: TIM2和其它定时器选择时钟的方法不同,TIM3等 ...
- stm32定时器中断配置及使用
stm32定时器中断配置及使用 定时器中断就是:可以周期性的执行某些功能,而不受main函数的影响. 我们以通用定时器time3为例说明 1.首先配置时钟源为内部时钟,分频和充装载值根据自己需要填入, ...
- STM32定时器中断
目录 一.关于STM32定时器中断 1.定时器分类 2.通用定时器的功能特点 3.定时器中断的触发 4.定时时钟计算方法 二.CubeMX初始化配置 1.芯片选型(我们这里运用的STM32F103C8 ...
- 关于STM32空闲中断极限时间
今天空了专门做了关于STM32空闲中断极限时间的实验,结果如下: 115200,8,N,1, 1个位理论用时:1/115200=8.68us,实测发送一帧数据的字节间延时超过大约173us时,则出现空 ...
- 7. STM32——定时器中断(1秒闪烁灯)
STM32--定时器中断(1秒闪烁灯) 基本框架 1. 配置定时器时钟 在 stm32f10x_rcc.h 头文件中查找相关函数函数 2. 配置定时器结构体 在 stm32f10x_tim.h 头文件 ...
- stm32定时器中断_stm32F4之定时器的基本使用
概述 上一篇说了stm32F4GPIO的使用,这篇说说定时器的使用 一. stm32F407的定时器资源介绍: STM32F407有14个定时器,其中有12个16位的定时器,2个32位的定时器 这 ...
- stm32定时器中断类型分析
一直在用的stm32定时器的中断都是TIM_IT_Update更新中断,也没问为什么,直到碰到有人使用TIM_IT_CC1中断,才想到这定时器的中断类型究竟有什么区别,都怪当时学习stm32的时候不够 ...
- STM32 定时器中断
通用定时器工作过程: 时钟选择: 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx):使 ...
最新文章
- ng-model 绑定checkbox 取不到值?
- MxNet 模型转Tensorflow pb模型
- linux之用route命令看简单路由信息
- ubuntu下vim语法高亮问题
- 标签生成-基于标签的的推荐系统
- python读取mysql数据库_Python操作MySQL数据库9个实用实例
- python字典更改元素_python – 返回带有一个已更改元素的字典
- 剑指offer48-最长不含重复字符的子字符串(双指针经典)
- JAVA语言程序设计(基础篇)——第四章例题
- TripMode 管理 App 网络数据使用情况
- hdoj1159:Common Subsequence(dp基础题-最长公共子序列LCS)
- 视频监控安防平台-国标35114(GB35114)A级检测
- python scrapy 爬取steam游戏
- Python爬取必应图片2
- 牛逼!这届WWDC依旧展现了那个让你无法复制的苹果!
- Emacs 安装配置使用教程
- WCDMA通信技术-CFN SFN
- 注册IMDB的API KEY
- win10分屏设置一边竖屏_win10系统电脑屏幕竖屏改为横屏的详细办法
- 计算机二级c语言考点解析,2017年计算机二级C语言考点解析