STM32之定时器配置

STM32之定时器配置今天记录一下 stm32 定时器的学习 很多地方也不是很懂 只把初始化定时器的部分理解了一个大概 做一个单纯的记录吧 以后的学习中再深入理解一下 中断系统 NVIC 这一部分要明确中断优先级的概念 抢占优先级

今天记录一下stm32定时器的学习,很多地方也不是很懂,只把初始化定时器的部分理解了一个大概,做一个单纯的记录吧,以后的学习中再深入理解一下!!!


定时器的配置部分可以分为两个部分:初始化NVIC(中断优先级设置)和初始化定时器下面我们来分别说明。


  • 中断系统NVIC

这一部分要明确中断优先级的概念:stm32将优先级分为抢占优先级和响应优先级,相应的在初始化每个中断源时,都需要设定这两个优先级!!!

  • 抢占优先级:决定中断是否可嵌套,高抢占优先级可嵌套低抢占优先级,如果抢占优先级相同,则中断没有嵌套关系
  • 响应优先级:抢占优先级相同两个中断同时到达的条件下,响应优先级的高低可决定先处理哪一个中断(高者在前)抢占优先级相同但是两个中断不同时到达,则不管响应优先级的高低,都要等先发生的中断处理完才可以接着处理后到来的中断。
  • 在优先级分组的表格中,序号越小,优先级越高
  • stm32的优先级分组: 共分为5组 (NVIC_PriorityGroup_0到NVIC_PriorityGroup_4),抢占优先级数从小到大,响应优先级数从大到小,其中:NVIC_PriorityGroup_0无抢占优先级,NVIC_PriorityGroup_4无响应优先级。
  • 响应优先级无要求的情况下:初始化时将优先级分组设置为NVIC_PriorityGroup_4的方式(只设置抢占优先级),或者不设置优先级分组(系统默认优先级)一般情况下把响应优先级也设置为0
  • 初始化NVIC主要是初始化四个部分:中断通道、抢占优先级、响应优先级、通道使能,这四个部分我们也能在相关的库函数(misc.h)中找到定义:
    在这里插入图片描述
    代码部分:




void NVIC_TIM4Enable(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//选择中断通道TIM4 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设定抢占优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设定响应优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断通道 NVIC_Init(&NVIC_InitStructure);//调用NVIC初始化函数 } 

做几点说明:

  • 我们没有用到中断的嵌套,所以把抢占优先级也设置为0
  • 关于中断通道:stm32使用了Cortex-M3中的84个中断通道,(16个异常,68个中断)具体的相关信息可以在中文手册中查找到。

  • 初始化定时器

stm32(STM32F103ZET6功能较为全面的一种)内部含有11个定时器:2个高级控制定时器(TIM1和TIM8)、4个通用定时器(TIMX:TIM2、TIM3、TIM4、TIM5)、2个基本定时器(TIM6和TIM7)他们的功能性是依次减少的,具体信息也可查手册获得(一定要利用好手册!!!),下面贴出:

  • 高级控制定时器:
    在这里插入图片描述

  • 通用定时器(TIMX):
    在这里插入图片描述

  • 基本定时器:
    在这里插入图片描述

NIOTICE!!!注意当计数模式为向上计数时:是从0开始向上计数,一直到计数值和重装载寄存器的数值相等时,计数器会自动归零,并产生一个溢出事件(也就是触发一次中断)这点是和51不同的。

  • 关于预分频系数: 51单片机的学习中,我们知道定时器的数值是每经过一个时钟周期自动加一的,但在32中我们可以通过设定预分频系数(N),使得定时器每经过(N+1)个时钟周期自动加一这里为什么是N+1个时钟周期加一呢?因为我们的分频系数是从0开始的,假设设定预分频系数是3,那么实际上(0-3)总共是4个数,也就是4分频
  • 在开始定时器的配置之前,我们首先要使能时钟:先看一下定时器是挂接在哪条总线上的,可在手册中系统构架部分找到总的构架图:
    在这里插入图片描述
    可以看到除TIM1外的定时器都是挂接在APB1总线上的,所以我们要使能定时器时钟就要使能APB1外设时钟寄存器,看一下函数定义:
    在这里插入图片描述






  • 定时器的配置主要配置4个部分自动重装载寄存器数值、预分频系数、时钟分割(一般的定时功能用不到,可设为0)、计数模式, 同样的,我们可以在库函数(stm32f10x_tim.h)中找到相关的结构体定义:
    在这里插入图片描述

  • 配置完定时器之后,我们还需要清除中断标志位(emmm,一般情况下好像没什么影响):用到的函数:
    在这里插入图片描述
    TIMX:是写明用到哪个中断;TIM_IT:表示中断源类型
    • 关于中断源类型: stm32有6种中断源类型,在相应的库函数(stm32f10x_tim.h)里也可以找到定义:
      在这里插入图片描述
      我们的程序里用到的是更新事件中断(TIM_IT_Update)







  • 使能定时器: 可以理解为51中的(TR0 = 1)这行代码,就是开启定时器,同样的,一旦使能了定时器,就会开始计数。 用到的函数:
    在这里插入图片描述

  • 开启中断(中断初始化): 相当于(ET0 = 1)这行代码,用到的函数:
    在这里插入图片描述


加入中断优先级设置部分的代码后就是完整的定时器配置的内容了,下面给出的代码中把两者写入了一个函数,读者也可以分两个函数来写:

#include "stm32f10x.h" void TIM4_Init(u32 period, u32 prescaler)//period-计数周期(实际值),prescaler-预分频值(实际值) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能TIM4时钟 /*没有设置优先级分组,使用系统默认优先级*/ NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//选择中断通道TIM4 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设定抢占优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设定响应优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断通道 NVIC_Init(&NVIC_InitStructure);//调用NVIC初始化函数 TIM_TimeBaseStructure.TIM_Period = period - 1;//设定自动重装载计数值 TIM_TimeBaseStructure.TIM_Prescaler = prescaler - 1;//设定预分频系数 TIM_TimeBaseStructure.TIM_ClockDivision = 0;//基本定时器没有预分频功能,此项会被忽略 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置计数模式为向上计数 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);//初始化TIM4 TIM_Cmd(TIM4, ENABLE);//使能TIM4定时器 TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//使能TIM4中断 } 

说明:

  • 为什么自动重装载计数值是实际值减一呢? 这个其实和上面我们解释的预分频值是一样的,因为计数值是从0开始计数的假设我们想要计1000个值就归0,那么我们只需要从0计到999就可以了,也就是说自动重装载寄存器的数值要是999(1000-1)。

实战:(利用定时器实现L1一秒闪烁)

stm32f10x_it.c文件

、、、 void TIM4_IRQHandler(void)//每次产生一个中断溢出事件就会进入一次中断函数 { if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)//检测是否为溢出中断 { TIM_ClearITPendingBit(TIM4, TIM_IT_Update);//清除中断标志位,否则启动时会进入中断服务函数 GPIOC->ODR ^= (1 << 8); GPIOD->ODR |= (1 << 2); GPIOD->ODR &= ~(1 << 2); } } 、、、 

LED部分参照上一篇博客:STM32之LED配置

main.c文件

#include "stm32f10x.h" #include "led.h" #include "timer.h" u32 TimingDelay = 0; void Delay_Ms(u32 nTime); //Main Body int main(void) { SysTick_Config(SystemCoreClock/1000); LED_Init(); TIM4_Init(10000, 7200);//定时1S while(1) { } } void Delay_Ms(u32 nTime) { TimingDelay = nTime; while(TimingDelay != 0); } 

注意!!!!:

  • 中断服务函数官方规定统一写在(stm32f10x_it.c)这个文件里,(emmm,当然也可以写在别的文件里)。
  • 定时时间的计算公式:预装载值(period) /(72M /预分频值(prescaler ))
    • 时钟频率为72M,那么一个时钟周期就是:1/72M;
    • 计一个数需要的时间:预分频值*(1/72M);
    • 定时时间:预装载值(period)* 预分频值*(1/72M);也可以写为:预装载值(period) /(72M /预分频值(prescaler ))
  • 1s定时10000(period)//7200(prescaler) = 1s。

一个快速写底层的方法
理解之后,可以参照stm32固件库里的底层参考例程,用到哪些地方就粘贴那一部分的内容,只需要改变里面的参数即可:
底层文件查找路径stm32固件库->STM32F10x文件->Project->STM32F10x_StdPeriph_Examples
在这里插入图片描述




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200985.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:11
下一篇 2026年3月20日 上午10:11


相关推荐

  • Java程序设计教程牛晓太_Java程序设计教程

    Java程序设计教程牛晓太_Java程序设计教程第1章Java概述1.1Java简介1.1.1Java的产生1.1.2Java的特点1.1.3Java三大平台1.2Java的开发和运行环境1.2.1Java虚拟机1.2.2JDK的安装1.2.3环境变量的设置1.2.4JavaAPI文档1.3Java程序开发实例1.3.1Java应用程序实例1.3.2Java小程序实例1.4Eclipse开发平台1.4.1Ecli…

    2022年7月7日
    24
  • 如何关闭或启动mysql服务器_MySQL运行

    如何关闭或启动mysql服务器_MySQL运行方法一:通过命令行开启\关闭服务第一步点击开始菜单,找到cmd,以管理员身份运行。第二步在命令行里面输入“netstopmysql”,按回车键,就停止了mysql服务,如下图所示:第三步在命令行输入“netstartmysql”,接着按回车键,开启mysql服务,如下图所示:END方法二:通过电脑服务开启/关闭第一步最开始右键计算机,选择“管理”,如下图所示:第二步进去管理之后,选择服务和…

    2025年7月25日
    9
  • 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

    海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)最近在做一个项目 涉及到工业相机 需要对其进行二次开发 相机方面选择了海康威视 网上关于海康威视工业相机 SDK 的开发资料很少 自己也摸索了一段时间 请教大佬 终于有了些收获 记录下来 方面以后查阅 目录 1 说明 1 1 软硬件相关配置 1 1 1 硬件选择 1 1 2 软件选择 1 2 关于安防相机与工业相机 1 说明 1 1 软硬件相关配置 1 1 1 硬件选择工业相机我选择的是海康威视的 具体的参数如下 工业相机资料 https c hi1718 com news 3619

    2026年3月19日
    1
  • 带宽与并发数

    带宽与并发数如有转载请注明出处哦 目的 做并发测试的时候 我们要根据自己的带宽看看网络能承受我们每秒到底能发送出多少个数据包 本篇博文是 介绍带宽与我们每秒最多发送的数据包的关系先说推出的结果并发数 带宽 Mb 67 2 数包大小 KB 注意这里的带宽 Mb 发送出的数据大小单位是 KB 下面为推到过程 首先要分清一下单位一个字节的等于八个位 位就是我们常说的二进制

    2026年3月20日
    2
  • 中国经纬度范围

    中国经纬度范围全球经纬度的取值范围为 纬度 9090 经度 中国的经纬度范围大约为 纬度 3 8653 55 经度 73 66135 05 北京行政中心的纬度为 39 92 经度为 116 46 越北面的地方纬度数值越大 越东面的地方经度数值越大度分转换 将度分单位数据转换为度单位数据 公式 度 度 分 60 例如 经度 116 20 12 纬度 39 12 34 经度 116

    2026年3月19日
    2
  • sql语句大全+实例讲解「建议收藏」

    sql语句大全+实例讲解「建议收藏」1.创建3张表//学生表创建CREATEtablestudent(SnoCHAR(9)PRIMARYKEY,SnameCHAR(20)UNIQUE,Ssexchar(2),SageSMALLINT,Sdeptchar(20));//课程表创建CREATEtablecourse(Cnochar(4)PRIMARYKEY,Cnamechar(40)notNULL,Cpnochar(4),CcreditSMALLINT);//学生选课表创

    2022年5月12日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号