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

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

文章目录

  • 【实验目的】
  • 【实验原理】
    • 一、STM32的内部Sys Tick滴答定时器
    • 二、STM32 通用定时器简介
  • 【实验环境】
  • 【实验步骤】
    • 一、定义参数变量,声明函数
    • 二、定时器TIM2、TIM3、TIM4、配置
    • 三、任务函数注册、任务信息返回
    • 四、中断函数调用任务
    • 五、打开main.c
    • 六、任务函数
  • 【实验思考】
    • 一、选择题
    • 二、简答题

【实验目的】

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 :该参数使用设置重载几次数据后定时器才进入中断。


嵌入式课程 之 定时器实验相关推荐

  1. 嵌入式STM32--实验三 、通用定时器实验

    嵌入式STM32--实验三 .通用定时器实验 一.实验目的 二.实验原理 1.STM32通用定时器概述 2.时基单元 3.工作模式 4.时钟选择 三.实验内容 3.1.结合按键中断和定时器编程实现以下 ...

  2. 流水灯嵌入式课程设计(包含UCOSII的无仿真和无UCOSII的有仿真)

    目录 流水灯设计原理 1.基于STM32F103R6Tx的流水灯设计,先初始化管脚,编写LED.KEY按键和定时器的初始化函数. 2.按键的判断设计分为两部分:开始/停止按键和设置时间按键. ① 开始 ...

  3. 单片机彩灯移动实验_单片机课程设计彩灯实验.doc

    单片机课程设计彩灯实验 彩灯控制器设计 1.项目要求及参数 1.1用指令语句实现对C51的控制,从而实现对彩灯变化的控制. 1.2用定时器控制彩灯变化,用语句查询方式实现程序设计. 1.3用定时器控制 ...

  4. 嵌入式Linux结课报告,嵌入式课程报告.doc

    嵌入式课程报告 嵌入式系统及应用设计报告 题 目 嵌入式Linux系统移植 专 业 电子与通信工程 姓 名 王文平 学 号 1320610012 一.硬件设备介绍 此次实验用的板子是友善之臂的Mini ...

  5. c语言电子时钟课程设计报告,电子时钟嵌入式课程设计报告

    <电子时钟嵌入式课程设计报告>由会员分享,可在线阅读,更多相关<电子时钟嵌入式课程设计报告(19页珍藏版)>请在人人文库网上搜索. 1.合海大学计算机信息工程学院(常州)课程设 ...

  6. 用linux设计99乘法表,嵌入式课程设计九九乘法表

    <嵌入式课程设计九九乘法表>由会员分享,可在线阅读,更多相关<嵌入式课程设计九九乘法表(8页珍藏版)>请在人人文库网上搜索. 1.安阳师范学院计算机与信息工程学院嵌入式系统课程 ...

  7. 聊城大学理工学院-嵌入式课程设计-stm32f407小车

    最近两天有点偷懒了,什么都不想做,所以今天不接着弄上次的GPS模块了,今天就分享点别的-----大三时做的嵌入式课程设计.当时做好后也算是好几个班流传最广的版本了,所以多少还是很有点成就感的. 实现的 ...

  8. STM32F4系列HAL库配置定时器实验——输入捕获

    STM32F4系列HAL库配置定时器实验--输入捕获 输入捕获简单讲解 输入捕获模式可以用来测量脉冲宽度或者测量频率.我们以测量周期和频率为例,用一个简图来说明输入捕获的原理 假定定时器工作在向上计数 ...

  9. 51单片机:有趣的定时器实验

    51单片机:有趣的定时器实验 本以为考完试搞完课设就没啥单片机啥事了,结果莫名的来了软件工程软件基础训练,训练Proteus和Keil软件.我嘞天,之前天天用好不?这课程安排的emmmmm,我还要其他 ...

最新文章

  1. 利用RMAN检测数据库坏块的脚本
  2. 用户空间与内核空间,进程上下文与中断上下文[总结]
  3. python下载安装教程3.8.0-Python3.8.0
  4. 总结——LR学习总结
  5. Mybatis SQL拦截器实现
  6. 容器源码解析之LinkedHashMap(九)
  7. 待字闺中:日志查询。(网络摘要)
  8. docker 部署_GitLab CI 自动部署netcore web api 到Docker
  9. HTTP协议中常见请求方法以及一些常见错误代码
  10. android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...
  11. php整形数组求里面的质数,PHP实现的分解质因数操作示例
  12. 20135223何伟钦—信息安全系统设计基础第五周学习总结
  13. VS2008(C#)制作网页Tab标签切换方法(四)
  14. 【NOIP-2017PJ】图书管理员
  15. 计算机中英文打字文章,中英文混合打字文章
  16. pyodbc linux 乱码,关于python:无法在Linux上安装pyodbc
  17. 项目选题报告答辩总结
  18. linux的帮助,帮助信息_Linux公社 - Linux系统门户网站
  19. Android破解——支付宝内购破解方法总结
  20. 知识图谱从入门到应用——知识图谱的应用

热门文章

  1. 在matlab中打开mat文件
  2. 【产品经理】智慧景区调研
  3. 87期:史上最全的物联网资料
  4. Node.js详解(二):Node.js与JS的关系
  5. cmd中如何切换到指定盘符的指定文件夹目录
  6. excel学习-数据透视表(自动分组+手动分组+制作动态数据源)
  7. Android: android sensors, HAL范例
  8. spring context 学习总结(注解功能,配置文件,jar包)
  9. 【至简设计案例系列】基于FPGA的曼彻斯特编码解码设计
  10. BEGAN-hmi88代码调试