版权归如下公司,禁止非授权转载:

  • 北京西普阳光教育科技股份有限公司(https://www.simpleware.com.cn)
  • 维周机器人科技有限公司(http://www.vejoe.com)


【实验目的】

1、通过子函数实现任务注册与调用,体会指针函数和结构体的实用性。
2、通过对Systick、TIM2、TIM3、TIM4定时器的配置,进入定时器中断执行任务。

【实验原理】

一、STM32的内部Sys Tick滴答定时器

在STM32芯片内部有一个简单的定时器——Sys tick timer。该定时器的时钟源可以是内部时钟,或外部时钟。所以在STM32中Sys Tick以HCLK(APB时钟)或HCLK/8作为运行时钟。

Sys Tick是一个24位的定时器,即一次最多可以计数2^24个时钟脉冲,这个脉冲计数值被保存到当前计数值寄存器SysTick->VAL中,只能向下计数,每接受到一个时钟脉冲
Sys Tick->VAL的值就向下减1,直至到0,当SysTick->VAL的值被减至到0时,由硬件自动把重载寄存器Sys Tick->LOAD中保存的数据加载到SysTick->VAL中,从新向下计数;当Sys Tick->VAL的值被减至到0时,触发异常,就可以在中断服务函数中处理定时事件。

当然,要使用Sys Tick进行以上工作必须对SysTick进行配置,它的控制配置很简单,只有三个控制位和1个标志位,都位于寄存器SysTick->CTRL寄存器中
在这里插入图片描述

  1. Bit0:ENABLE
    为Sys Tick timer 的使能位,此位为1的时候使能Sys Tick timer ,此位为0的时候关闭Sys Tick timer.
  2. Bit1:TICKINT
    为异常触发使能位,此位为1的时候并且Sys Tick->VAL计数至0时会触发Sys Tick异常,此位为0的时候不触发异常。
  3. Bit2:CLKSOURCE
    为Sys Tick的时钟选择位,此位为1的时候Sys Tick的时候为AHB 时钟,此位为0的时候Sys Tick时钟为AHB/8(AHB的八分频)
  4. Bit16:COUNTFLAG
    为计数为0标志位,若Sys Tick->VAL计数至0,此标志位会被置1.
    定时时间计算公式:T=ticks*(1/f),T为要定时的总时间。

Ticks是存放到到重载SysTick->LOAD寄存器中,Sys Tick timer 定时器启动每次计数到Tick个脉冲产生异常触发(中断)。1/f即为Sys Tick timer 使用的时钟源,f为该时钟源的时钟频率,当时钟源确定后为常数

SysTick->CTRL &= ~(1 << 2);

使Sys tick CTRL寄存器 Bit2 位置0 ,其他位保持不变,Bit2位为0 ,Sys Tick时钟为AHB/8(AHB的八分频)

f = AHB/8=72MHz/8 =9MHz

1/f= 1/9000000 一个时钟周期为1/f s,所以我们得到一个时钟周期为1/9us

二、STM32 通用定时器简介

STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

STM3F1 的通用 TIMx (TIM2、 TIM3、 TIM4 和 TIM5)定时器功能包括:

  1. 16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
  2. 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~
    65535 之间的任意数值。
  3. 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
    A.输入捕获
    B.输出比较
    C. PWM 生成(边缘或中间对齐模式)
    D.单脉冲模式输出
  4. 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外
    一个定时器)的同步电路。
  5. 如下事件发生时产生中断/DMA:
    A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    C.输入捕获
    D.输出比较
    E.支持针对定位的增量(正交)编码器和霍尔传感器电路
    F.触发输入作为外部时钟或者按周期的电流管理
    由于 STM32 通用定时器比较复杂,这里我们不再多介绍,请大家直接参考《STM32 参考
    手册》第 253 页,通用定时器一章。 为了深入了解 STM32 的通用寄存器, 下面我们先介绍一
    下与我们这章的实验密切相关的几个通用定时器的寄存器。
    首先是控制寄存器 1(TIMx_CR1),该寄存器的各位描述如图 13.1.1 所示:

在这里插入图片描述
结构体介绍
结构体TIM_OCInitTypeDef,包含了TIMx时间基数单位的配置信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
TIM_Pulse
TIM_Pulse 设置了待装入捕获比较寄存器的脉冲值。它的取值必须在 0x0000 和 0xFFFF 之间。
在这里插入图片描述
结构体NVIC_InitTypeDef
在这里插入图片描述
因版本原因可能在最新的库中通道名还减去尾部的Channel,写代码才能通过,本实验要去除尾部Channel
在这里插入图片描述
NVIC_IRQChannelPreemptionPriority
该参数设置了成员 NVIC_IRQChannel 中的先占优先级。
NVIC_IRQChannelSubPriority
该参数设置了成员 NVIC_IRQChannel 中的从优先级。
在这里插入图片描述
NVIC_IRQChannelCmd
该参数指定了在成员 NVIC_IRQChannel 中定义的 IRQ 通道被使能还是失能。这个参数取值为 ENABLE 或者 DISABLE。

结构体TIM_TimeBaseInitTypeDef
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
RCC_ClocksTypeDef结构体
在这里插入图片描述
程序中使用到的函数
函数NVIC_PriorityGroupConfig 选择优先分组
在这里插入图片描述
在这里插入图片描述
函数NVIC_Init 初始化中断优先级配置参数
在这里插入图片描述
函数RCC_GetClocksFreq 获取系统时钟频率
在这里插入图片描述
函数TIM_TimeBaseInit
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【实验环境】

开发环境:Windows7/8/10,32bit/64bit
开发软件:Keil
开发硬件:双轮自平衡车、ST-link

【实验步骤】

一、定义参数变量,声明函数

在这里插入图片描述

二、定时器TIM2、TIM3、TIM4、配置

定义结构体变量,判断定时器是否是TIM2、TIM3、TIM4不是直接返回,是否是首次初始化,
结构体参数配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、任务函数注册、任务信息返回

在这里插入图片描述

四、中断函数调用任务

在这里插入图片描述

五、打开main.c

在这里插入图片描述

六、任务函数

在这里插入图片描述

【实验思考】

一、选择题

题目1 下面那个表示TIM2通道1预装值失能(B)
A:TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Disable);
B: TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);
C: TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
D: TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);

题目2 定时器有几种计数模式(A)
A: 3 B:4 C: 5 D:6

二、简答题

题目1 定义定时器的结构体有哪些成员?成员表示的功能?

答:TIM_TimeBaseInitTypeDef 中包含5个成员变量:
TIM_Period :该参数是用来设置自动重装寄存器的值,它的取值范围必须在0x0000和0xFFFF之间。
TIM_Prescaler :该参数是用来设置PSC预分频器的分频系数,它的取值范围必须在0x0000和0xFFFF之间。
TIM_ClockDivision :该参数是用来设置时钟分割
TIM_CounterMode :该参数是用来设置计数模式的。
TIM_RepetitionCounter :该参数使用设置重载几次数据后定时器才进入中断。


Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐