文章目录

  • 前言
  • 一、定时器Timer
    • 1.定时器定义
    • 2.定时器分类
    • 3.计数器模式
    • 4.时钟产生器和时基单元
    • 5.工作原理
  • 二、实验步骤
    • 1.用STM32CubeMx创建项目
      • 1.1 创建项目
      • 1.2 配置RCC和SYS
      • 1.3 配置IO输出口
      • 1.4 配置定时器
      • 1.5 配置NVIC和USART1
      • 1.6 配置时钟
      • 1.7 项目配置
    • 2.用keil编写代码
      • 2.1 定时器启动代码
      • 2.2 串口通信
      • 2.3 定时器中断回调函数
  • 三、实验结果
    • 1.硬件连接
    • 2.烧录实现
  • 总结

前言

之前博客中的延时功能都是通过循环、delay/Hal_delay函数等实现,本次博客通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。请设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁。


一、定时器Timer

要实现定时或者延时功能,一般有三种方法:软件定时,不可编程硬件定时,可编程硬件定时。

软件定时——让软件循环执行一段程序,程序本身并无执行目的,而是通过执行程序延时固定的时间,也就是以前的程序中经常使用的延时程序。这种方法降低了cpu的利用率。

不可编程硬件定时——如外部芯片555 时基电路,通过外部阻容,达到一定的延时功能,改变阻容大小可以改变延时长度。这种定时器取决于硬件,设定好以后不能通过软件更改。

可编程定时器——这种定时器的定时值可以通过软件确定和修改,使用灵活便捷。

1.定时器定义

Timer 是一种定时器工具,用来在一个后台线程计划执行指定任务。 它可以安排任务“执行一次”或者定期“执行多次”。 然而在实际的开发过程当中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。定时器是单片机内部的特殊功能模块。在控制系统中,常常要求有一些实时时钟以实现定时或者延时控制,如定时中断、定时检测、定时扫描等等,也往往要求有计数器,对外部事件进行计数。

  • 能够对内部时钟信号或外部输入信号进行计数,数值达到设定要求时,向CPU发起中断请求,完成外部程序的运行。
  • 本质就是进行计数,选择内部时钟脉冲,作为计数器时,技术信号的来源选择非周期脉冲信号。

2.定时器分类

STM32中定时器可分为高级定时器、通用定时器、基本定时器三类,他们都是由一个可编程的16位预分频器(TIMX_PSC)驱动的16位。

  • 1、基本定时器:功能最少,只能充当基本的时基,甚至都没有外部引脚
  • 2、通用定时器:拥有基本定时器的全部功能,同时有输入捕获模式,用以接收外部的PWM,脉冲之类的信息
  • 3、高级定时器:又有通用定时器的全部功能,又有互补输出模式,功能最为强大

3.计数器模式

  1. 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
  2. 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
  3. 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

4.时钟产生器和时基单元

内部时钟(CK_INT)
外部时钟模式 1:外部输入脚(TIx)
外部时钟模式 2:外部触发输入(ETR)
内部触发输入(ITRx):使用A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。 这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。

时基单元就是定时器框图的第二部分,它包括三个寄存器,分别是:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)和自动装载寄存器(TIMx_ARR)。对这三个寄存器的介绍如下:

计数器寄存器(TIMx_CNT):向上计数、向下计数或者中心对齐计数;
计数器寄存器(TIMx_CNT):可将时钟频率按1到65535之间的任意值进行分频,可在运行时改变其设置值;
自动装载寄存器(TIMx_ARR):如果TIMx_CR1寄存器中的ARPE位为0,ARR寄存器的内容将直接写入影子寄存器;如果ARPE为1,ARR寄存器的那日同将在每次的更新时间UEV发生时,传送到影子寄存器;如果TIM1_CR1中的UDIS位为0,当计数器产生溢出条件时,产生更新事件。

5.工作原理

在选定的时钟源(可以是内部的也可以是外部的)和预分频器TIMX_PSC的驱动下,根据设置的计数模式(向上、向下、中央对齐)自动。

装载计数器TIMX_CNT开始计数;如果使能了相应的事件(更新事件、触发事件、输入捕获、输出比较)则会产生相应的中断。

  1. 如果没有开启输入和输出,只使能了计数器计数溢出后自动装载,可以做为一个简单定时器使用,计数器自己开始周期计数
  2. 如果开启了通道输入捕获,当检测到ICx信号上相应的边沿后,计数器(CNT)的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中,通过中断的方式可以读取出来假设为n1,然后更改输入捕获的信号级性(上升沿或下降沿),当再次检测到ICx信号上相应的边沿后,计数器(CNT)的当前值再次被锁存到捕获/比较寄存器(TIMx_CCRx)中假设为n2;n2 -n1节可算出电平的持续时间
  3. 如果开启了输出控制,可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的PWM信号。
  4. 如果选择外部的同步时钟信号(TI1F_ED、TI1FP1、TI2FP2)作为计数器的时钟源,可以用来统计脉冲,实现脉冲频率采集功能

二、实验步骤

1.用STM32CubeMx创建项目

1.1 创建项目

点击ACCESS TO MCU SELECTOR,进入下列界面,在Part Number选择好芯片点击,然后点击Start Project

1.2 配置RCC和SYS

在System Core下选择RCC,将HSE改成Crystal/Ceramic Resonator

点击SYS,将Debug改成Serial Wire

1.3 配置IO输出口

点击PA2,选择GPIO_Output

1.4 配置定时器

这里笔者选择定时器2和定时器3
在目录Timers下点击TIM2,将Clock Source时钟源选择为Internal Clock内部时钟,设置分频系数为71,向上计数模式,计数周期为5000。

TIM3同上设置

  • 注意:分频系数虽然是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟一般会配置为72MHZ,所以72分频后得到1MHZ的时钟;1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒;也就是每隔0.005秒定时器2会产生一次定时中断

1.5 配置NVIC和USART1

点击NVIC,勾选TIM2和TIM3的中断

然后点击Code generation,勾选TIM2的中断优先级

在目录Connectivity下点击USART1,将Mode改为异步通信Asynchronous

1.6 配置时钟

点击Clock,将HCLK改为72,点击回车

1.7 项目配置

点击Project Manager,填入项目名称,将IDE改为MDK-ARM,后面版本改为V5

点击Code Generator,如下勾选。然后点击GENERATE CODE

2.用keil编写代码

2.1 定时器启动代码

代码如下

    HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_Base_Start_IT(&htim3);

将代码放在主函数main.c下

该函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2。

2.2 串口通信

代码如下

    uint8_t hello[20]="hello windows!\r\n";

2.3 定时器中断回调函数

代码如下

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint32_t time_cnt =0;static uint32_t time_cnt3 =0;if(htim->Instance == TIM2){if(++time_cnt >= 400){time_cnt =0;HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);}}if(htim->Instance == TIM3){if(++time_cnt3 >= 1000){time_cnt3 =0;HAL_UART_Transmit(&huart1,hello,20,100000);}}
}

三、实验结果

1.硬件连接

  • USB转TTL和STM32最小核心板连接
    3v3-3v3
    GND-GND
    RXD-A9
    TXD-A10

  • 连接LED

LED短脚连接A2端口
LED长脚连接3v3

2.烧录实现

打开烧录软件flymcu

烧录成功后,可以观察到板子上的LED开始周期性闪烁

LED

打开串口调试助手,然后打开串口,观察串口输出

DINGSHIQI


总结

本篇博客主要是了解了一些定时器的理论知识,然后利用定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。并实现,一个5秒的定时器,每隔5秒从串口发送“hello windows!”和一个2秒的定时器,让LED等周期性地闪烁。
在工程项目配置上,一定要配置好,笔者中途有个错误可能就是因为没配置好,导致代码定义出问题了
希望大家多多指正,交流问题!

参考:https://blog.csdn.net/qq_44016222/article/details/123507270
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/
https://blog.csdn.net/qq_53112972/article/details/127575333?spm=1001.2014.3001.5502

STM32定时器实现5秒周期串口通信,2秒LED灯闪烁相关推荐

  1. ESP32 + ESP-IDF |GPIO 02 - 使用高分辨率定时器,每100ms时间间隔驱动外部两个LED灯闪烁

    文章目录 一.前言 二.VSCODE + ESP-IDF 2.1.快速创建项目 2.2.选择串口通道,ESP芯片型号 三.代码 3.1.头文件 3.2.全局变量 3.3.app_main( )函数 3 ...

  2. 嵌入式作业STM32定时器实现串口通信及LED灯闪烁

    目录 前言 一.什么是定时器 1.定时器与计数器 2. 定时器有什么用 3. 定时器的原理 4.时钟产生器和时基单元 二.用STM32CubeMx创建项目 1. 创建项目 2.配置RCC和SYS 3. ...

  3. STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序

    STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序 (2014-02-11 20:09:19) 转载▼ 分类: 单片机.嵌入系统 // 5个串口均可工作,已经 ...

  4. STM32定时器控制LED灯闪烁及PWM练习

    一.STM32定时器控制LED灯闪烁 1.相关配置 1)配置RCC和SYS 2)配置IO 配置PC15,并命名为D1. 3)配置定时器 选定时器2,配置Clock Source为Internal Cl ...

  5. STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁

    STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁 1,GPIO管脚简介与配置 1.1GPIO框图 1.2GPIO不同模式 1.3 GPIO寄存器 1.4 GPIO库函数配置 2 ...

  6. 【STM32】ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记

    ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记 一.ESP8266模块 1.模块介绍 2.AT指令介绍 2.硬件连接 二.串口转发及调试 1.串口转发流程 2.串口转发程序实现 ST ...

  7. STM32下的LED灯闪烁

    文章目录 一.实验原理 1.1.关于STM32 1.2.关于寄存器 二.点亮LED灯 2.1配置时钟 2.2配置输出模式 2.3点亮LED 三.进阶 !流水灯 3.1具体思路 找到端口输出地址 3.2 ...

  8. 【MSP430】MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验(含Timer_A分析)

    实验内容:上电点亮MSP430F5529 Launch Pad 上板载的红色LED,同时使用定时器让绿色LED闪烁 实验准备: 1.硬件:MSP430F5529 Launch Pad 2.软件:Cod ...

  9. STC8H8K64U——定时器T0(LED灯闪烁)

    LED灯闪烁 使用定时器实现延时实现LED灯闪烁,定时 5ms,count 计数50定时 250ms #include <STC8H.H>sbit LED = P2^0; unsigned ...

最新文章

  1. 看看你的一身秋膘,是五花肉还是雪花肉?
  2. Pytorch view()、squeeze()、unsqueeze()、torch.max()
  3. 【mysql】sql查询速度不变?不同数据量下,查询速度不会变化的问题
  4. 10个免费的javascript富文本编辑器(jQuery and non-jQuery)
  5. Java_JDBC_MySql
  6. Python 网络爬虫笔记4 -- 信息标记与提取
  7. java学习(105):字符串indexof,spilt,substring方法
  8. 脸书推出VR视频会议应用程序 正式跨出元宇宙第一步;三家公司新入选福布斯2021云计算百强榜;微软挖来亚马逊云业务顶级高管贝尔...
  9. c java json_cJSON_json包的C语言解析库
  10. mysql join 条件_MySQL Join 竟然可以这么玩?根据条件 进行复制
  11. Go Revel - Cache(缓存)
  12. 世界各国国家或地区的国际区号
  13. Oracle学习方法
  14. 计算机作曲常用软件,计算机作曲——软件与音源的选择
  15. Linux应用开发自学之路
  16. html圆圈里面问号,UTF-8编码的html页面显示-(问号)而不是字符
  17. 烘焙软件Knald介绍
  18. cesium实现面状要素的立体拉伸效果
  19. Win11电脑速度慢、延迟高怎么办?
  20. 各类文件的文件头尾总结

热门文章

  1. Linux安装docker-compose时使用github.com拒接连接处理
  2. 用IntelliJ IDEA的GUI Designer写Swing程式
  3. swiper插件使用
  4. 一个月之内,法拉第未来新车预告片两连发
  5. 在线协作软件的三个核心引擎
  6. 你踩过社群运营的坑吗?
  7. 根据数据和模板动态生成页面+列表的动态渲染
  8. 海思3520Dv300和NVP6124B摄像头自适应
  9. 兴澄特钢计算机中心怎么样,信息学院案例中心举办传统企业数字化转型——兴澄特钢数字钢资产案例研讨会...
  10. 《高德地图app AR导航》安装及设置 【全景导航 】【视频导航】【AR导航】