
出错处理 检测过程如果出现错误,程序会进入FailSafePOR,该函数的目的就是提供一个统一的处理出口。 问题汇集 1. 编译报错:.\Boot_Flash_ClassB.sct(40): error: L6236E: No section matches selector - no section to be FIRST/LAST. 经检查发现是sct文件中的startup_xxxx.o和实际工程中的startup_xxx.s文件名称不一致,因为移植时直接将例程中的sct文件拷贝过来了。修改后解决。 2. 编译报错: STM32F207Nucleo-ClassB\STM32F207Nucleo-ClassB.axf: Error: L6218E: Undefined symbol STL_InitClock_Xcross_Measurement (referred from stm32fxx_stlclockstart.o). STM32F207Nucleo-ClassB\STM32F207Nucleo-ClassB.axf: Error: L6218E: Undefined symbol StartUpClock_Config (referred from stm32fxx_stlstartup.o). 在main.c和stm32f2xx_it.c中添加对应的函数,变量定义以及include头文件,参考例程。 3. 编译时计算CRC报错: Extracting CRC address from MAP file FINDSTR: Cannot open STM322xG_EVAL\STM322xG_EVAL.map 这是因为例程中的crc_gen_keil.bat中默认的HEX文件名称和路径和新项目不一致,按新项目进行修改就可以解决。 ![]() 4. 调试时Flash CRC检测通不过 检查是否在KEIL的options->Debug,和Options->Utilities中添加crc_load.ini,在调试和下载时使用写入了正确CRC值的HEX文件。如果你是直接拷贝例程中的crc_load.ini文件的话,还要检查一下里面的内容,hex文件的名字和路径和实际工程的是否一致。 5. RAM测试之后进hardfault RAM检测是破坏性检测,RAM里的数据都会丢掉。检查一下程序里是否直接用了RAM里的数据。另外stm32fxx_STLtranspRam.c的优化等级要降到0。 6. 调试时去掉部分模块的检测,要特别注意flowcontrol的检测。 control_flow_check_point()调用会出错,建议将control_flow_check_point()函数先屏蔽掉。 7. 使能STL_VERBOSE_POR后,第一次上电启动总是失败。经检查是串口输出出错。在STL_StartUp函数中执行USART_Configuration时,因为huart->gState不等于 HAL_UART_STATE_RESET,所以HAL_UART_MspInit函数没有执行,串口并没有成功初始化。解决方法:在HAL_UART_Init之前调用__HAL_UART_RESET_HANDLE_STATE(&huart3),将huart->gState状态复位成 HAL_UART_STATE_RESET 8. 运行时的时钟检测总是失败。检查一下当前的系统时钟配置系统,以及给TIM5的APB1 时钟的配置是否和例程中的一样,如果不一样的话,HSE_LimitHigh/HSE_LimitLow, HSI_LimitHigh/HSI_LimitLow的公式就要修改。 9. 添加了运行时检测的代码后,程序总是复位。这种情况建议检查一下看门狗“喂狗”时间设置得是否合理。可以先关闭看门狗,以确认是否是其引起的问题。 |
问题如下:
1:程序上电进入 STL_StartUp();STL_StartUpCPUTest() 可以通过,然后继续 STL_WDGSelfTest();检测,执行第一条 if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) printf("Pin reset \r\n");就进入HardFault_Handler故障了。然后我把STL_StartUpCPUTest() 检测屏蔽掉之后, STL_WDGSelfTest()检测就能正常通过
2:在flash 的crc校验是crc_result和REF_CRC32判断,每次更新代码编译后所计算的crc_result值都是不一样的,但是REF_CRC32一直都是固定的值,就是在stm32f103xe.s 定义的__Check_Sum值,难道每次更新代码编译都需要修改这个值吗?这里不知道他的机制是怎样的,__Check_Sum是如何设置的呢?
3:在flash检测完以后,后面的RAM检测,时钟检测,程序控制流检测等全部检测都无法通过。时钟检测时,芯片会直接挂死,不知道为何?
4:GotoCompilerStartUp函数 中的__main()和__main 有何区别,我在使用__main()程序执行结果是挂死,但是使用__main是可以正常跳转到程序的主函数main的