前言

利用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定时器中断显示时间相关推荐

  1. stm32定时器中断的配置步骤

    stm32定时器中断的配置步骤 1>TIM3 时钟使能 位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上): RCC_APB1PeriphClockCmd(RCC_APB1Pe ...

  2. 【CubeMX配置stm32定时器中断】

    CubeMX配置stm32定时器中断 一.使用CubeMX对STM32进行基础的配置 1.选择需要使用的定时器 选择TIM2和TIM3示例, 注意: TIM2和其它定时器选择时钟的方法不同,TIM3等 ...

  3. stm32定时器中断配置及使用

    stm32定时器中断配置及使用 定时器中断就是:可以周期性的执行某些功能,而不受main函数的影响. 我们以通用定时器time3为例说明 1.首先配置时钟源为内部时钟,分频和充装载值根据自己需要填入, ...

  4. STM32定时器中断

    目录 一.关于STM32定时器中断 1.定时器分类 2.通用定时器的功能特点 3.定时器中断的触发 4.定时时钟计算方法 二.CubeMX初始化配置 1.芯片选型(我们这里运用的STM32F103C8 ...

  5. 关于STM32空闲中断极限时间

    今天空了专门做了关于STM32空闲中断极限时间的实验,结果如下: 115200,8,N,1, 1个位理论用时:1/115200=8.68us,实测发送一帧数据的字节间延时超过大约173us时,则出现空 ...

  6. 7. STM32——定时器中断(1秒闪烁灯)

    STM32--定时器中断(1秒闪烁灯) 基本框架 1. 配置定时器时钟 在 stm32f10x_rcc.h 头文件中查找相关函数函数 2. 配置定时器结构体 在 stm32f10x_tim.h 头文件 ...

  7. stm32定时器中断_stm32F4之定时器的基本使用

    概述 上一篇说了stm32F4GPIO的使用,这篇说说定时器的使用 一. stm32F407的定时器资源介绍: ​ STM32F407有14个定时器,其中有12个16位的定时器,2个32位的定时器 这 ...

  8. stm32定时器中断类型分析

    一直在用的stm32定时器的中断都是TIM_IT_Update更新中断,也没问为什么,直到碰到有人使用TIM_IT_CC1中断,才想到这定时器的中断类型究竟有什么区别,都怪当时学习stm32的时候不够 ...

  9. STM32 定时器中断

    通用定时器工作过程: 时钟选择: 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx):使 ...

最新文章

  1. ng-model 绑定checkbox 取不到值?
  2. MxNet 模型转Tensorflow pb模型
  3. linux之用route命令看简单路由信息
  4. ubuntu下vim语法高亮问题
  5. 标签生成-基于标签的的推荐系统
  6. python读取mysql数据库_Python操作MySQL数据库9个实用实例
  7. python字典更改元素_python – 返回带有一个已更改元素的字典
  8. 剑指offer48-最长不含重复字符的子字符串(双指针经典)
  9. JAVA语言程序设计(基础篇)——第四章例题
  10. TripMode 管理 App 网络数据使用情况
  11. hdoj1159:Common Subsequence(dp基础题-最长公共子序列LCS)
  12. 视频监控安防平台-国标35114(GB35114)A级检测
  13. python scrapy 爬取steam游戏
  14. Python爬取必应图片2
  15. 牛逼!这届WWDC依旧展现了那个让你无法复制的苹果!
  16. Emacs 安装配置使用教程
  17. WCDMA通信技术-CFN SFN
  18. 注册IMDB的API KEY
  19. win10分屏设置一边竖屏_win10系统电脑屏幕竖屏改为横屏的详细办法
  20. 计算机二级c语言考点解析,2017年计算机二级C语言考点解析

热门文章

  1. 1st Javascript Editor V3 8绝对完美破解版
  2. 计算机互联网络板书,初中信息技术:计算机互联网络》教学设计
  3. 在Repeater中新闻标题后添加new和hot图标
  4. 虎符遥控器(PPT遥控翻页)
  5. 基于SpringBoot的养老院管理系统的设计与实现
  6. 今天是个好日子……吗?
  7. 物联网通信技术 第6章 电信网络
  8. DropBox免费网盘
  9. SAP Business One系统中如何创建财务报表模板
  10. java读取通达信day_Go读取通达信历史日线数据