定义一个宏 _WWDG 它银运的值是1,用括号(1)这是一个很好的习惯,以免发生意想不到的错误;
也就是说定义的_WWDG这个宏 在锋橘梁后面程序中只要出现 _WWDG 那么就会被替换成(1)
宏定义是C中定义一个符号常量的方法,并且注意:在定义宏的时候,对伍渗变量以及结果都加上(),这样子可以避免一些意想不到的错误的发生。
(1)与独立看门狗的区别?
窗口看门狗(WWDG )其喂狗时间是一个有上下限的范围(窗口),计数器的下限是固定的(0x40),可以通过设定相关寄存器,设指弯蚂定其上限时间(上限计数值)。喂狗的时间不能过早,也不能过晚。你喂得过早或者过晚,都会复位的。
(2)有了独立看门狗来检测程序运行是否正常,为何还需要窗口看门狗?
对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但是,这有一个隐患:有可能程序跑乱了,但又跑回到正常的地闹滚方,或者,跑乱了的程序正好执行了刷新看门狗的 *** 作。这样的情况下,一般的看门狗就检测不出来了。
如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗,也不会滞后刷新看门狗,这样,可以检测出程序没有按照正常的路径运行而非正常地跳过了某些程序段的情况。
(1)控制寄存器 WWDG_CR
32位寄存器,低8位有效。这8位中,低7位T[6:0]用来存储看门狗的计数器值,随时更新。当该计数器的值从0x40变为0x3F的时候,将产生复位;除了这低7位,还有第8位(位7,叫做WDGA位),是看门狗的激活位。该位由软件置1,用来启动看门狗,并且,一旦启动以后,该位会一直保持为1,在硬件复位以后才能清零。
(2)配置寄存器 WWDG_CFR
32位寄存器,我们用到10位。
<1>低7位W[6:0],是7位窗口值。这7位就是窗口看门狗唯埋的上窗口。
<2>位9(第10位),叫做EWI,是提前唤醒中断位。如果我们把这位设置为1,那么,只要递减计数器的计数值下降到0x40,就会产生一个中断。之所以叫做唤醒中断位,就是因为,当计数器的值减到0x40,如果不产生中断,下一个值就是0x3F,此时就会复位;而这里产生一个中断,那么我们就可以在中断服务函数里面及时地喂狗,来唤醒它,避免复位。
注意:这里在进入中断后,必须在不大于一个窗口看门狗计数周期的时间内重新写WWDG_CR寄存器去喂狗,否则,将会复位。
<3>位8和位7(叫做WDGTB[1:0]),叫做定时器时基(Time base),这两位用来修改计数时钟的分频系数。
(3)状态寄存器 WWDG_SR
该寄存器用来记录当前是否有提前唤醒的标志。该寄存器只有最低位(位0)一位有效。当计数值达到0x40时,该位由硬件置1.它必须通过软件写0来清除,软件对它写1是无效的。注意:它与是否使能中断没有关系,即使中断没有被使能,在计数器的值达到0x40的时候,该位也会被硬件置1。
(1)使能WWDG时钟
WWDG与IWDG不同,独立看门狗有自己独立的32kHz时钟,用的是LSI,而窗口看门狗用的是PCLK1的时钟,挂载在总线APB1上,所以,使用之前,需要先使能。
(2)设置分频系数与上窗口值
设置看门狗的分频系数(CFR寄存器,位WDGTB[1:0])的函数是:
设置看门狗的上窗口值(CFR寄存器,位W[6:0])的函数是:
(3)开启提前唤醒中断,并分组
开启WWDG中断的函数为:
开启WWDG中断后,进行中断优先级配置,调用函数NVIC_Init()即可。
(4)使能看门狗
(5)编写中断服务函数
编写中断服务函数WWDG_IRQHandler(),在里面调用函数WWDG_SetCounter(),去喂狗。但要注意,喂狗要迅速,否则当WWDG计数到0x3F的时候,就会引起复位了。还有一个值得注意的地方就是,在中断服务函数里面,要将状态寄存器的EWIF位清空。
Stm32共有11个定时器:
1.两个高级定时器:TIM1、TIM8-------------------------APB2
2.四个通用定时器:TIM2~TIM5-------------------------APB1
3.两个基本定时器:TIM6、TIM7-------------------------APB1
4.两个看门狗
5.一个系统嘀嗒定时器(SysTick)
主程序main.c
/**说明:
*PA0:KEY1PA1:KEY2
*PA2:LED1PA3:LED2
*PA9:USART1_TXPA10:USART1_RX
*/
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_exti.h"
#include "system_stm32f10x.h"
#include "misc.h"
void RCC_Configuration(void)
void GPIO_Configuration(void)
void TIM3_Configuration(void)
void NVIC_Configuration(void)
int main()
{
SystemInit()
RCC_Configuration()
GPIO_Configuration()
TIM3_Configuration()
NVIC_Configuration()
薯并
while(1)
}
void RCC_Configuration(void)
{ 早碧
////USART2和USART3都在在APB1上而USART1是在APB2上的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE)
}
void GPIO_Configuration(void) 陆手举
{
GPIO_InitTypeDef GPIO_InitStructure
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP
GPIO_Init(GPIOA, &GPIO_InitStructure)
}
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure
TIM_ClearITPendingBit(TIM3, TIM_IT_Update)
TIM_TimeBaseStructure.TIM_Period = 2000//频率:72MHz 72000000/36000=2000
TIM_TimeBaseStructure.TIM_Prescaler = 35999//36000-1=35999
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure)
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE )
TIM_Cmd(TIM3,ENABLE)
}
void NVIC_Configuration(void)//配置中断优先级
{
NVIC_InitTypeDef NVIC_InitStructure
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1)
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE
NVIC_Init(&NVIC_InitStructure)
}
中断函数stm32f10x_it.c
#include "..\include\stm32f10x.h"
#include "..\include\stm32f10x_it.h"
#include "..\include\stm32f10x_gpio.h"
#include "..\include\stm32f10x_tim.h"
void TIM3_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update)
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==Bit_RESET)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2)
}else{
GPIO_ResetBits(GPIOA,GPIO_Pin_2)
}
}
中断函数声明头文件stm32f10x_it.h
#ifndef __STM32F10x_IT_H
#define __STM32F10x_IT_H
/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void NMIException(void)
void HardFaultException(void)
void MemManageException(void)
void BusFaultException(void)
void UsageFaultException(void)
void DebugMonitor(void)
void SVCHandler(void)
void PendSVC(void)
void SysTickHandler(void)
void WWDG_IRQHandler(void)
void PVD_IRQHandler(void)
void TAMPER_IRQHandler(void)
void RTC_IRQHandler(void)
void FLASH_IRQHandler(void)
void RCC_IRQHandler(void)
void EXTI0_IRQHandler(void)
void EXTI1_IRQHandler(void)
void EXTI2_IRQHandler(void)
void EXTI3_IRQHandler(void)
void EXTI4_IRQHandler(void)
void DMA1_Channel1_IRQHandler(void)
void DMA1_Channel2_IRQHandler(void)
void DMA1_Channel3_IRQHandler(void)
void DMA1_Channel4_IRQHandler(void)
void DMA1_Channel5_IRQHandler(void)
void DMA1_Channel6_IRQHandler(void)
void DMA1_Channel7_IRQHandler(void)
void ADC1_2_IRQHandler(void)
void USB_HP_CAN_TX_IRQHandler(void)
void USB_LP_CAN_RX0_IRQHandler(void)
void CAN_RX1_IRQHandler(void)
void CAN_SCE_IRQHandler(void)
void EXTI9_5_IRQHandler(void)
void TIM1_BRK_IRQHandler(void)
void TIM1_UP_IRQHandler(void)
void TIM1_TRG_COM_IRQHandler(void)
void TIM1_CC_IRQHandler(void)
void TIM2_IRQHandler(void)
void TIM3_IRQHandler(void)
void TIM4_IRQHandler(void)
void I2C1_EV_IRQHandler(void)
void I2C1_ER_IRQHandler(void)
void I2C2_EV_IRQHandler(void)
void I2C2_ER_IRQHandler(void)
void SPI1_IRQHandler(void)
void SPI2_IRQHandler(void)
void USART1_IRQHandler(void)
void USART2_IRQHandler(void)
void USART3_IRQHandler(void)
void EXTI15_10_IRQHandler(void)
void RTCAlarm_IRQHandler(void)
void USBWakeUp_IRQHandler(void)
void TIM8_BRK_IRQHandler(void)
void TIM8_UP_IRQHandler(void)
void TIM8_TRG_COM_IRQHandler(void)
void TIM8_CC_IRQHandler(void)
void ADC3_IRQHandler(void)
void FSMC_IRQHandler(void)
void SDIO_IRQHandler(void)
void TIM5_IRQHandler(void)
void SPI3_IRQHandler(void)
void UART4_IRQHandler(void)
void UART5_IRQHandler(void)
void TIM6_IRQHandler(void)
void TIM7_IRQHandler(void)
void DMA2_Channel1_IRQHandler(void)
void DMA2_Channel2_IRQHandler(void)
void DMA2_Channel3_IRQHandler(void)
void DMA2_Channel4_5_IRQHandler(void)
#endif /* __STM32F10x_IT_H */
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)