(06)---STM32的Systick定时器与ADC

news/2024/5/27 16:35:50/

目录

【1】Systick定时器

概念

工作原理

时钟基准

【2】HAL_Delay函数分析

【3】定时器         

基本概念    

定时器分类

定时器组成

1.计数器

2.自动重装寄存器

3.预分频器

 定时器计数原理

实验

2.PWM

定义

参数

工作原理

应用

练习:通过PWM信号调节LED灯亮度

练习:实现呼吸灯效果

3.蜂鸣器

    简介:

    分类:

蜂鸣器发声实验

【4】ADC

1.定义

2.ADC简介

3.ADC特性

4.ADC时钟

5.工作模式   

6.单通道单次转换实验


【1】Systick定时器

   概念:

     SysTick又称滴答定时器。是一个定时设备,位于Cortex-M0内核中,和NVIC捆绑,产生SysTick异常(IRQ异常号15)可以对输入的时钟进行计数,系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

工作原理

工作原理:

滴答定时器是一个24位递减定时器,也就是最多能计数2^24(0xFFFFFF)。

SysTick设定初值并使能后,每来一个时钟信号,计数值就减1。

计数到0时,触发中断,SysTick计数器自动重装初值并继续减一,循环不断。

系统默认开启滴答定时器。

 

时钟基准

        探究:systick多久触发一次异常?

首先看Systick每次触发异常在异常处理程序中做了哪些工作

每次systick触发中断后会让uwTick自加1

这个uwTick的值就作为我们系统的时钟基准。

然后再来研究一下,uwTick多久会被加1.

在main.c中main函数首个执行的函数HAL_Init(),会对systick进行初始化。

在HAL_Init中通过调用HAL_InitTick函数,对Tick进行初始化

传递参数为:

TICK_INT_PRIORITY  =  0   作为systick的中断优先级

调用HAL_SYSTICK_Config函数用于配置systick时基

SystemCoreClock / (1000U /(uint32_t)uwTickFreq)

 uint32_t SystemCoreClock = 16000000UL;   

   16000000 / 1000 / 1  = 16000 

   将16000作为参数传递给了HAL_SYSTICK_Config函数

Systic_Config函数对Systick的重装值、初值、优先级和校准值都进行了配置。

  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)  //如果systick初值大于最大值0xFFFFFF

  {

         return (1UL);        //返回1 说明配置失败                                        

  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* 重载的计数值 */     16000 - 1

  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */

  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */

  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |

                   SysTick_CTRL_TICKINT_Msk   |

                   SysTick_CTRL_ENABLE_Msk;                      

  return (0UL); 

先来看一下每次重装的值为多少

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);  //即16000 - 1

从16000 - 1开始递减到0,总共需要计数16000次

当前时钟频率16Mhz,说明计一个数用时1/16M s 

计16000个数需要用时  16000 *  1/16000000 s  = 1/1000 s = 1ms

因此Systick每隔1ms会触发一次异常。

【练习】利用Systick异常,实现1秒打印“helloworld”

 

每次Systick触发异常时让flag自加1

在主函数中判断,当flag加到1000时,说明systick异常触发了1000次,此时刚好用时1s。

打印“helloworld”

【2】HAL_Delay函数分析

__weak void HAL_Delay(uint32_t Delay)
{uint32_t tickstart = HAL_GetTick();//获取当前时间uint32_t wait = Delay;//需要延时的时间/* Add a freq to guarantee minimum wait */if (wait < HAL_MAX_DELAY)// 造成了1ms的误差,无论延时时间是多久都会加1{wait += (uint32_t)(uwTickFreq);}while ((HAL_GetTick() - tickstart) < wait)//获取最新的时间减去进来时的时间{}
}

GetTick函数返回当前系统uwTick的值

uwTick每个1ms会自加1

因此HAL_Delay的实现依靠Systick,以达到毫秒为单位的延时效果。

时钟复习:

配置使用外部高速时钟

 

四个时钟源 HSI LSI HSE LSE

【3】定时器         

基本概念    

定时器本质上是一个计数器,可对输入的时钟进行计数,并在计数值达到设定值时触发中断,当这个计数器的输入是一个准确可靠的基准时钟时,对基准时钟计数的过程就是计时的过程。

定时器分类

    定时器的基本结构是通用的,很多模块电路都能用到,所以STM32定时上扩展了非常多的功能,根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。

 

定时器组成

1.计数器

 

   向上计数模式:计数器从0开始计数,当达到自动装载寄存器(TIMx_ARR)里的值时,自动清零且产生一个溢出事件,然后再从0开始向上计数。

   向下计数模式:计数器从自动装载寄存器(TIMx_ARR)里的值开始递减计数,当计数值达到0时产生一个定时器溢出事件,并重装初值,继续向下计数。

   中央对齐模式:又称为向上/向下计数,计数器从0开始递增达到ARR的值,产生一个定时器溢出事件,再从ARR的值递减到0,产生一个定时器溢出事件。

2.自动重装寄存器

3.预分频器

 定时器计数原理

时钟频率配置成了48Mhz,如何让定时器产生1s中断?

分频值写0相当于不分频 48/1 => 48

先对主频进行48分频得到1Mhz的频率,则分频值为48-1

            48Mhz / 48 =>  1Mhz

      1Mhz的时钟频率,相当于计一个数需要1/1000000秒,

       所以如果想得到1s中断,则需要从0开始计数到1000000-1,即计1000000个数需要1秒。  

1000000个数 * 1/1000000s = 1s

频率是时间的倒数 1Mhz = 1/1000000s

实验

       利用定时器中断实现1s打印一个“hellowolrd”

 

在main.c中重写定时器溢出中断回调函数

 

启动定时器以中断模式计数

2.PWM

定义

PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

 

参数

周期

高低电平变化所需要的时间,单位:ms

      T=1/f    T是周期,f是频率。

频率

      在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。

      例如:如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。

占空比

       在一个脉冲周期内,高电平的时间占整个周期时间的比例,单位是% (0%-100%)。

工作原理

计数器寄存器 (TIMx_CNT)

自动装载寄存器 (TIMx_ARR)

捕获/比较寄存器(TIMx_CCRx)

向上计数模式:

输出过程:

当0-t1这段时间,计数器寄存器的CNT的值是小于CCR,输出高电平。

当t1-t2这段时间,计数器寄存器的CNT的值是大于CCR且小于ARR的,输出低电平。

当CNT的值达到ARR里的值时,产生溢出事件,自动清零再次从0开始向上计数。

应用

 LED 照明调光、电机转速控制、舵机转向控制、蜂鸣器控制等。

练习:通过PWM信号调节LED灯亮度

 

 

频率 : 1/T = 1/1ms = 1/0.001s = 1000HZ

周期 : 1ms

占空比 : 50%

在TIM找到PWM信号生成函数:

 

在main.c中调用

练习:实现呼吸灯效果

3.蜂鸣器

    简介:

       蜂鸣器是采用直流电压供电的一个电子讯响器。

    分类:

  有源蜂鸣器

          内部带有震荡源,一通电就可以震荡发出响声,驱动较容易。

   因为是内部集成好的震荡电路,所以频率是固定的。

  无源蜂鸣器

          内部没有震荡源,直流电无法驱动,所以用一个方波信号来进行驱动,

   价格便宜,且频率可控。需要通过编程控制声调和响度,驱动稍麻烦。

蜂鸣器发声实验

蜂鸣器模块电路图

驱动蜂鸣器发声

     方法一:让单片机通过D1口交替输出高低电平

 

方法二:利用定时器输出PWM信号控制蜂鸣器

 

     思考:声调和响度分别由什么决定?

   ARR -> 周期 -> 1/频率

         周期越大,频率越小,声调越低。

         周期越小,频率越大,声调越高。

   CCR -> 脉冲 - 占空比

         占空比越高,通电时间越长,响度越大。

         占空比越低,通电时间越短,响度越小。

【4】ADC

 1.定义:

        模拟数字转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。

     模拟信号:电压、温度、光照、压力....(传感器可以将非电学量转换成电学量)

    最直观的体现,模拟信号是连续变化的曲线,而数字量是不连续的一个个离散的点。

  2.ADC简介

12 位 ADC 是一种逐次逼近型模拟数字转换器。

它有多达 19 个通道,可测量 16 个外部通道(从外部GPIO口连接的16通道模拟输入)

3个内部信号源,分别为内部温度传感 (VSENSE) 输入、内部参考电压 (VREFINT) 输入、外部电池 VBAT 供电引脚输入

各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。

ADC的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。

    3.ADC特性

      量程:能测量的电压范围 0 ~ 3.6V

     分辨率:ADC的分辨率通常以输出二进制数的位数表示,位数越多,分辨率越高,一般来说分辨率越高,转化时间越长。

    可配置的转换精度:6位,8位,10位,12位

    转化时间:模拟输入电压在允许的最大变化范围内,从转换开始到获得稳定的数字量输出所需要的时间称为转换时间   

 4.ADC时钟

     SYSCLK 系统时钟 

     HSI 16Mhz 高速内部时钟

     PLL  锁相环倍频器

5.工作模式   

         EOC:通道转换结束信号

         EOS:序列转换结束信号

         单次转换模式:ADC只执行一次转换;

         连续转换模式:转换结束之后马上开始新的转换;

  Tips

        ADC的单次模式和连续模式。这两中模式的概念是相对应的。这里的单次模式并不是指一个通道。假如你同时开了ch0,ch1,ch4,ch5这四个通道。单次模式转换模式下会把这四个通道采集一遍就停止了。而连续模式就是这四个通道转换完以后再循环过来再从ch0开始。

         扫描模式:ADC扫描选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。

        间断模式:触发一次,转换一个通道,在触发,在转换。在所选转换通道循环,由触发信号启动新一轮的转换,直到转换完成为止。

ADC单通道:

       单次转换:只进行一次ADC转换:配置为“单次转换模式”,扫描模式关闭。ADC通道转换一次后,就停止转换。等待再次使能后才会重新转换

       连续转换:进行连续ADC转换:配置为“连续转换模式”,扫描模式关闭。ADC通道转换一次后,接着进行下一次转换,不断连续。

ADC多通道:

       单次转换: 只进行一次ADC转换:配置为“单次转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。等待再次使能后才会重新转换

        连续转换:进行连续ADC转换:配置为“连续转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。

6.单通道单次转换实验

     采集光照/火焰/可燃气传感器数值

     打开ADC对应通道

 

     使能串口

 

   编程实现

        1.启动ADC

HAL_StatusTypeDef HAL_ADC_Start (ADC_HandleTypeDef *  hadc)

   功能:启动ADC开始转换

  参数:ADC_HandleTypeDef *  hadc  句柄

 返回值:   状态

        2.等待转换结束

          HAL_StatusTypeDef HAL_ADC_PollForConversion  (ADC_HandleTypeDef * hadc, uint32_t Timeout)

 功能:等待转换完成

          参数: ADC_HandleTypeDef * hadc   句柄   

                       uint32_t Timeout    超时时间

           返回值好:转换状态

        3.获取转换结果

 uint32_t HAL_ADC_GetValue (ADC_HandleTypeDef * hadc)

       功能:获取转换结果

       参数:ADC_HandleTypeDef * hadc 句柄

       返回值:转换结果

      4.停止ADC

HAL_StatusTypeDef HAL_ADC_Stop (ADC_HandleTypeDef *  hadc)

 功能:停止ADC

          参数:ADC_HandleTypeDef *  hadc  句柄

          返回值: 状态

      5.串口输出转换结果

          重定向printf到串口,再通过printf输出转换结果

练习:实现光控灯。

           当光照强度高时,三盏LED灯灭,当光照强度低时,三盏LED亮。


http://www.ppmy.cn/news/75733.html

相关文章

Elasticsearch:使用字节大小的向量节省空间 - 8.6

作者&#xff1a;Jack Conradson, Benjamin Trent Elasticsearch 在 8.6 中引入了一种新型向量&#xff01; 该向量具有 8 位整数维度&#xff0c;其中每个维度的范围为 [-128, 127]。 这比具有 32 位浮点维度的当前向量小 4 倍&#xff0c;这可以节省大量空间。 你现在可以通…

教你精通Java语法之第十四章、枚举

目录 一、背景及定义 二、使用 2.1switch语句 2.2常用方法 三、枚举优点缺点

超市购物车功能

1 问题 平常去超市买的要买的东西过多后&#xff0c;记不清楚怎么办&#xff1f; 2 方法 解决问题的步骤采用如下方式&#xff1a; 首先运用字典储存已有商品跟价格注释引导顾客进行操作; 通过实验、实践等证明提出的方法是有效的&#xff0c;是能够解决开头提出的问题。 代码清…

给初学者的Vue.js项目搭建教程

部分数据来源&#xff1a;ChatGPT 1. 环境准备 在开始创建 Vue.js 项目前&#xff0c;需要保证已经安装了 Node.js&#xff08;建议版本12&#xff09;和 NPM&#xff08;Node.js 自带的包管理工具&#xff09;。 可以执行以下命令确认是否已经安装&#xff1a; node -v np…

Java 使用 jdbc 连接 mysql

简介 Java JDBC 是 Java Database Connectivity 的缩写&#xff0c;它是一种用于连接和操作数据库的标准 API。Java JDBC 可以让 Java 程序通过 JDBC 驱动程序连接到各种不同类型的数据库&#xff0c;并且执行 SQL 语句来实现数据的读取、插入、更新、删除等操作。在本篇文章中…

ES6中async函数

1.async函数 说明&#xff1a; 通常就是Generator函数的语法糖&#xff0c;async函数自带执行器&#xff0c;也就是说,async函数的执行&#xff0c;与普通函数使用一样。语义化&#xff0c;加上async函数表示时异步操作&#xff0c;await表示需要等待结果。通用性&#xff0…

python+django网上书籍商城小说在线阅读分享下载系统k19is-vue

为了解决用户便捷地在网上购物以及下载文件&#xff0c;本文设计和开发了一个网页小说阅读系统。本系统是基于 B/S架构设计&#xff0c;Dango框架 &#xff0c;Python技术的前台页面设计与实现&#xff0c;使用Mysql数据库管理来完成系统的相关功能。主要实现了管理员与用户的注…

Flutter3.10版本发布,编程语言的重大更新

Flutter是一款强大的跨端开发框架&#xff0c;可以帮助开发者构建高性能、美观、灵活的应用程序&#xff0c;从而实现跨平台开发和部署。小程序容器技术与跨端框架结合使用&#xff0c;为开发者提供一站式的小程序开发和发布服务&#xff0c;帮助他们更加轻松和高效地构建和部署…

40亿个QQ号,限制1G内存,如何去重?

40亿个QQ号&#xff0c;限制1G内存&#xff0c;如何去重&#xff1f; 40亿个unsigned int&#xff0c;如果直接用内存存储的话&#xff0c;需要&#xff1a; 4*4000000000 /1024/1024/1024 14.9G &#xff0c;考虑到其中有一些重复的话&#xff0c;那1G的空间也基本上是不够…

Java自定义类:打造属于自己的编程世界

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java核心技术专栏 目录 一、自定义类示例 二、隐式参数与显式参数 三、封装的优点 自定义类是Java中最基本、也是最重要的组成部分之一&#xff0c;使用者可以根据需求创建…

PCIe 载板设计资料原理图:382-基于FMC+的XCVU3P高性能 PCIe 载板

基于FMC的XCVU3P高性能 PCIe 载板 一、板卡概述 板卡主控芯片采用Xilinx UltraScale16 nm VU3P芯片&#xff08;XCVU3P-2FFVC1517I&#xff09;。板载 2 组 64bit 的DDR4 SDRAM&#xff0c;支持 IOX16或者 JTAG 口&#xff0c;支持PCIe X 16 ReV3.0以及 FMC 扩展接口。…

电动力学专题:天线指标

天线指标 谐振回路 天线是一个谐振回路 方向性 天线向一定方向辐射电磁波的能力。天线对不同方向传来的电波所具有的接收能力天线的水平方向图 一副天线在水平方向360度范围内的接受或发射能力的极坐标表示瓣&#xff1a;&#xff08;类似瓣的结构&#xff09;薄瓣宽度&…

C++的运算符与表达式

C的运算符与表达式 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C内置了丰富的运算符&#xff0c;并且提供了以下类型的运算符&#xff1a; 算数运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 表达式 在程序中&#xff0c;运算符是用来操作…

Object源码

介绍 Object对象是所有对象(包括数组)的超级父类&#xff0c;如果将对象比作一个人的话&#xff0c;Object对象就是所有人的唯一的祖先。所有的类的父类都是Object的直接子类或间接子类。如果一个类没有声明它的父类&#xff0c;那么他的父类默认为Object对象。 常用方法 re…

优惠券使用规则引擎来计算优惠 (drools)

电商的促销花样越来越多&#xff0c;规则也也越来越复杂&#xff0c;因此&#xff0c;规则的频繁变更可能会带来频繁的版本开发上线&#xff0c;因此&#xff0c;业务希望能够快速上线&#xff0c;这就要求产品能够做到不修改代码快速上线。 平心而论&#xff0c;优惠券目前的…

计网笔记 01 概述 计算机网络体系结构、参考模型

文章目录 前言1、计网概述1.1 概念、组成、功能、分类1.1.1 概念1.1.2 计网组成1.1.2 计网分类 1.2 标准化工作及相关组织1.2.1 标准的分类 1.3 性能指标★★★1.3.1 速率相关性能指标1.3.2 时延相关指标 2、体系结构&参考模型★★★★★&#xff08;对应王道视频7-10p 相当…

Redis7实战加面试题-基础篇(Redis10大数据类型)

说明 刚看完尚硅谷Redis零基础到进阶&#xff0c;最强redis7教程&#xff0c;阳哥亲自带练&#xff08;附redis面试题&#xff09; 趁热打铁&#xff0c;根据脑图和视频&#xff0c;对视频中的知识点进行总结&#xff0c;方便以后复习 Redis入门概述 Remote Dictionary Serv…

不敢妄谈K12教育

做为大学生的父亲&#xff1a;不敢妄谈孩子教育 大约10年前&#xff0c;写了一本教育书稿 找到一个出版社的编辑&#xff0c;被训了一通 打消了出书以及K12教育的念想 趣讲大白话&#xff1a;娘生九子&#xff0c;各有不同 【趣讲信息科技171期】 ****************************…

《微服务实战》 第十四章 RabbitMQ应用

前言 一般MQ用于系统解耦、削峰使用,常见于微服务、业务活动等场景。 1、RabbitMQ概念概念 RabbitMQ整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。 1.1、生产者和消费者 Producer:生产者,就是投递消息的一方。消息一般可以包含2个部分:消息体和标签…

深入了解vector

vector 1. vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义&#xff08;(constructor)构造函数声明&#xff09;1.2.2 vector iterator 的使用1.2.3 vector Capacity1.2.4 vector Modifiers1.2.4 vector 迭代器失效问题 2. vector模拟实现 1. vector的介…