STM32笔记之十二:时钟不息作业不止,systic时钟运用
a) 意图:运用体系时钟来进行两项试验——周期履行代码与准确守时推迟。
b) 初始化函数界说:
void SysTick_Configuration(void);
c) 初始化函数调用:
SysTick_Configuration();
d) 初始化函数:
void SysTick_Configuration(void)
{
}
e) 在NVIC的初始化函数里边增加以下代码翻开相关中止:
NVIC_SystemHandlerPriorityCon
f) 在stm32f10x_it.c文件中找到void SysTickHandler 函数
void SysTickHandler(void)
{
履行代码
}
g) 简略运用:准确推迟函数,由于systic中止往往被用来履行周期循环代码,所以一些例程中运用其中止的发动和制止来编写的准确延时函数实际上不实用,我自己编写了准确计时函数反而代码更精简,思路更简略。思路是调用后,变量清零,然后运用时钟来的曾变量,不断比较变量与推迟的数值,持平则退出函数。代码和进程如下:
i. 界说通用变量:u16 Tic_Val=0; //变量用于准确计时
ii. 在stm32f10x_it.c文件中相应界说:
extern u16 Tic_Val;//在本文件引证MAIN.c界说的准确计时变量
iii. 界说函数称号:void Tic_Delay(u16 Tic_Count);//准确推迟函数
iv. 准确延时函数:
void Tic_Delay(u16 Tic_Count)
{ Tic_Val=0;
}
v. 在stm32f10x_it.c文件中void SysTickHandler 函数里边增加
vi. 调用代码:Tic_Delay(10); //准确延时
vii. 疑问:假如去掉计时行那个没用的printf(“”);函数将停止作业,这个现象很古怪
C言语功底问题。是的,那个“注意事项”最终的疑问的原因便是这个
Tic_Val应该改为vu16
while(Tic_Val != Tic_Count){printf(“”);}//计时
就能够改为:
while(Tic_Val != Tic_Count);
STM32笔记之十三:恶搞,两只看门狗
a) 意图:
了解两种看门狗(我叫它:体系运转毛病勘探器和独立体系毛病勘探器,新手往往被这个并不形象的象形称号搞糊涂)之间的差异和根本用法。
b) 相同:
都是用来勘探体系毛病,经过编写代码守时发送毛病清零信号(高手们都管这个代码叫做“喂狗”),告知它体系运转正常。一旦体系毛病,程序清零代码(“喂狗”)无法履行,其计数器就会计数不止,直到记到零并产生毛病中止(狗饿了开端叫唤),操控CPU重启整个体系(不行啦,开端咬人了,快跑……)。
c) 差异:
独立看门狗Iwdg——我的了解是独立于体系之外,由于有独立时钟,所以不受体系影响的体系毛病勘探器。(这条狗是借来的,见谁偷闲它都咬!)首要用于监督硬件过错。
窗口看门狗wwdg——我的了解是体系内部的毛病勘探器,时钟与体系相同。假如体系时钟不走了,这个狗也就失掉效果了。(这条狗是老板娘养的,老板不干活儿他不论!)首要用于监督软件过错。
d) 初始化函数界说:鉴于两只狗效果差不多,运用进程也差不多初始化函数栓一起了,用的时分依据状况删减。
void WDG_Configuration(void);
e) 初始化函数调用:
WDG_Configuration();
f) 初始化函数
void WDG_Configuration()
{
//软件看门狗初始化
// (PCLK1/4096)/8= 244 Hz (~4 ms)
WWDG_SetWindowValue(65);
// WWDG timeout = ~4 ms * 64 = 262 ms
WWDG_ClearFlag();
//独立看门狗初始化
}
g) RCC初始化:只要软件看门狗需求时钟初始化,独立看门狗有自己的时钟不需求可是需求systic作业相关设置。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
h) 独立看门狗运用systic的中止来喂狗,所以增加systic的中止翻开代码就行了。软件看门狗需求在NVIC翻开中止增加如下代码:
i) 中止程序,软件看门狗在自己的中止中喂狗,独立看门狗需求运用systic的守时中止来喂狗。以下两个程序都在stm32f10x_it.c文件中。
void WWDG_IRQHandler(void)
{
WWDG_ClearFlag();
}
void SysTickHandler(void)
{
}
j) 注意事项:
i. 有狗往常没工作能够不睬,可是千万别忘了喂它,不然死都不知道怎样死的!
ii. 初始化程序的调用必定要在systic的初始化之后。
iii. 独立看门狗需求systic中止来喂,可是systic做其他用途不能只做这件事,所以我写了如下几句代码,能够不影响systic的其他运用,其他systic周期代码也可参阅:
第一步:在stm32f10x_it.c中界说变量
int Tic_IWDG;
第二步:将SysTickHandler中喂狗代码改为下面:
Tic_IWDG++;
if(Tic_IWDG>=100)
{
}