Arm实验看门狗

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM实验
姓名唐珊珊学号2011412614
实验目的:掌握独立看门狗的工作原理和使用方法。

实验原理:
调用固件库设置和初始化独立看门狗,通过Led4的状态指示系统运行,同时按下按键SW1不断重置看门狗寄存器(俗称喂狗),当停止按键后,,则MCU会在看门狗超时的作用下系统重启。

实验步骤:
要实现本实验功能设计,需要进行必要的设置,其步骤如下:1)设置Led驱动管教为推挽输出,Sw1管脚为浮空输入。

2)Led4熄灭一下,以表示刚刚复位,
3)调用IWDG_writeAccessCmd函数向IWDG_KR写入0X5555。

通过这步,我们取消看门狗寄存器的写保护。

4)设置看门狗的分频系数,本例中为32。

在固件库中,可以调用IWDG_SetPrescaler函数实现。

5)设置看门狗的重装载的值,本例中为625.在固件库中,可以调用IWDG_SetReload函数实现。

6)调用IWDG_Enable函数向IWDG_KR写入0xcccc。

通过这句,来启动STM32的看门狗。

7)检测按键Sw1,如果按下则调用IWDG_ReloadCounter函数使STM32重新加载IWDG_RlR的值到看门狗计数器里面。

也可以用该命令来喂狗。

程序为:
独立看门狗
#include "stm32f10x.h"
void GPIO_Config(void);
void delay(void);
int main(void)
{
GPIO_Config();
GPIO_SetBits(GPIOC,GPIO_Pin_9);
delay();
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_32);
IWDG_SetReload(625);
IWDG_Enable();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3)==0)
IWDG_ReloadCounter();
}
}
void delay(void)
{
uint32_t i;
for(i=0;i<6000000;i++)
{}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENA BLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
中断函数
uint32_t led=1;
void WWDG_IRQHandler(void)
{
uint8_t cr;
cr=WWDG->CR;
cr&=0x7f;
if(cr<0x50)
{
WWDG_SetCounter(0x70);
WWDG_ClearFlag();
led=~led;
if(led==0)
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
else
GPIO_SetBits(GPIOC,GPIO_Pin_9);
}
}
#include "stm32f10x.h"
void GPIO_Config(void);
void delay(void);
//uint32_t led=0;
int main(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_Config();
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
delay();
GPIO_SetBits(GPIOC,GPIO_Pin_9);
delay();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_EnableIT();
WWDG_SetWindowValue(0x50);
WWDG_Enable(0x70);
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x07; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x07;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
while(1)
{;}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void delay(void)
{
uint32_t i;
for(i=0;i<6000000;i++)
{}
}
中断函数为
void WWDG_IRQHandler(void)
{
uint8_t cr;
cr=WWDG->CR;
cr&=0x7f;
if(cr<0x50)
{
WWDG_SetCounter(0x70);
WWDG_ClearFlag();
led=~led;
if(led==0)
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
else
GPIO_SetBits(GPIOC,GPIO_Pin_9);
}
}
一秒定时看门狗
#include "stm32f10x.h"
void GPIO_Config(void);
void NVIC_Config(void);
void TIM1_Config(void);
void EXTI_Config(void);
void IWDG_Config(void);
int main()
{
GPIO_Config();
NVIC_Config();
TIM1_Config();
EXTI_Config();
IWDG_Config();
while(1)
{
}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENA BLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x07;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x07;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM1_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
TIM_TimeBaseInitStructure.TIM_Period=(10000-1);
TIM_TimeBaseInitStructure.TIM_Prescaler=(7200-1);
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM1,ENABLE);
}
void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void IWDG_Config(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_32);
IWDG_SetReload(4000);
IWDG_Enable();
}
中端函数为
int led=1;
void TIM1_UP_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)
{
IWDG_ReloadCounter();
led=~led;
if(led==1)
GPIO_SetBits(GPIOC,GPIO_Pin_9);
else
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
}
}
void EXTI3_IRQHandler(void)
{
/* 检测EXTI3是否有效*/
if(EXTI_GetITStatus(EXTI_Line3)!= RESET)
{
while(1)
{
/*可随便加入现象,便于观察*/
GPIO_ResetBits(GPIOC,GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6);
/* 清除EXTI3的悬起标志位*/
EXTI_ClearITPendingBit(EXTI_Line3);
}
}
}。

相关文档
最新文档