开发过程遇到2个奇怪的问题,记录一下。
问题1. 读区spi Flash数据读取后,校验数据读取不正确,底层驱动函数,把读取函数的超时时间由1000修改为2000就解决了。
//源码来自正点原子的spi.c
//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
HAL_SPI_TransmitReceive(&SPI1_Handler,&TxData,&Rxdata,1, 2000); //此处超时时间由1000修改为2000
return Rxdata;
}
//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
HAL_SPI_TransmitReceive(&SPI1_Handler,&TxData,&Rxdata,1, 2000); //此处超时时间由1000修改为2000
return Rxdata;
}
问题2. Flash的延时和CPU的频率不匹配,导致程序运行随机异常,可以通过者降低主频或增加flash的延时周期解决
RCC_OscInitStruct.PLL.PLLN = 160;//降低主频 192修改为160
或者
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5)
(由FLASH_LATENCY_4增加1个周期延时为FLASH_LATENCY_5)
出现这种随机问题的时间不定,通过cm_backtrace模块打印报出的异常比较随机,有以下几种:
Bus fault is caused by precise data access violation
fault is caused by indicates that an unaligned access fault has taken place
Bus fault is caused by imprecise data access violation
Bus fault is caused by instruction access violation