你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

X-Cube-ClassB代码 的移植(伍)

[复制链接]
eefishing 发布时间:2020-1-19 20:17
出错处理



检测过程如果出现错误,程序会进入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文件名称和路径和新项目不一致,按新项目进行修改就可以解决。
1.jpg

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. 添加了运行时检测的代码后,程序总是复位。这种情况建议检查一下看门狗“喂狗”时间设置得是否合理。可以先关闭看门狗,以确认是否是其引起的问题。
收藏 评论2 发布时间:2020-1-19 20:17

举报

2个回答
xsqiuhui 回答时间:2020-3-17 15:55:37
你好 ,我们在移植官方的classb库的时候遇到了许多棘手的问题,无法解决,望请您帮忙支持和分析一下,谢谢!!
        问题如下:
            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的
heiyewuyue 回答时间:2020-6-8 18:17:57
感谢分享

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版