IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 定时器中断实现定时发送数据&灯的周期性亮灭 -> 正文阅读

[嵌入式]定时器中断实现定时发送数据&灯的周期性亮灭

??在之前的博客学习中,通过Delay()函数进行延时,但是通过软件仿真,发现延时并不准确,在本次博客中介绍硬件延时——采用定时器进行延时,观察软件仿真以及硬件仿真的结果,最终会得出”硬件延时“十分准确

在这里插入图片描述

一、【知识充电站】——定时器

Ⅰ.什么是定时器

??在STM32中,有基本定时器(Basic timer)、通用定时器(General-purpose timer)、高级定时器(Advanced-control timer)三类TIM定时器。

??基本定时器16位的只能向上计数的定时器,只能用于定时。

??通用定时器高级定时器有更多的功能:还可以进行输出比较、输入捕捉等功能。

定时器种类位数计数器模式产生DMA请求捕获/比较通道互补输出特殊应用场景
高级定时器16向上,向下,向上/下可以4带可编程死区的互补输出
通用定时器32向上,向下,向上/下可以4通用
通用定时器16向上,向下,向上/下可以4通用定时计数,PWM输出,输入捕获,输出比较
通用定时器16向上没有2通用
基本定时器16向上,向下,向上/下可以0主要应用于驱动DAC(TIM 6,7 独有)

Ⅱ.STM32F103C8T6定时器功能

🎈在ST官网查找有关的芯片手册,根据下载的芯片手册中的目录(Contents)可以看到:

🎈SMT32F103系列共有11个定时器:2个高级定时器(TIM1,TIM8);4个普通定时器(TIM2-TIM5);2个基本定时器(TIM6、TIM7);2个看门狗定时器;1个系统嘀嗒定时器。

定时器种类位数计数器模式预分频产生DMA请求捕获/比较通道互补输出
TIM1 TIM816位向上 向下 向上/向下1~65535之间的任意数可以4
TIM2 TIM3 TIM4 TIM516位向上 向下 向上/向下1~65535之间的任意数可以4没有
TIM6 TIM716向上1~65535之间的任意数0可以没有

Ⅲ.定时器的基本功能

??基本定时器就是单纯的定时计数器;通用定时器多了四个通道,相对应的增加了功能;高级定时器具有基本,通用定时器的所有的功能,并且添加了其他功能。

??🎨基本定时器功能(TIM6、TIM7)🎨

  • 16位向上、向下、向上/下自动装载计数器
  • 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
  • 触发DAC的同步电路 (此项是TIM6/7独有功能)
  • 位于APB1总线上

??🎨通用定时器(TIM2~TIM5)的主要功能🎨

  • 16位向上、向下、向上/下自动装载计数器
  • 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
  • 4 个独立通道(TIMx_CH1~4)可以用作:

🎈测量输入信号的脉冲长度( 输入捕获)
🎈 输出比较
🎈单脉冲模式输出
🎈PWM输出(边缘或中间对齐模式)

  • 支持针对定位的增量(正交)编码器和霍尔传感器电路
  • 如下事件发生时产生中断/DMA:

🎈更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
🎈触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
🎈输入捕获
🎈输出比较

  • 位于APB1总线上

??🎨 高级定时器(TIM1,TIM8)的主要功能: 🎨

  • 高级定时器具有基本,通用定时器的所有的功能;
  • 还具有控制交直流电动机所有的功能;
  • 输出6路互补带死区的信号,刹车功能等等;
  • 位于APB2总线上;

Ⅳ.STM32中APB1和APB2的区别

??结合时钟树来理解APB, Advanced Peripheral Bus:

??一般APB1和APB2上的时钟都是系统时钟经过 AHB(Advanced High performance Bus) Prescaler 分频得到 HCLK(High performance Bus Clock 高级高性能总线时钟)。

??HCLK 经过APB1 Prescaler 得到APB1时钟,而总线下TIMER的时钟源为APB1的2倍;

??HCLK 经过APB2 Prescaler 得到APB2时钟,而总线下TIMER的时钟源为APB2的2倍;

??AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种 “系统总线” ,主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。
??🎈时钟源🎈
??时钟需要时钟源来驱动。计数器时钟可以由下列时钟源提供:

  • 内部时钟(CK_INT)
  • 外部时钟模式1:外部捕捉比较引脚(TIx)
  • 外部时钟模式2:外部触发输入(ETR) (仅适用于TIM 2,3,4)
  • 内部触发输入(ITRx):使用一个定时器作为另外一个定时器的预分频器(例如配置TimerA作为TimerB的预分频器)

??定时器一般框图如下:
在这里插入图片描述

Ⅴ.时钟周期计算

??时钟树结构如图所示:
在这里插入图片描述

??时钟树名词解释

在这里插入图片描述

??定时器的定时周期计算公式如下:

在这里插入图片描述
??psc :为定时器预分频系数

??arr:自动重装载值

??Tclk:系统时钟频率

??因此,在已知定时时间后,可以根据该公式配置定时器预分频系数自动重装载值

二、小试牛刀

Ⅰ.【实验要求】

??通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时所需时间到了以后,处理定时相关的任务。请设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁

Ⅱ.【实验器材】

??STM32Cubemx 、MDK、FlyMCU、USB-TTL、串口助手、STM32最小核心板、LED灯、若干杜邦线

Ⅲ.【实验步骤】

1.首先,通过Cubemx配置代码

??(1)配置时钟源RCC,选择高速时钟-Crystal
在这里插入图片描述
??(2)配置时钟树,时钟频率为72M,设置如下,选择锁相环;
在这里插入图片描述
??(3)配置定时器TIM2,用来控制LED亮灭。

??点击“TIM2”-Clock Source “Internal Clock”-之后求得分频率与重载值-“中断使能”。
在这里插入图片描述
??根据题目要求,灯每隔2s闪烁一次,根据之前知识充电站介绍的公式:在这里插入图片描述
??其中,Tclk=72M,T=2s,求得其中的一种情况,psc=28800-1;arr=5000-1

??(4)配置定时器TIM3,用来控制串口输出。

??点击“TIM3”-Clock Source “Internal Clock”-之后求得分频率与重载值-“中断使能”。

??根据题目要求,串口每隔5s发送一次数据,根据之前知识充电站介绍的公式:在这里插入图片描述
??其中,Tclk=72M,T=5s,求得其中的一种情况,psc=28800-1;arr=5000-1

在这里插入图片描述

??(5)配置串口输出

??点击“Connectivity”-“USART1”-Mode “Asynchronous”-“中断使能`”。
在这里插入图片描述
??(5)配置GPI输出端口

??在本次实验中,采用PA1作为GPIO输出端口,控制灯的亮灭,并修改管脚名为“LED”
在这里插入图片描述

??(6)按照生成代码的规则,正常生成代码即可

2.之后,打开第一步生成的代码,修改代码

??(1)打开Cubemx生成的代码,找到.c文件
在这里插入图片描述
??(2)定义全局变量,代码如下:

/* USER CODE BEGIN 0 */
char c;//指令 0:停止  1:开始
char message[]="hello Windows!\n";//输出信息
/* USER CODE END 0 */

??(3)定时器中断使能

??在main函数之前中添加如下代码

  /* USER CODE BEGIN 2 */;

	 /*使能定时器2中断*/
     HAL_TIM_Base_Start_IT(&htim2);
		
		 /*使能定时器3中断*/
		HAL_TIM_Base_Start_IT(&htim3);


  /* USER CODE END 2 */

??(4)编写中断回调函数,代码如下:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	 if (htim->Instance == TIM3)  //   if (htim == (&htim3))
   {
    HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); 
	 }
	if(htim->Instance == TIM2)  /* tim2 2ms*/
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//功能代码
	}
}

??(5)进行编译,编译成功!
在这里插入图片描述

3.最后,编译成功后,上板测试。

??(1)打开“Flymcu“软件,将hex文件烧录到单片机中。

??(2)将电路连接好,LED的高电平端接PA1,低电平端接地,USB-TTL与最小核心板连接起来

??(3)打开串口助手,同时观察灯的亮灭情况与串口助手发送数据的频率的关系

Ⅳ.软件仿真

??使用软件仿真,验证周期是否与设置的完全一致。

??软件仿真具体设置,可以转到答主之前的博客进行查看

??在本次软件仿真中,答主以GPIOA_1为例进行说明,因为GPIOA_1用来控制灯的亮灭,每个2s转化一次状态,也就是说在波形上观看一个周期相当于4s

??波形图如下:
在这里插入图片描述
(起初波形设置太大,看不到完整波形)
在这里插入图片描述
从上述波形图中,不难发现,周期差不多为4s,有稍许误差!同理可得,串口发送数据周期为5s。

Ⅳ.硬件仿真

硬件连线如下:
在这里插入图片描述

硬件演示动图如下:

在这里插入图片描述

三、总结

??软件延时利用多个指令的执行来延时,累加每个指令的运行时间,来计算出延时的总时间。一般写成一个延时函数。如,以下是10ms软件延时。但是软件延时不精确(不同晶振参数也不一致),占用CPU时间

??硬件延时利用定时器/计数器芯片,或用微控制器内部的定时器/计数器,实际上,它就是对晶振的分频(分频系数可编程设置),得到一个精确的低频的周期信号,用这个周期信号(比如10ms)去触发中断,每10ms调用一次定时中断服务程序。在定时中断服务程序中加入计数变量,就可以得到任意的定时了。在10ms没有到时,微控制器可以运行其它程序,10ms到时再自动进去中断服务程序以处理定时任务,不会像软件延时阻塞了。定时器延时精确(不同晶振可做一致调整),不占用cpu资源

四、参考文献

[1]https://www.zhihu.com/question/304272349/answer/544256703

[2]https://blog.csdn.net/weixin_42648781/article/details/126670397

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:42:58  更:2022-11-05 00:45:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 19:51:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计