昨天调试新项目时出现如此一个现象。
项目是在MDK上新建的,主要基于FreeRTOS平台,而RTOS文件是用MDK自有包。
我也比较喜欢这种,不必自己还要外挂FreeRTOS文件。简化不少工程目录。
因为FreeRTOS我之前没怎么接触过(只接触过rt_thread),不是太熟悉配置过程,不过好在网络对此有许多教程,如这篇连载就很详细:FreeRTOS基础篇教程目录汇总
按着其介绍,完成了系统配置。然后就是编写自己的代码。
后来不知调试着,突然不能下载了,起初以为是ST_LINK V2烧坏了,就是这玩意儿。主要是这个烧录器确实容易坏,以前在前公司经常用这个,有时候不明由的就挂了,虽说易坏,但是一是价格便宜,而是便携简单,三是还是用习惯了,之前尝试用过DAP或者ARM调试器,但还是觉得太大,线缆长等原因,就没再继续用了。
后来我尝试换了个新的,还是不能下载,就怀疑可能MCU烧毁了,因为有电机驱动,用示波器看有很大的干扰波,后来找了一块新版也是不能下载,就还是回来怀疑ST LINK坏了。
突然看到手边有一个STM32F103R8的小开发板,
于是吧工程改了下(原来是RB芯片),用它烧录,发现可以下载了,不过我断电后,再连着下载,发现又不能下载了,没有识别到目标MCU.
我开始也以为是SWD引脚被无意中覆盖禁用了,但是查了代码,压根就没有用到那两根引脚,包括JTAG的引脚。只好下载FlyMCU采用ISP串口下载了。使用开发板测试,主要是BOOT好配置(跳帽就行),下载后,再烧录原来的代码,再次可以下载,不过也不能二次下载,会依旧不能识别目标。这样我只好不所有的外设及task屏蔽了,仅保留RTOS空壳,下载后依旧不行。我更让我纳闷了,突然我想到之前调试时,又发现跳到 RTOS中的port.c文件中的_wfi()语句附近。
我怀疑可能MCU进入休眠了,不能被唤醒导致不能下载,但是我又没有配置STM32的WFI等休眠指令啊,我就开始查找FreeRTOS休眠配置的信息。
查到是这个配置引起的,修改之后,果然就可以断电不断下载了。不过调试时会后这个问题
卡在prvCheckTasksWaitingTermination语句。
于是再次网上查找相关问题,最后在一篇同现象中摸索到问题,
FreeRTOS卡在prvCheckTasksWaitingTermination
想到自己用到了滴答延时函数:
对就是这个:
于是换掉用for阻塞延时函数,至此问题现象问题完全解决。
后来想了想为什么我没有配置WFI指令,怎么RTOS系统会依旧休眠呢,我想因为我现在是用MDK自带用于STM32的RTOS包,相关的框架应该融入了STM32的一些特性指令。如RTOS要实现低功耗的功能,所以有最开始的那条宏配置。
哦,忘了说标题的那个现象,这个是在解决这个问题中时候碰到的现象,
如此老哥所描述:
为什么SWD烧录STM32时BOOT0脚要接高电平,否则SWD下载失败
BOOT0/BOOT1引脚作用
不过加深了解了BOOT0引脚的作用,以前出现休眠的问题,我都是将复位电容在点击下载的前一刻短路然后释放进行下载,现在则不需要了,
直接将boot0短路到3.3V高电平,就可以下载,然后再断开重启就行。