新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2015-1-30
- 在线时间
- 0 小时
|
5金钱
新手,以前没学过硬件,STM32是开学的第一块板子,现在正在进行,在写窗口看门狗程序时遇到一些问题!首先自己大概扫了一下程序,然后凭着感觉自己重新写了一遍程序,在写初始化函数的过程中不可避免的程序语句顺序和原码有一些差别,结果造成实验现象不正确!以下为我重写的代码!
void WWDG_Init(u8 tr,u8 wr,u8 prer)
{
RCC->APB1ENR=1<<11;//使能窗口看门狗时钟
TR=tr;
WWDG->CR&=0xff80;//0
WWDG->CR|=tr;//计数器初值1
WWDG->CFR&=0xFC00;//1
WWDG->CFR|=wr;//设置上窗口值1
WWDG->CFR|=prer<<7;//设置预分频2^prer1
MY_NVIC_Init(2,3,WWDG_IRQn,2);//设置中断分组以及优先级1
WWDG->SR=0;//清除提前唤醒中断标志位0
WWDG->CFR|=1<<9;//使能中断0
}
程序中WWDG->CFR|=prer<<7;这一句代码放在代码末尾标号为“1”行后时可以正常运行,当放在代码末尾标号为“0”的行后时,不能正常显示(此时:LED0一直点亮,正常现象是“LED1”闪烁,LED0在程序抚慰后点亮300ms。)
原文WWDG_Init( , , )函数代码如下:
void WWDG_Init(u8 tr,u8 wr,u8 fprer)
{
RCC->APB1ENR|=1<<11; //使能 wwdg 时钟
WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT.
WWDG->CFR|=fprer<<7; //PCLK1/4096 再除 2^fprer
WWDG->CFR&=0XFF80;
WWDG->CFR|=wr; //设定窗口值
WWDG->CR|=WWDG_CNT; //设定计数器值
WWDG->CR|=1<<7; //开启看门狗
MY_NVIC_Init(2,3,WWDG_IRQn,2);//抢占 2,子优先级 3,组 2
WWDG->SR=0X00; //清除提前唤醒中断标志位
WWDG->CFR|=1<<9; //使能提前唤醒中断
}
自己编写的完整程序代码如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
u8 TR;
void WWDG_Init(u8 tr,u8 wr,u8 prer)
{
RCC->APB1ENR=1<<11;//使能窗口看门狗时钟
TR=tr;
WWDG->CR&=0xff80;//0
WWDG->CR|=tr;//计数器初值1
WWDG->CFR&=0xFC00;//1
WWDG->CFR|=wr;//设置上窗口值1
WWDG->CFR|=prer<<7;//设置预分频2^prer1
MY_NVIC_Init(2,3,WWDG_IRQn,2);//设置中断分组以及优先级1
WWDG->SR=0;//清除提前唤醒中断标志位0
WWDG->CFR|=1<<9;//使能中断0
}
WWDG_IRQHandler()
{
WWDG->CR=TR;//重新装载计数器初值
WWDG->SR=0;//清除提前唤醒中断标志位
LED1=!LED1;
}
int main()
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LED_Init();
LED0=0;
delay_ms(300);
KEY_Init();
WWDG_Init(0x7F,0X5F,3);//设置计数器初值,上窗口值以及预分频值
while(1)
{
LED0=1;
}
}
声明:改程序除了WWDG_Init( , , )函数和原代码不一样,其余都一样!
|
最佳答案
查看完整内容[请看2#楼]
窗口看门狗比较诡异,不要乱改顺序.
按我们的写就可以了.
这东西你将就他就很简单,要和他较真,那就没得玩了.
|