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

news2024/11/24 3:59:31

目录

【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.coloradmin.cn/o/560125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Convolutional Neural Network 的 PyTorch 实现(二)使用TensorRT进行推理加速

本文章针对 Windows 10 系统 目录 TensorRT 环境安装与配置zlibwapi.dll 安装与配置TensorRT 实现 CUDA CuDNN的安装&#xff1a; 参考文章 TensorRT 环境安装与配置 下载链接 TensorRT 本文章针对 Windows10、CUDA10.2 的PC&#xff0c;选择相对应的安装包完成下载。 解压后在…

迪赛智慧数——柱状图(基本柱状图):全球自动化无人机智能支出预测

效果图 全球自动化无人机智能支出及预测分析&#xff0c;2022年机器人流程自动化支出10.4十亿美元&#xff0c;智能流程自动化支出13十亿美元&#xff0c;人工智能业务操作达10.8十亿美元&#xff0c;未来&#xff0c;这些数字将进一步增长&#xff0c;自动化无人机智能也将拥有…

二战京东测试岗失败,真的后悔了....

两天&#xff0c;我的一个朋友去大厂面试&#xff0c;跟我聊天时说&#xff1a;输的很彻底… 我问她&#xff1a;什么情况&#xff1f; 她说&#xff1a;很后悔这5年来一直都干的是功能测试… 相信许多测试人也跟我朋友一样&#xff0c;从事了软件测试很多年&#xff0c;却依然…

小魔驼3.0下探至9万元背后,是毫末智行的“高位再进化”

作者 | 曾响铃 文 | 响铃说 是60分到90分难&#xff0c;还是90分到95分难&#xff1f; 这个问题不难回答——较高基数上的小幅度上升&#xff0c;要比较低基数上的大幅度上升困难得多。 这个道理在很多领域都十分适用&#xff0c;那些前沿技术领域更是如此&#xff0c;越到…

时钟、SysTick定时器、PWM、ADC

目录 【1】STM32的时钟系统 1.时钟基本概念 时钟源&#xff1a; 2.G030时钟源 3.时钟树 4.STM32CubeMX时钟树配置 【2】Systick定时器 1. 概念&#xff1a; 工作原理 时钟基准 【3】HAL_Delay函数分析 【4】定时器 基本概念 定时器分类 定时器组成 1.计数器 2.自…

软件测试----测试管理方法论

1、缺陷 &#xff08;1&#xff09;缺陷的主要变现&#xff1a; 1&#xff09;需求要求的功能没有实现 2&#xff09;实现了需求没有要求的功能 3&#xff09;软件中出现了明确指明不应该出现的错误 4&#xff09;需求虽未明确说明&#xff0c;但是应该实现的功能没有实现 5&…

MySQL高级|最强王者篇

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

【WSN覆盖】基于樽海鞘算法的三维无线传感器网络覆盖优化 三维WSN覆盖优化【Matlab代码#27】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 原始樽海鞘算法2. 三维覆盖模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 原始樽海鞘算法 2. 三维覆盖模…

RHCE 第六次作业

1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 2、判断web服务是否运行&#xff08;1、查看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行&…

【面试篇】SpringIoC、AOP、MVC面试实战

version&#xff1a;1.0 文章目录 SpringSpring基础 / IoC&#x1f64e;‍♂️面试官&#xff1a;举例Spring的模块&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;Spring、SpringMVC、Spring Boot关系&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;说说对SpringIoC的…

谈谈你对JavaSE中compare、compareTo的使用与比较

1. 前言 在java当中&#xff0c;若是要进行比较&#xff0c;大家可能第一时间想到&#xff0c; 或是 !&#xff0c;这种数学上的比较符>、接下来&#xff0c;我就分别介绍并演示这两种实现方法。 需要的朋友可以参考下&#xff0c;这将又会是干货满满的一期&#xff0c;全程…

【复习笔记】FreeRTOS(一)

FreeRTOS在校期间自学过一段时间&#xff0c;然而出来工作却用不上。 最近在搞东西需要用到RTOS&#xff0c;特意把笔记整理一下&#xff0c;算是复习了。笔记整理主要来源于正点原子的开发文档、视频教程。 文章目录 一、FreeRTOS简介二、FreeTROS移植三、测试例程四、实验效果…

docker搭建简单elk日志系统7(日志查看)

docker搭建简单elk日志系统1 docker搭建简单elk日志系统2 docker搭建简单elk日志系统3 docker搭建简单elk日志系统4 docker搭建简单elk日志系统5 docker搭建简单elk日志系统6 如有疑问可以去上面文档找相关内容 1.登录kibana 2. 以logs-test-dev为例 匹配到logs-test-dev数…

加拿大鹅Q4营收增长超30%,后续如何拿下更多“信任票”?

羽绒服行业正处在一个大混战的时代。有的品牌依托强势单品出海逆袭&#xff1b;有的品牌通过狂追当下Z世代的喜好&#xff0c;推翻经典设计&#xff1b;也有品牌“放下架子”在工厂忙起了特惠直播。在赛道愈发拥挤的背景下&#xff0c;羽绒服行业正在经历“地位”洗牌。 目前&…

如何高效地在网上找开源项目

开源项目是发展技能、分享想法和成为开发社区一员的好方法。开源意味着软件功能背后的源代码与所有想要阅读它的人公开共享。这意味着你可以准确地看到一个系统是如何工作的——一旦你愿意冒险&#xff0c;就为它做出贡献。除了向所有人开放贡献外&#xff0c;这种开放代码库通…

jsp实训培训软件系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp实训培训软件系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用…

机器数、真值、原码、反码、补码

机器数 机器数是数字在计算机中的二进制表示形式。机器数有2个特点&#xff1a;一是符号数字化&#xff0c;二是其数的大小受机器字长的限制。 机器数可以是带符号的&#xff0c;也可以是不带符号的。带符号的机器数用来表示正数、负数和零&#xff0c;而不带符号的机器数只能…

【C++】哈希应用:bitset和布隆过滤器

一、位图概念 一道面试题&#xff1a; 给定40亿个无序不重复的无符号整数。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中 遍历&#xff0c;时间复杂度 O ( N ) O(N) O(N)排序: O ( N l o g N ) O(NlogN) O(NlogN)&#xff0c;利用二分查找: l o g N …

都说测试行业饱和了,为什么我们公司新招的的测试开了15K?

其实每年都有人说测试行业饱和了&#xff0c;但依旧有很多人找到了薪资不错的工作。来说说我的看法吧&#xff0c;我认为不用担心测试会饱和的问题&#xff0c;我们人口基数大&#xff0c;任何一个行业都有竞争&#xff0c;这是非常正常的情况。而且在有技术能力的人面前永远没…

VoxWeekly|The Sandbox 生态周报|2023.05.15

欢迎来到 The Sandbox 生态周报《VoxWeekly》&#xff01;每周一发布&#xff0c;与你快速重温前一周整个生态系统中发生的大小事。 如果你们喜欢这些内容&#xff0c;记得 订阅我们的 Medium 并与家人及好友分享。关注我们的 Twitter 并加入 Discord &#xff0c;以获得我们全…