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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 快速学会使用STM32F103的定时器 -> 正文阅读

[嵌入式]快速学会使用STM32F103的定时器

快速学会使用STM32F103的定时器

欢迎

我是一名在读的大学生,近期在准备全国大学生电子设计竞赛的电源题,对于电源题的话,硬件部分的设计和软件配合是不可或缺的,对于电源题,对软件的需求没有像控制类的那么高,但是不论如何。不管我们打什么题目我们都要学习定时器、中断等等外设。纵观自己学习stm32的这一路来,我总结了一些快速上手定时器的方案和使用技巧。让我们更加高效率的使用定时器。

定时器的作用

定时器的功能有非常多,我所讲的是针对以下这几种情况:

  1. 定时器采样ad数据 ,这是电赛达到对交流电压采集必须要做到的;
  2. 定时器中断采集频率 通过定时器,中断采集频率,可以达到较高的精度;
  3. 定时器开关LED、BEEP等开关器件

使用教程:

首先我们要先了解一下这个公式:
在这里插入图片描述Tout就是我们定时器定时的时间了,TIMx_ARR和TIMx_PSC+1我们会在导入定时器模板时用到,对其进行更改就好。
接下来就是确定我们使用的定时器时钟多少,我们的定时器要有一个对时间的基准就是靠的时钟,如图TIM1是APB2,TIM2-TIM7是使用APB1![在这里插入图片描述](https://img-blog.csdnimg.cn/fb380f8cafdb48bcb0c0b6eaa6ace500.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpX3NtYWxs,size_16,color_FFFFFF,t_70

假设我们的定时器时钟是72Mhz,这个值是固定的。也就是图片中的Tclk。
那我们把TIMx_ARR和TIMx_PSC+1分别设置为71和999的话,切记不要超过65535因为最大只能容纳2的16次方。
这样子通过公式计算就是(71+1)(999+1)/72Mhz == 721000/72000000 ==
1/1000 也就是1ms。
所以我们根据需求来对arr和psc进行设置。那有了这些基础我们进行代码移植。找到可以使用的timer头文件和c文件。
把他们放在同一文件夹下。
在这里插入图片描述然后找到你要使用使用的工程,放进自己要使用的工程中。
在这里插入图片描述timer4就是我们要用到的定时器,然后我们打开工程
在这里插入图片描述
点击USER然后右键点击add existing file to group,找到刚刚的timer.c文件然后点击"魔法棒"
在这里插入图片描述在这里插入图片描述
在这里插入图片描述然后把我们的定时器文件夹加进去即可
在这里插入图片描述然后就一直按oK就好啦,我们就添加好了定时器。
在这里插入图片描述然后我们要进行修改的就是TIM的IEQHandler函数,这个是定时器的处理函数,我们把我们要定时做的内容写入if循环中即可。比如我这边对led0,进行反转,也就是进行闪烁(记得我们的定时时间可以设的长一点,不然看不出来led在闪烁)
在这里插入图片描述这样就完成了,然后我们要把timer4.h添加到main.c中,并且把timer4的初始化也加到我们的main函数中。编译会发现有这些问题;
在这里插入图片描述

在这里插入图片描述也有人可能没有问题,有这个问题的话,我们就一样要加入.c文件,我们要加入的是stm32f10x_tim.c文件,在自己的工程中找到它,加入即可,缺啥加啥,我们看文件名称就大概知道了,tim就是定时器。
在这里插入图片描述该文件一般都在STM32F10x_FWLib中SRC文件目录下。添加完毕,我们在进行编译就可以通过了。
最后我们导入程序,观察发现灯是常亮的那我们就更改arr和psc的值:

在这里插入图片描述我们现在是1ms执行一次,721000/72000000,我们更改为719和1999也就是7202000/72000000也就是20ms执行一次。
我们就调到我们可以用肉眼看见的程度既可以,然后编译的时候要记得勾选文件编译自动重装,不然直接点编译的话,烧写进去的代码还是之前的代码。
在这里插入图片描述这样子我们的实验就结束了。接下来贴上timer4.c和timer4.h的源代码

timer4.c

#include "timer4.h"
#include "led.h"
#include "delay.h"
void Timer4_init(void)   //T4 1ms时钟
{  //72000000/7200 = 100us
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
	TIM_TimeBaseStructure.TIM_Period = 9999-1;
	//计数的个数 //现在是720*10000/72000000=100ms
	//不得超过2^16 = 65536
	TIM_TimeBaseStructure.TIM_Prescaler = 719-1;//分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//分割时钟
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_DeInit(TIM4);
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
	
	//下面是定时器4的中断初始化
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure); 
	TIM_Cmd(TIM4,ENABLE);//使能定时器2
}

void TIM4_IRQHandler()//1ms 一次
{
	u8 st;
	st = TIM_GetFlagStatus(TIM4,TIM_IT_Update);
	if(st!=0)
	{
		TIM_ClearFlag(TIM4,TIM_IT_Update);
		LED1 = !LED1;//要啥补上,要100ms采集ad一次就写ad,要IO取反就取反
	}
}


timer4.h


```c
#ifndef _timer4_
#define _timer4_

#include "sys.h"
void Timer4_init(void) ;

#endif

```c
#include "led.h"
#include "delay.h"
#include "timer4.h"
 int main(void)
 {	
	delay_init();	    	 //延时函数初始化	  
	 LED_Init();		
	 Timer4_init( );
	   	//初始化与LED连接的硬件接口
	//uart_init(9600);
	
	while(1)
	{
		LED0=!LED0;
		delay_ms(500);
	}
 }



##main.c

#include "led.h"
#include "delay.h"
#include "timer4.h"
 int main(void)
 {	
	delay_init();	    	 //延时函数初始化	  
	 LED_Init();		
	 Timer4_init( );
	   	//初始化与LED连接的硬件接口
	//uart_init(9600);
	
	while(1)
	{
		LED0=!LED0;
		delay_ms(500);
	}
 }


THE END

个人总结:对于STM32定时器的话,我认为这是一个很高效实用的用法。
如果有写的不好的地方,尽情见谅

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:22:14  更:2021-08-03 11:23:06 
 
开发: 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年4日历 -2024/4/28 12:29:40-

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