用定时器Timer方式实现LED周期性闪烁
文章目录
- 一、环境配置
- 二、定时器简介
- 三、用STM32CubeMX配置工程
- 四、用Keil配置代码
- 五、运行效果
- 六、总结
- 七,参考资料
一、环境配置
软件:STM32CubeMX:6.6.1
Keil 5.31
mcuisp
硬件:STM32F103C8T6
二、定时器简介
STM32F4 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2TIME5,TIM9TIM14 等通用定时器,还有 TIME6 和 TIME7 等基本定时器,总共达 14 个定时器之多。
定时器分类
定时器功能介绍
STM3 的通用 TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:
1.16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下自动装载计数器(TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式。
2.16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~ 65535 之间的任意数值。
3.4 个独立通道(TIMx_CH14,TIM9TIM14 最多 2 个通道),这些通道可以用来作为:
A.输入捕获
B.输出比较
C.PWM 生成(边缘或中间对齐模式) ,注意:TIM9~TIM14 不支持中间对齐模式
D.单脉冲模式输出
4.可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
5.如下事件发生时产生中断/DMA(TIM9~TIM14 不支持 DMA):
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不支持)
F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM14 不支持)
计时器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
1.向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
2.向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
3.中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
三、用STM32CubeMX配置工程
1.点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:
2.搜索型号,选择合适的型号进行工程建立
3.打开外部时钟,点击“System Core” ,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”
4.选择调试接口,点击“System Core”,选择SYS。,在右侧弹出的菜单栏中选择“Serial Wire”。
5.点击GPIO,配置管脚,将PC15设置为GPIO-OUT,并设置User Label为D1
6.配置定时器2。这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。
分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。
7.配置中断。如下图所示,开启定时器2的中断。
如下图所示,生成定时器2中断优先级配置代码。
8.配置时钟。
9.点击“Project Manager” ,再点击“Code Generator” ,进行配置
再点击“Project ”,进行配置后,点击“GENERATE CODE”,生成项目
四、用Keil配置代码
1.打开生成的工程,找到mian.c,将如下代码添加到如下图位置:
HAL_TIM_Base_Start_IT(&htim2);
该函数表示启动相应的定时器, “h”表示HAL库, “tim2”表示定时器2。所以这行代码的意思就是启动定时器2。
同样在main.c中找到如下位置写入代码:
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(D1_GPIO_Port,D1_Pin);}}
}
该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了一个静态变量:time_cnt。当它大于等于400的时候,才会执行if里面的代码。也就是说需要发生400次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以400次中断的时间是0.005*400=2秒。也就是说每隔2秒,LED的状态翻转一次。
五、运行效果
TIMER_LED
六、总结
本次实验完成了用定时器Timer方式实现LED周期性闪烁,了解了定时器的相关知识,又多积累了一点知识。
七,参考资料
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/
https://blog.csdn.net/weixin_66578482/article/details/126322102?ops_request_misc=&request_id=&biz_id=102&utm_term=STM32%E7%AC%94%E8%AE%B0%E4%B9%8B%20Timer&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-126322102.142v59pc_rank_34_1,201v3add_ask&spm=1018.2226.3001.4187
用定时器Timer方式实现LED周期性闪烁相关推荐
- 【嵌入式系统开发15】STM32F103C8T6下通过定时器Timer方式实现时间的精准控制,实现串口通信并让LED等周期性地闪烁
本文目的是主要介绍通过STM32F103C8T6采用定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务.请设置一个5秒的 ...
- CC2530————通过定时器T1查询方式控制LED1周期性闪烁(模模式)
CC2530----通过定时器T1查询方式控制LED1周期性闪烁(模模式) 宏定义与函数声明 初始化 主函数 宏定义与函数声明 /*********************************** ...
- 三档按键定时器c语言程序,单片机C语言程序设计:定时器控制4个LED滚动闪烁
/* 名称:定时器控制 4 个 LED 滚动闪烁 说明:4 只 LED 在定时器控制下滚动闪烁. */ #include #define uchar unsigned char #define ui ...
- c语言控制led闪烁次数,单片机C语言程序设计之定时器控制4个LED滚动闪烁
描述 通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力.通过定时器控制4只LED滚动闪烁系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高 ...
- 通过定时器Timer方式实现时间的精准控制
目录 一.定时器的介绍 1.定时器概念及作用 2.定时器的分类 (1)硬件定时器 (2)软件定时器 (3)系统滴答定时器(SysTick) (4)实时时钟(RTC) 二.新建cubemx项目 1.选择 ...
- 用定时器Timer方式实现时间的精准控制
目录 一.定时器简介 1.STM32定时器的定义 2.STM32定时器的分类 二.创建工程项目 三.编写代码 1.在main.c写入以下函数 2.编译运行 四.烧录 1.电路连接 2.效果 五.总结 ...
- 定时器Timer方式实现时间的精准控制
什么是定时器 就是用来定时的机器,是存在于STM32单片机中的一个外设.STM32总共有8个定时器,分别是2个高级定时器(TIM1.TIM8),4个通用定时器(TIM2.TIM3.TIM4.TIM5) ...
- STM32定时器实现5秒周期串口通信,2秒LED灯闪烁
文章目录 前言 一.定时器Timer 1.定时器定义 2.定时器分类 3.计数器模式 4.时钟产生器和时基单元 5.工作原理 二.实验步骤 1.用STM32CubeMx创建项目 1.1 创建项目 1. ...
- STC8H8K64U——定时器T0(LED灯闪烁)
LED灯闪烁 使用定时器实现延时实现LED灯闪烁,定时 5ms,count 计数50定时 250ms #include <STC8H.H>sbit LED = P2^0; unsigned ...
最新文章
- Cerebras发布全球首个人类大脑规模的AI解决方案
- 【深度学习】深入浅出数字图像处理基础(模型训练的先修课)
- DELPHI listbox去除重复项
- Python 技术篇 - 通过paramiko库判断连接linux服务器的账号密码是否正确方法演示
- Python面向对象中super用法与MRO机制
- struts2 表单回填与action里的属性
- ZOJ4024 Peak
- C#中IEnumerable.OfType()方法的简单使用
- 算法高级(30)-外卖凑单算法-为什么每次点外卖你怎么都凑不够那碗卤肉饭呢?
- HTML/CSS开发规范指南
- 利用python语言实现分类算法_使用python实现kNN分类算法
- Hibernate(十二):HQL查询(一)
- sensor_msgs::PointCloud2转换pcl::PCLPointCloud2 pcl::PointXYZ
- php 银行支付通道_基于PHP框架的聚合四方支付系统
- PLSQL 14.0.6 安装使用教程
- 华为手机刷机后显示无服务器,华为手机刷机后,无法开机怎么办?
- 华为android9升级包,华为Mate9官方固件ROM刷机包
- Python求二次方程根
- 云原生这么火,你再不了解就out了
- 使用jQuery实现轮播图
热门文章
- 排序算法,最全的10大排序算法详解(Sort Algorithm)
- 网络安全突发事件应急处置工作预案
- PGM:有向图模型:贝叶斯网络
- 上门预约程序公众号模块 完美版
- FXmarket 集团 9月24日财经早餐:美元小幅上扬,黄金创二周新高,期银飙升5%
- 大学生游戏静态HTML网页设计 (HTML+CSS+JS仿英雄联盟网站15页)
- matlab深度遍历算法,数据结构算法之动态规划(深度优先遍历)
- 掌握typora使用方法
- 手机能运行linux系统吗,老外继续折腾iPhone 7,成功运行Linux
- 计算机硬件知识题,计算机硬件知识题库