基于STM32G431嵌入式学习笔记——七、定时器定时
创始人
2024-02-26 02:02:01
0

一、题目引入

在这里插入图片描述上述为第13届蓝桥杯省赛节选内容,为了研究定时器的机理并独立书写计时函数,上述内容简化为以下要求:

①按下B4按键,LD1点亮5s后熄灭
②按下B3按键,LD2以0.1秒为间隔切换亮灭状态

二、基础知识

定时器相关知识可以参考“STM32G4系列微控制器参考手册”
在这里插入图片描述

三、CubeMX配置

关于led、key、lcd的配置不再赘述,详细环境可见前三节内容:
基于STM32G431嵌入式学习笔记——一、LED模块入门
基于STM32G431嵌入式学习笔记——二、LCD模块入门
基于STM32G431嵌入式学习笔记——三、KEY按键入门
若先前已跟随教程配置过,可在配置完毕的环境下继续沿用:
在这里插入图片描述

打开CubeMX中的时钟树
在这里插入图片描述其中右上角,是我们各个部件的时钟频率,均为80MHz
在这里插入图片描述我们做一些简单的计算:
f=80MHz=80∗106Hz表示运行1s的次数即计数量f=80MHz=80*10^6Hz表示运行1s的次数即计数量 f=80MHz=80∗106Hz表示运行1s的次数即计数量

如果像题目所说的间隔5s,则需要运行多少次呢?
5∗f=4∗108次5*f = 4*10^8次 5∗f=4∗108次
若以二进制计数,早已超过计数器的16位/32位,因此我们需要让时钟慢一点儿,计数次数少一点儿,即需要将系统时钟进行分频/降频
若f=80∗106Hzf=80*10^6Hzf=80∗106Hz,则T≈10−6sT≈10^{-6}sT≈10−6s即1μs1μs1μs
我们可以将其改变成T=10−3sT=10^{-3}sT=10−3s即1ms1ms1ms。
这里我们假设使用timer2(自己任选)
在这里插入图片描述在这里进行了第一次降频,从80∗106Hz80*10^6Hz80∗106Hz降低为80∗103Hz80*10^3Hz80∗103Hz(除以1000)
在这里插入图片描述在这里进行了第二次降频,从80∗106Hz80*10^6Hz80∗106Hz降低为1∗103Hz1*10^3Hz1∗103Hz(除以80)
即周期成功变为1ms1ms1ms,可以理解为计数器计数一次的时间为1ms1ms1ms
1s1s1s计数器计数次数为1000,0.1s0.1s0.1s计数器计数次数为100,以此类推。


定时器实现功能的本质是中断,因此我们要配置中断优先级等内容:

在这里插入图片描述配置完毕,生成代码。

四、代码书写

1.打开工程,编译。

在这里插入图片描述

2.函数书写

(1)在主函数调用函数开启定时器中断
在这里插入图片描述函数位于stm32g4xx_hal_tim.c的470行左右
在这里插入图片描述(2)全局变量配置
在这里插入图片描述(3)相关头文件是否齐全
在这里插入图片描述(4)相关功能函数
记得养成好的习惯,将函数写在主函数之下:
在这里插入图片描述

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM2)//是timer2,且过了1ms{if(led1_flag==1)//led1要用定时器了{led1_count++;}if(led2_flag==1)//led2要用定时器了{led2_count++;}}
}
void led_proc(void)//led1的控制函数
{if(led1_flag==1){Control_LED(LED1,ON);if(led1_count>=5000)//计数5000,即亮了5s{led1_flag = 0;led1_count = 0;Control_LED(LED1,OFF);}}
}
void bulingbuling(void)//led2的闪烁函数
{if(led2_flag==1){if(led2_count>=100)//0.1s{led2_count = 0;HAL_GPIO_TogglePin(GPIOC,LED2);//翻转HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);}}else{Control_LED(LED2,OFF);}
}
void key_proc(void)
{char value = Key_Scan();switch(value){case 3:led1_flag = 1;break;case 4:led2_flag = (led2_flag+1)%2;break;}
}

第一个函数名含有“Callback”,如果基础知识够扎实想必可以想到上一节我们遇到过串口中断的Callback,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序)。
位于5920行左右
在这里插入图片描述
(5)主函数补充
在这里插入图片描述
编译+下载,程序结束。

相关内容

热门资讯

百千万·山海间|五口人,50年   你知道吗?  全国每5个柚子,就有1个来自广东梅州。  梅州梅县区雁洋镇的南福村是一个种柚大村。...
转向军国旧路,必将自取灭亡丨新...   日本首相高市早苗近期在国会发表的涉台谬论,绝非简单的“口误”或“失态”,而是一场以国家前途和地区...
持续推进便民建设 各地居民生活...   央视网消息(新闻联播):各地持续推进便民服务设施建设,出台各类民生改善举措,让居民生活更温馨、更...
视频丨跨省奔赴音乐之约 演唱会...   近年来,大型演出市场呈持续上升态势,演唱会、音乐节等演出不但聚集人气带来票房收入,还带动交通、住...
祖国大家庭的温暖丨烘焙坊里爱的...   12月17日,乌鲁木齐新禾特青烘焙坊的烘焙间,水声沥沥。24岁的小赵正熟练地将使用过的工具一一清...
市场监管总局对充电宝等高风险产...   央视网消息:据市场监管总局消息,为严格落实获证生产企业质量安全主体责任,充分发挥CCC认证管理制...
中央纪委国家监委,最新通报!   中央纪委国家监委网站消息,12月22日,中央纪委国家监委公布了2025年11月全国查处违反中央八...
公司账户向法人转账的合规指南 引言在日常企业经营中,公司账户与法人个人账户之间的资金往来是常见的财务管理需求。然而,这种转账行为涉...
​期末账项调整的核心目的是什么 期末账项调整的核心目的是什么账项调整的目的在于按照应收应付标准,合理地反映相互连接的各个会计期间中应...
金融资产公允价值变动会计处理解... 导读本文深入解析以公允价值计量且变动计入其他综合收益的金融资产在处置时的会计处理,重点探讨公允价值变...