这几天在对一款老产品做功能升级。新功能为用串口和wifi模块通讯。因为两个串口已经用于其它模块。所以只能用模拟串口。
在调试串口的过程还是比较顺利的。
接下来把整个功能移植进工程。新功能调试完成后做全面测试。这时发现PC13这个端口的上拉功能丢失。通过外接上拉100K电阻,产品功能得以恢复。以为是在增加新功能的时候软件动到了这个端口。于是把软件改回修之前的量产版本。发现问题依旧,于是得出结论:芯片坏了。接下来就是换芯片,换完一个坏一个。而且都是在执行新功能之后出现的异常。
把wifi模块拆掉,芯片不会出现问题。难道是模块有问题?因为接入的指令不多,于是用QT写了一个模拟程序替代wifi模块和产品通讯。测试后发现还是有问题。什么奇怪问题啊,百思不 得其解。
想到我的GPIO操作同时用HAL库和LL库。上网查了一下,hall和LL库不可以同时操作一种外设。问题可能在这里。改!花了一个小时对GPIO的hal库操作进行追杀。改完之后,一测,问题依旧.......我去...! 时间不早了先回家休息。
第二天上班过来拿了一个板子通电测试了一下。发现上拉功能恢复了,操作了几下新功能后问题又来了。看来硬件没有损坏。继续查软件吧。同时得出一个结论,放电完全芯片可以复元。想到PC13和RTC相关,并且系统断电的时候RTC电源还有电容续电。于是让问题重现,切断系统电源,并用镊子把RTC电源处的电容放电。神奇啊,芯片恢复了。所以后面就不用换芯片了。
因为拆掉wifi模块不会有问题,那一定是哪个指令处理出了问题。于是对模拟软件做修改。一个个指令做屏蔽处理。到屏蔽时间同步的时候异常没有出现了(早该想到是这地方了)。唯有这里有硬件操作的地方。在产品的软件里把RTC写操作屏蔽,问题解决了。
RTC这里是怎么操作的呢?x结果怎么这么骚气呢?收下是RTC修改时间的操作。
RTC_DateStruct.Year = time.year - BEGYEAR;
RTC_DateStruct.Month = time.month + 1;
RTC_DateStruct.Day = time.day + 1;
RTC_TimeStruct.Hours = time.hour;
RTC_TimeStruct.Minutes = time.minutes;
RTC_TimeStruct.Seconds = time.seconds;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
程序是抄初始化的应该没有问题才是呀。因为近期调试过LL库版本的配置,于是果断把RTC改为LL库。问题就解决了。
我相信Hal库没有问题,只是我的应用有问题,但是问题在哪里呢?没有深究,因为我已经决定以后只用LL库了。