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

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

[复制链接]
eefishing 发布时间:2020-1-19 20:17
出错处理
5 U1 U/ T; c# t0 Y$ f
: A# U: I9 K2 x0 j6 T! ?6 L

$ s6 [1 ^* g+ ]' e4 z" ?/ B! }9 M
检测过程如果出现错误,程序会进入FailSafePOR,该函数的目的就是提供一个统一的处理出口。
& G( Y/ _& @" a, p; a  S2 g
0 L( \8 R3 T" J
) A, x5 J6 S" r5 U
问题汇集

+ V4 n  P% v" Q( S3 X; m) g
! G, h& z* o& n  z! d( W
4 Z! Z; k3 C, }2 ~- }/ ~
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文件拷贝过来了。修改后解决。
" s8 @# y* ]+ P. _" }/ [1 U8 S
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).

& ]4 s1 C6 [/ U5 \' J3 C5 D" M
在main.c和stm32f2xx_it.c中添加对应的函数,变量定义以及include头文件,参考例程。
; R; \$ v) m, n  O# m7 F
3.
编译时计算CRC报错:
Extracting CRC address from MAP file
FINDSTR: Cannot open STM322xG_EVAL\STM322xG_EVAL.map
这是因为例程中的crc_gen_keil.bat中默认的HEX文件名称和路径和新项目不一致,按新项目进行修改就可以解决。
1.jpg

/ U$ v% F. m0 E* Z) r" e
4. 调试时Flash CRC检测通不过
检查是否在KEIL的options->Debug,和Options->Utilities中添加crc_load.ini,在调试和下载时使用写入了正确CRC值的HEX文件。如果你是直接拷贝例程中的crc_load.ini文件的话,还要检查一下里面的内容,hex文件的名字和路径和实际工程的是否一致。
( N) H% C$ u4 d4 Z* R% L
5. RAM测试之后进hardfault
RAM检测是破坏性检测,RAM里的数据都会丢掉。检查一下程序里是否直接用了RAM里的数据。另外stm32fxx_STLtranspRam.c的优化等级要降到0。

( T' O2 J5 v, I
6. 调试时去掉部分模块的检测,要特别注意flowcontrol的检测。
control_flow_check_point()调用会出错,建议将control_flow_check_point()函数先屏蔽掉。

. K# O3 `/ _* {0 M1 q# C/ E3 I% O
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

2 z3 c7 L' k/ @' y, u" P
8. 运行时的时钟检测总是失败。检查一下当前的系统时钟配置系统,以及给TIM5的APB1
时钟的配置是否和例程中的一样,如果不一样的话,HSE_LimitHigh/HSE_LimitLow, HSI_LimitHigh/HSI_LimitLow的公式就要修改。

8 I. `" S3 s: b' p5 j9 v
9. 添加了运行时检测的代码后,程序总是复位。这种情况建议检查一下看门狗“喂狗”时间设置得是否合理。可以先关闭看门狗,以确认是否是其引起的问题。
赞 收藏 评论2 发布时间:2020-1-19 20:17

举报

2个回答
xsqiuhui 回答时间:2020-3-17 15:55:37
你好 ,我们在移植官方的classb库的时候遇到了许多棘手的问题,无法解决,望请您帮忙支持和分析一下,谢谢!!+ K1 c+ X9 K  F/ o
        问题如下:
, X  K  k7 x' X2 U. Y/ c            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()检测就能正常通过
5 ]3 s# D* P8 ^8 }2 [7 \$ h: O5 @2:在flash  的crc校验是crc_result和REF_CRC32判断,每次更新代码编译后所计算的crc_result值都是不一样的,但是REF_CRC32一直都是固定的值,就是在stm32f103xe.s 定义的__Check_Sum值,难道每次更新代码编译都需要修改这个值吗?这里不知道他的机制是怎样的,__Check_Sum是如何设置的呢?
8 S$ g$ ]# t- o7 [- C: z( v# u 6 s" O) W$ B  @# B
3:在flash检测完以后,后面的RAM检测,时钟检测,程序控制流检测等全部检测都无法通过。时钟检测时,芯片会直接挂死,不知道为何?* b. M9 \2 _' y& R: y( F. J1 X) Y2 l

5 o7 j: T* k0 N( F9 m4:GotoCompilerStartUp函数 中的__main()和__main 有何区别,我在使用__main()程序执行结果是挂死,但是使用__main是可以正常跳转到程序的主函数main的
/ U3 G1 E- A! P9 V+ N: P
heiyewuyue 回答时间:2020-6-8 18:17:57
感谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版