通过定时器的Timer方式替代delay/Hal_delay函数进行定时
文章目录
- 前言
- 一、设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”
- 1、创建工程项目
- 2、项目配置
- 3、代码编写
- 1、重定向printf函数
- 2、定时器代码
- 4、效果
- 二、设置一个2秒的定时器,让LED等周期性地闪烁
- 1.项目配置
- 2、代码编写
- 3、效果
- 三、总结
- 四、参考资料
前言
- 硬件:stm32f103c8t6 核心板
- 软件:STM32CubeMX 6.4.0
- 软件:keil5 mdk
- 软件:野火串口调试助手
一、设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”
之前一般使用delay函数实现延时,这让CPU停下来等待时间,这样极大的浪费了资源。我们可以设置定时器,解放COU,让它去忙别的事,到时间再回来处理这边的时间,资源的利用率更大。
1、创建工程项目
- 选择STM32C8T6型号。
2、项目配置
SYS设置,选择Serial Wire模式。
时钟RCC配置,将HSE选为外部晶振模式
- 设置USART
- 时钟树设置
- 定时器设置
分频系数由于系统处理的时候会自动加上1,于是我们填71。由于时钟树我们上面配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。
开启定时器的中断
设置优先级
设置工程路径、工程名,最后导出文件。
可参考:https://blog.csdn.net/qq_52215423/article/details/127516169?spm=1001.2014.3001.5501
3、代码编写
1、重定向printf函数
分别在main.c和usart.c文件添加头文件
#include "stdio.h"
keil配置允许重定向
在main.c文件中重写printf函数:
int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;}
2、定时器代码
在main函数里添加下面这句语句用于开启定时器
HAL_TIM_Base_Start_IT(&htim2);
定义一个全局变量
unsigned int flag = 1;
在while里添加输出语句
if(flag == 1){ printf("Hello windows! \r\n");flag=0;}
重写定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。因为上面我们设置了一次中断的时间为0.005秒,所以我们需要1000次中断才满足5秒。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint32_t time_cnt =0;if(htim->Instance == TIM2){if(++time_cnt >= 1000){time_cnt =0;if(flag==0)flag=1;elseflag=0;}}
}
4、效果
编译烧录成功后的效果如下:
20221102_213840
二、设置一个2秒的定时器,让LED等周期性地闪烁
上面已经写了创建项目流程,就不再赘述,直接进行项目配置。
1.项目配置
SYS设置,选择Serial Wire模式。
时钟RCC配置,将HSE选为外部晶振模式
时钟树设置
配置IO管脚,用于输出LED电平,这里选择PC14.
定时器设置
开启定时器的中断
设置优先级
设置工程路径、工程名,最后导出文件。
2、代码编写
- 在main函数里添加启动定时器2的语句:
HAL_TIM_Base_Start_IT(&htim2);
- 重写定时器的中断回调函数
由于前面的时钟树的设置可知,每次的中断时间为0.005秒,于是400次的中断等于2s,符合我们的要求
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint32_t time_cnt =0;if(htim->Instance == TIM2){if(++time_cnt >= 400){time_cnt =0;HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_14);}}
}
- 编译烧录均无问题。
3、效果
VID_20221102_200720
三、总结
通过定时器的TImer方式极大的利用了CPU资源,并且STMCube也构建好了许多库,可以直接对定时器进行操作,方便了许多。
四、参考资料
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/
通过定时器的Timer方式替代delay/Hal_delay函数进行定时相关推荐
- 【嵌入式系统开发15】STM32F103C8T6下通过定时器Timer方式实现时间的精准控制,实现串口通信并让LED等周期性地闪烁
本文目的是主要介绍通过STM32F103C8T6采用定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务.请设置一个5秒的 ...
- 用定时器Timer方式实现LED周期性闪烁
文章目录 一.环境配置 二.定时器简介 三.用STM32CubeMX配置工程 四.用Keil配置代码 五.运行效果 六.总结 七,参考资料 一.环境配置 软件:STM32CubeMX:6.6.1 Ke ...
- 定时器new Timer().schedule()的使用
文章目录 一.基础知识 1. 简介 2. 常用API 二.需求案例 2.1. 案例1 2.2. 案例2 2.3. 案例3 三.场景案例 3.1. 在特定时间执行任务,只执行一次 3.2. 指定第一次执 ...
- Arduino ESP32 通过定时器(Timer)功能唤醒深度睡眠
Arduino ESP32 通过定时器(Timer)功能唤醒深度睡眠 通过定时器功能,设置5秒,时间到就唤醒深度睡眠 实例代码 /*通过定时器功能唤醒深度睡眠(设置为5秒) */#define uS_ ...
- 定时器(Timer)
1.时钟 时钟就是一个可以产生周期性信号的设备. 时钟信号就是周期性变化的信号. T:时钟周期 最小重复的信号单元的时间长度,基本单元为s(秒) F:时钟频率 1s内有多少个重复的信号单元,单位为Hz ...
- Android中定时器实现的方式对比
在android中经常需要定时循环执行某一段代码,大家首先想到的是Timer,在一般的场合下,Timer和TimerTask可以完全胜任,但是在有些情况下,Timer就不能很好的完成定时循环任务,如与 ...
- 利用定时器0工作方式1——独立按键控制流水灯模式
目录 1.前言 1.1 项目资源 1.2 实验现象 2.定时器/计数器 2.1定时器/计数器0&1的相关寄存器 2.2定时器的工作方式(总结) 3.中断系统 3.1中断概念 3.2中断流程: ...
- Java定时器(Timer)
1.介绍 Timer和TimerTask是用于在后台线程中调度任务的java util类.简单地说,TimerTask是要执行的任务,Timer是调度器. 2.调度一次性任务 2.1 指定延迟后执行 ...
- 定时器0工作方式2,定时1s
定时器0工作方式2,定时1s
最新文章
- softmax layer 简单理解以及实际例子【有白话讲解】
- android 课程——样式
- 化浆池是什么东西_头次见聪明人在阳台上砌洗衣池,开始被人笑话,装完都跟着学...
- Redis Lua脚本中学教程(下)
- mysql 连接超时 wait_timeout interactive_timeout 简介
- ubuntu pdf转jpg或txt
- 6升小米6——算法解题
- 2022年企业微信生态研究报告
- Node.js 的Web 服务器--Fenix
- WMS软件国内主要供应商分析
- python 中文字符串 编码转换_Python合集之Python字符串编码转换
- python气象卫星云图解析_零基础python效率提升资源汇总
- 广东诚美计算机专修学院面试,三下乡|一轮面试,与你不期而遇
- 大三如何找暑期技术实习?技术实习找大公司还是小公司?
- 资源吧网站模板下载织梦cms精仿资源吧网站模板
- 装出一个好的WIN2000最经典的步骤
- java txt文件追加_java如何追加写入txt文件
- C++的学习之路---12
- ABeam中国2022社招 | ABeam旗下艾宾信息技术开发(大连) 最新招聘信息
- PHP商城 商品模块 数据库 表设计