一.看门狗
1.1 了解看门狗
1.1.1什么是看门狗?
看门狗是一种递减的计数器,当递减的计数器的值为0时,该系统将被复位。看门狗分为两种IWDG(独立看门狗)与窗口看门狗。
1.1.2看门狗的使用
看门狗被激活后,要进行对应的“喂狗”操作,既不让在程序正常进行的过程中被复位,将看门狗的计数器重装载值定时的赋给计数器,达到值不为0。看门狗的时钟源由内部RC振荡器提供,为低速时钟,因此可在待机,睡眠的情况下计数。
1.1.3stm32的五种复位方式![](https://i-blog.csdnimg.cn/blog_migrate/2a05c3d44aa37139ca77cd18c0c50cdc.png)
1.1.4看门狗的作用![](https://i-blog.csdnimg.cn/blog_migrate/b79937fa75c93b3c6e86b221f535d674.png)
由于看门狗主要检测系统的各种问题(陷入问题后程序会卡死,不会喂狗),所以该系统的稳定性高时才会应用到,但由于RC振荡器的时钟并不精准,所以被应用的系统时间精度要求也应较低。
1.2.1IWDG的框图![](https://i-blog.csdnimg.cn/blog_migrate/26ec0fa545a5b6e91d4e0d92963e282d.png)
在看门狗被激活后,LSI时钟(RC振荡器)会被自动开启,经过了8位预分频后,会进入到计数器。由四个寄存器控制该流程。
1.2.2看门狗寄存器![](https://i-blog.csdnimg.cn/blog_migrate/2bea00a240d9bdf1ef04292e77a2ebdd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8c4211517af01dfa691994b7ef445480.png)
(1)看门狗状态寄存器:当硬件电路检测到看门狗的重装值与PCR发生变化后,会自动地把标志位置1,需要在软件中把标志位清0后才可以进行下次变化。
(2)看门狗重装计数器:看门狗的重装载值是12位的,有写保护功能,如果需要进行改变,需要将KR寄存器写入相应的值5555并且RVU标志位清0。没有缓冲寄存器。
(3)预分频寄存器:3位有效,可以通过图上找到对应的分频系数,公式为4*2prer次方,同样的只有PUV清0后并kr写入5555才可以改变值。
(4)建寄存器,三种写入值,四种读出返回值如图。AAAA是重新赋计数器,5555是解除写保护。CCCC在硬件看门狗时,不需要使用,因为看门狗分为软件与硬件,硬件看门狗只需要将其使能便可开启,并无法关闭,软件看门狗需要进行配置。
1.3.1HAL库配置![](https://i-blog.csdnimg.cn/blog_migrate/d33ba9d4a534a274148a1ba43f77d91d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/228296e572e64a9206a3d850b345431b.png)
在HAL库中,看门狗的结构体配置为一个基地址+一个结构体,HAL库封装了,因此只需要写入要写的两种值(写保护与使能已经封装),并且用户写一个喂狗函数(定期AAAA)
二.基本定时器![](https://i-blog.csdnimg.cn/blog_migrate/380073b1901ce83dd8e696143e98c7d0.png)
在STM32中,定时器共分为三大类,其中常规定时器为主要用途工具,常规定时器又分为三类。
1.1基本定时器简介
1.1.1定时器基础
如图所示,即为寄存器工作原理。
三种不同的定时器的功能与复杂程度各不相同
1.1.2基本定时器介绍![](https://i-blog.csdnimg.cn/blog_migrate/06e59203661788e9fc87d6cf92760e9a.png)
16位递增计数器,16位预分频器,可触发DAC,产生中断与DMA请求。
1.1.2时钟频率
基本定时器挂在在APB1总线上,但是APB1的分频几乎都为2,因此基本定时器的时钟频率通常也用最大72MHZ。APB1仍是1.
通过时钟来的信号经过总线变频后,进去定时器内,首先经过触发控制器(一种控制TIMER功能的寄存器),进入时基单元。当CNT=ARR(重装载寄存器)的值时,发生寄存器溢出。溢出会产生事件与中断请求、DMA输出。其中PSC与ARR是缓冲寄存器,既存在影子寄存器工作,影子寄存器不可以直接访问。
1.1.3影子寄存器
影子寄存器是一种寄存器缓冲机制,因为定时器通常应用在持续计数的系统中,因此不能让寄存器的ARR与PCR改变时突然赋给寄存器,可能会造成数据丢失与程序错误,因此引用了缓冲寄存器与影子寄存器搭配的方法,当某一时序的ARR与PCR改变时,系统会等到该时序产生溢出后,再将缓冲寄存器的改变值赋给影子寄存器。
如图是影子寄存器的配置方式,可选存不存在。当定时器的溢出周期一致时,可不选用缓冲功能,但是当系统功能对定时器溢出周期需求不一致时,要开启定时器缓冲,因为在堆栈的函数调用中,cpu的运行也是需要时间的,会造成时间不精准(例如,要做一个LED灯,1ms亮,2ms灭间隔闪烁,此时由于溢出时间不同,因此要改变定时器的重装值,而cpu将没有缓冲作用的定时器重装值赋给寄存器时也是需要时间的,所以会导致时间不精确,如果使用了缓冲作用,cpu会在赋值之前就把新的值放在缓冲寄存器中,溢出后影子寄存器立马获得新值,时间不误差)
1.1.4中断位
在定时器产生溢出时,会出现中断请求,开启中断使能时,中断标志位会被挂起。
1.2.1溢出事件计算![](https://i-blog.csdnimg.cn/blog_migrate/dd5f9da2f208edae1962a4d3fad6b7bf.png)
思路,F(频率)/PSC(分频系数)的倒数得到每计数一次的时间。再将此时间*ARR的值,即可得出溢出时间。看门狗定时器同理,但是是递减。
1.3.1定时器的三种计数方式![](https://i-blog.csdnimg.cn/blog_migrate/e84a8e10aa8c6fa45a53f0877c2b39f9.png)
1CNT=ARR
2CNT=0
3CNT=ARR-1(上升中)CNT=1(下降中)
如图为中央对齐时序的实例,备忘分析。
1.4库函数
1.4.1定时器HAL库函数配置
在使能中断的过程中,1需要线将初始化函数配置,
2其次进行时钟,NVIC配置,
3使能配置 4设置中断,并编写中断函数与回调函数
1.4.2基本定时器的配置
在基本定时器中,只需要配置基地址,预分频系数,计数模式,arr,是否开启缓冲寄存器(自动重装) 。