打印
[其他ST产品]

stm32战舰之路

[复制链接]
楼主: hehhehee
手机看帖
扫描二维码
随时随地手机跟帖
41
hehhehee|  楼主 | 2021-12-30 14:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
通过上面 4 个步骤,我们就可以启动 STM32 的看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。

使用特权

评论回复
42
hehhehee|  楼主 | 2021-12-30 14:42 | 只看该作者
窗口看门狗
概念:窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

使用特权

评论回复
43
hehhehee|  楼主 | 2021-12-30 14:43 | 只看该作者
自己理解:对时间要求比较精确的检测机制就启用窗口看门狗,了解窗口看门狗产生复位的条件,那么我们要做的就是提前阻止该条件的成立。条件有两个:1、当递减计数器的值小于0x40, (若看门狗被启动)则产生复位;2、当递减计数器在窗口外被重新装载, (若看门狗被启动)则产生复位。我们提前做的动作就是:启动看门狗并且允许中断,当递减计数器等于0x40时,产生早期唤醒中断(EWI),在中断里进行刷新操作 ,即喂狗动作,它可以被用于重装载计数器,就可以避免WWDG复位。

使用特权

评论回复
44
hehhehee|  楼主 | 2021-12-30 14:49 | 只看该作者
窗口看门狗原理分析:如下面的图159所示,我们只要在t1~t2之间进行刷新重装载值(即喂狗动作),所谓的在窗口刷新就是指在t1~t2这段时间内进行重装载动作,就可以避免产生系统复位。窗口看门狗超时时间就是指从T[6:0]计数器递减到t1~t2对应的纵坐标值所用的时间,因为T[6:0]计数器最小值只能跟下窗口一样为0x40,最大值为0x7F(7位二进制位都为1时),所以窗口溢出时间也是有范围的。我们只要在溢出时间到来的时候,进行喂狗刷新就可以避免产生复位了。

使用特权

评论回复
45
hehhehee|  楼主 | 2021-12-30 14:50 | 只看该作者
举个例子验证下自己理解的看门狗原理中溢出时间:

根据溢出时间公式(stm32中文参考手册):Tout = 计数器步数 /时钟频率 = (T[5:0]+ 1)/[(Pclk1/4096)/2^WDGTB], 当计数器值取最小时,分频系数WDTB[1:0]取3,时钟频率取36MHz,代入公式:Tout = 1*4096*2^3/36(微秒:us) ==910us;最大值溢出时间Tout(最大允许刷新的时间,超过这个时间就会复位)= 64*4096*8/36=58254us=58.25ms。算出的结果和图159中文参考手册给出的例子的结果是相符的。

使用特权

评论回复
46
hehhehee|  楼主 | 2021-12-30 14:53 | 只看该作者
窗口看门狗框图:

使用特权

评论回复
47
hehhehee|  楼主 | 2021-12-30 14:54 | 只看该作者

使用特权

评论回复
48
hehhehee|  楼主 | 2021-12-30 14:55 | 只看该作者
1、使能窗口看门狗时钟 在APB1总线上。

      RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

使用特权

评论回复
49
hehhehee|  楼主 | 2021-12-30 14:56 | 只看该作者
2、设置预分频系数和上窗口值

      void WWDG_SetWindowValue(uint8_t WindowValue);

      void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

使用特权

评论回复
50
hehhehee|  楼主 | 2021-12-30 14:57 | 只看该作者
3、开启看门狗中断并分组      

      分组:NVIC_Init(),开启中断:WWDG_EnableIT();

使用特权

评论回复
51
hehhehee|  楼主 | 2021-12-30 14:57 | 只看该作者
4、设置计数器初始值和使能看门狗

    void WWDG_Enable(uint8_t Counter);
    该函数既设置了计数器初始值,同时使能了窗口看门狗。

使用特权

评论回复
52
hehhehee|  楼主 | 2021-12-30 14:58 | 只看该作者
5、编写中断服务函数

使用特权

评论回复
53
hehhehee|  楼主 | 2021-12-30 14:59 | 只看该作者
十、定时器中断学习之通用定时器TM3
定时器的知识点非常多,通过stm32参考手册的篇幅就可以知道它是有多重要了,很难一时半会搞通,只能逐步积累。

与前面套路一样,都是先要配置,才能使用定时器来控制我们想要的操作。

使用特权

评论回复
54
hehhehee|  楼主 | 2021-12-30 16:02 | 只看该作者
配置步骤:

1、使能定时器时钟  ---->TIM3挂载在APB1总线上

     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

使用特权

评论回复
55
hehhehee|  楼主 | 2021-12-30 16:03 | 只看该作者
2、初始化定时器参数,设置自动重装值,分频系数,计数方向等设置

     TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

使用特权

评论回复
56
hehhehee|  楼主 | 2021-12-30 16:04 | 只看该作者
3、设置是怎么样的中断:设置TIM3_DIER允许更新中断

     TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

     例TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

使用特权

评论回复
57
hehhehee|  楼主 | 2021-12-30 16:04 | 只看该作者
4、中断分组优先级设置

     NVIC_INIT()

使用特权

评论回复
58
hehhehee|  楼主 | 2021-12-30 16:05 | 只看该作者
5、开启定时器,即使能定时器

     TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

使用特权

评论回复
59
hehhehee|  楼主 | 2021-12-30 16:14 | 只看该作者
6、中断服务函数编写

使用特权

评论回复
60
hehhehee|  楼主 | 2021-12-30 16:17 | 只看该作者
判断中断是否发生:

     ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t)

清除中断标志位

    TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

计算中断时间公式: Tout= ((arr+1)*(psc+1))/Tclk;

其中:Tclk: TIM3 的输入时钟频率(单位为 Mhz)。Tout: TIM3 溢出时间(单位为 us)。
STM3F1 的通用 TIMx (TIM2、 TIM3、 TIM4 和 TIM5)定时器功能包括:
1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~
65535 之间的任意数值。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则