学习STM32编程的小车过程中的笔记 2021/4/5
作者:互联网
/*********************************************************************/
RTC Real_Time_Clock
/*********************************************************************/
付费换来的笔记——看门狗详解
/*********************************************************************/
一 背景(雾)
单片机的工作常常会收到外界电磁场的干扰,造成程序跑飞,陷入死循环
处于对单片机运行状态进行实时监测的考虑 便产生了专门用于检测单片机
程序运行状态的模块或者芯片
/*********************************************************************/
二 看门狗解决了什么
要每隔一段时间喂狗,如果超过时间没有喂狗,将视为程序跑飞,则系统
看门狗复位
/*********************************************************************/
三 STM32里的看门狗
1 独立看门狗
LSI专用时钟,
应用于需要看门狗作为一个在主程序之外能够完全独立工作,对时间精度要求低
2 窗口看门狗
APB1时钟分频后得到的时钟来驱动
适合要求看门狗在精确几时窗口起作用的程序
/*********************************************************************/
四 详解独立看门狗(时钟由独立的RC振荡器提供,可在停止和待机模式下工作)
1 摘抄———————————————————————————
“就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 (0X000)的时候, 系统就会产生一个复位信号,即
IWDG_RESET。 如果在计数没减到 0 之前,刷新了计数器的值的话,
那么就不会产生复位信号,这个动作就是我们经常说的喂狗。”
2 详解———————————————————————————
在键寄存器中(IWDG_KR)中写入0XCCCC,就会启用独立看门狗
计数器开始从0XFFF递减计数,
!!!
如果程序没跑偏,就会记得喂狗,在键寄存器中写入0XAAAA,
IWDG_RLR中的值就会被重新加载到计数器,从而避免看门狗复位
!!!
如果程序跑飞了,忘记喂狗,则计数器中的值到达0X000,系统产生了复位信号
就复位了
3 IWDG寄存器描述——————————————————————
IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改之前要向IWDG_KR
寄存器中写入 0X5555,将其他值写入这个寄存器将会打乱操作顺序
重装载(0XAAAA)也能启动写保护功能
键寄存器 IWDG_KR
预分频寄存器 IWDG_PR
重装载寄存器 IWDG_RLR
状态寄存器 IWDG_SR
4 使用看门狗了————————————————————————
void main(void)
{
/*初始化*/
{
......
}
/*启动看门狗*/
IWDG_Start();
while(1)
{
/*需要被监控的代码*/
{
......
}
/*喂狗*/
IWDG_Feed();
}
}
步骤
1 取消写保护
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
#define IWDG_WriteAccess_Enable ((uint16_t)0x5555)
#define IWDG_WriteAccess_Disable ((uint16_t)0x0000)
2 设置独立看门狗的预分频系数 确定时钟
IWDG_SetPrescaler(IWDG_Prescaler_256 );
#define IWDG_Prescaler_4 ((uint8_t)0x00)
#define IWDG_Prescaler_8 ((uint8_t)0x01)
#define IWDG_Prescaler_16 ((uint8_t)0x02)
#define IWDG_Prescaler_32 ((uint8_t)0x03)
#define IWDG_Prescaler_64 ((uint8_t)0x04)
#define IWDG_Prescaler_128 ((uint8_t)0x05)
#define IWDG_Prescaler_256 ((uint8_t)0x06)
3 设置看门狗重装载值,确定溢出时间
IWDG_SetReload((u16)(SYDG_TIMEOUT * 1000 / 6.4 + 0.5));
设置12s超时,分频因子256(4x2^prer)(prer为分频值)
12000 = (256) X RLR/40
则RLR看门狗的重装载值为1875
4 使能看门狗
IWDG_Enable();
#define KR_KEY_RELOAD ((uint16_t)0xAAAA)
#define KR_KEY_ENABLE ((uint16_t)0xCCCC)
void IWDG_Enable(void)
{
IWDG->KR = KR_KEY_ENABLE;
}
5 应用程序喂狗
IWDG_RealoudCouter();
/*********************************************************************/
五 窗口看门狗
/*********************************************************************/
待补充
/*********************************************************************/
定时器(闹钟)
背景(雾)
一般情况下,不会用delay来进行LED闪烁
(空执行会占用CPU资源,模块多时跑不动)
一个时钟脉冲记一个数(增或者减)
1个 PWM高级控制定时器 用于电机控制 16位带死区控制和紧急刹车
(没懂)
3个 16位定时器 每个定时器有4个用于输入捕获/输出比较/
PWM或脉冲计数的通道和增量编码器输入
(没懂)
2个 看门狗
1个 系统时间定时器 24位自减型
/*********************************************************************/
通用定时器
3个可以同步运行的TIM2 TIM3 TIM4
每个都有16位 自动加载递加递减计数器和16位预分频器(不懂)
通过链接功能与高级控制定时器共同工作
任一都能用于产生PWM输出 ,都有独立DMA请求机制
DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通, 而不需要依赖于 CPU 的大量中断负载。 否则,CPU 需要从来源把每一片段的资料复制到暂存器, 然后把它们再次写回到新的地方
高级控制定时器TIM1 (能互补输出)
死区控制 紧急刹车
标签:IWDG,Prescaler,编程,看门狗,STM32,定时器,2021,寄存器,define 来源: https://blog.csdn.net/weixin_49436906/article/details/115444425