嵌入式系统中时钟系统的设置及分析甚是重要,定时器时基、通信波特率、外设时钟、GPIO时钟,都需要清楚的知道具体的时钟频率,才能方便的设计各个功能模块驱动程序。有时项目比较紧,仔细查看芯片数据手册,详细分析系统时钟费时费力。所以实时显示系统时钟频率,就显得有点作用(同系列芯片操作类似,STM32也有类似操作),另外芯片程序重启原因,有时候对系统程序分析也绅士有用,也一并附在后面,嵌入式产品程序设计可以在需要的地方直接调用以下两个函数即可。
void displayRcc(void)
{
RCC_ClocksType Clks;
RCC_GetClocksFreqValue(&Clks);
printf("SYSCLK: %d\n", Clks.SysclkFreq);
printf("HCLK : %d\n", Clks.HclkFreq);
printf("PCLK1 : %d\n", Clks.Pclk1Freq);
printf("PCLK2 : %d\n", Clks.Pclk2Freq);
printf("ADCPL : %d\n", Clks.AdcPllClkFreq);
printf("ADCHL : %d\n", Clks.AdcHclkFreq);
}
void resetReason(void) //获取重启原因
{
// #define RCC_FLAG_RAMRST ((uint8_t)0x77) //
// #define RCC_FLAG_MMURST ((uint8_t)0x79) //MMU保护复位
// #define RCC_FLAG_PINRST ((uint8_t)0x7A) //引脚复位
// #define RCC_FLAG_PORRST ((uint8_t)0x7B) //上电复位
// #define RCC_FLAG_SFTRST ((uint8_t)0x7C) //软件复位
// #define RCC_FLAG_IWDGRST ((uint8_t)0x7D) //独立看门狗服务
// #define RCC_FLAG_WWDGRST ((uint8_t)0x7E) //窗口看门狗服务
// #define RCC_FLAG_LPWRRST ((uint8_t)0x7F) //低电压复位
if(RCC_GetFlagStatus(RCC_FLAG_RAMRST) != RESET)
{
printf("RESET:RAMRST.\r\n"); //
Device.resetRs = RCC_FLAG_RAMRST;
}
else if(RCC_GetFlagStatus(RCC_FLAG_MMURST) != RESET)
{
printf("RESET:MMURST.\r\n"); //
Device.resetRs = RCC_FLAG_MMURST;
}
else if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
{
printf("RESET:PORRST.\r\n"); //
Device.resetRs = RCC_FLAG_PORRST;
}
else if(RCC_GetFlagStatus(RCC_FLAG_SFTRST) != RESET)
{
printf("RESET:SFTRST.\r\n"); //
Device.resetRs = RCC_FLAG_SFTRST;
}
else if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
{
printf("RESET:IWDGRST.\r\n"); //
Device.resetRs = RCC_FLAG_IWDGRST;
}
else if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET)
{
printf("RESET:WWDGRST.\r\n"); //
Device.resetRs = RCC_FLAG_WWDGRST;
}
else if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST) != RESET)
{
printf("RESET:LPWRRST.\r\n"); //
Device.resetRs = RCC_FLAG_LPWRRST;
}
else if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
{
printf("RESET:PINRST.\r\n"); //
Device.resetRs = RCC_FLAG_PINRST;
}
else
{
printf("RESET:NO reset.\r\n"); //
// Device.resetRs = 0;
}
RCC_ClrFlag();
}