OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4242|回复: 2

WWDG初始化函数顺序问题!请原子哥解答疑惑!感谢!

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-1-30
在线时间
0 小时
发表于 2015-1-30 22:08:11 | 显示全部楼层 |阅读模式
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#楼]

窗口看门狗比较诡异,不要乱改顺序. 按我们的写就可以了. 这东西你将就他就很简单,要和他较真,那就没得玩了.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-30 22:08:12 | 显示全部楼层
窗口看门狗比较诡异,不要乱改顺序.
按我们的写就可以了.
这东西你将就他就很简单,要和他较真,那就没得玩了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-1-30
在线时间
0 小时
 楼主| 发表于 2015-1-30 22:51:25 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
好吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表