新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2019-8-4
- 在线时间
- 1 小时
|
1金钱
本帖最后由 未知的元二月 于 2019-8-4 00:28 编辑
这是主函数
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,115200); //串口初始化为115200
delay_init(72); //延时初始化
LED_Init(); //初始化与 LED 连接的硬件接口
LED0=0; //点亮 DS0
delay_ms(1000); //延时 1000ms,让人可以看到 DS0 灭的状态
WWDG_Init(0X7F,0X5F,3); //计数器值为7f,窗口寄存器为5f,分频数为8
while(1)
{
LED0=1; //灭DS1
}
}
这是wdg的c文件函数
//保存 WWDG 计数器的设置值,默认为最大.
u8 WWDG_CNT=0x7f;
//初始化窗口看门狗
//tr :T[6:0],计数器值
//wr :W[6:0],窗口值
//fprer:分频系数(WDGTB),仅最低 2 位有效
//Fwwdg=PCLK1/(4096*2^fprer).
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; //使能提前唤醒中断
}
//重设置 WWDG 计数器的值
void WWDG_Set_Counter(u8 cnt)
{
WWDG->CR =(cnt&0x7F);//重设置 7 位计数器
}
//窗口看门狗中断服务程序
void WWDG_IRQHandler(void)
{
WWDG_Set_Counter(WWDG_CNT);//重设窗口看门狗的值,即喂狗
WWDG->SR=0X00;//清除提前唤醒中断标志位
LED1=!LED1;
}
|
最佳答案
查看完整内容[请看2#楼]
Fpclk=36M,那么根据窗口看门狗的超时公式:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1
Twwdg:WWDG超时时间(ms)
Fpclk1:APB1 的时钟频率(Khz)
WDGTB: WWDG 的预分频系数
T[5:0]:WWDG->CR低6位
此时Twwdg=(4096×8×64) / 36000(Khz) = 58.254ms
闪烁一次时间再乘以2,1000ms差不多闪烁8次
|