近期,有客户向我们定制了一款枪支资产监控设备,可以对资产进行定位跟踪监控,便于资产的管理。我们在对这款资产监控设备进行研发测试时,经常会遇到设备睡眠后唤醒,服务器数据下发接收错误的问题,笔者在进行各种方法尝试解决之后,发现了问题出现的原因:是设备从睡眠后唤醒,时钟未同步导致的。相信很多产品研发人员都会遇到相似的问题。下面笔者将解决方法记录在下面。
设备睡眠后唤醒,导致服务器数据下发接收错误解决方法
//系统时钟配置
void RCCConfig(void)
{
uint32_t runtime = 0;
//关闭外部高、低速时钟
RCC_HSEConfig(RCC_HSE_OFF);
RCC_LSEConfig(RCC_LSE_OFF);
//启动内部
RCC_HSICmd(ENABLE);
runtime=0;
while((RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET) && (runtime < 500))
{
SoftDelay();
runtime++;
}
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);//8M时钟
RCC_PLLCmd(ENABLE);
runtime=0;
while((RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)&& (runtime < 500))
{
SoftDelay();
runtime++;
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
RCC_LSICmd(ENABLE);
runtime=0;
while((RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) && (runtime < 500))
{
SoftDelay();
runtime++;
}
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
}
时钟配置函数
由于我们主板上面未使用外部高速晶振,因此配置采用门内部高速晶振,在唤醒时,进行内部晶振配置,当内部晶振刚唤醒时,时钟不准,因此默认采用了8M时钟进行工作。
因此在后续睡眠后,把时钟配置成8M,采用内部晶振2分频后在进行2倍频,达到8M,和系统刚睡眠唤醒时,时钟一样,避免了数据错误。