找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 8668|回复: 7

【STM32】不断重启的STM32

[复制链接]
发表于 2019-4-23 15:05:57 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
我的STM32F103单片机总是在运行后片刻就自动重启了。那会儿我还试图写个步进电机加速的算法呢,结果步进电机加速倒是加速了,只是它也发出了鬼畜的“直,直,直”的音效——zhí第二声说明音调上升了说明有加速效果。但加速到一半它就会自动重启,所以没有减速的音效“至”,而是直接戛然而止。并且这个单片机每秒大概要重启4次左右,很迷。

我用ST-UTIL查看设备内存0xE0001000部分,看DWT_CYCCNT寄存器的数值,发现它总是在到达六位数的位置后就归零了。但我用ST-UTIL查看那部分内存的一瞬间,步进电机突然告诉转了起来,发出“叽——”的声音——加速到最大了,并且以2000Hz的频率步进。按道理,我的程序应该会让步进电机在持续以最大速度转动N圈后,再减速、换个方向再转,来测试步进电机的加速逻辑的。但它似乎并不能持续运行很久,在DWT_CYCCNT数值达到0x8A
000000
后,又归零了,并且步进电机又开始发出了鬼畜的“直,直,直”的音效……

我一开始以为这是因为我使用了DWT_CYCCNT从而导致的问题,后来发现我有别的单片机使用DWT_CYCCNT依然可以正确控制伺服电机(虽说软PWM发出去的脉冲长度精度不高,让伺服电机有点“粒度”)。

然后,我还怀疑过是供电的问题。毕竟步进电机它里面都是线圈,而线圈在建立起磁场以后,就几乎没有自感阻抗了,那这样一来是不是就会导致主控芯片电压过低呢?事实证明就算我给步进电机串联了各种阻值的电阻也不行,而ST-LINK的3.3v供电其实是足够同时驱动单片机和步进电机的。

排除了各种各样的问题后,问题还是那样。于是我打开ST-UTIL,开始查看上面的各项参数,看看是不是单片机的主控哪里出了问题。

20190423151626.png

检查各个内存变量,发现单片机每次重启的时候,这些变量都会被清零。虽说重启导致变量被重置这一点本身并无不合理之处,但这也让我觉得重启原因很迷,至少不是出在自己代码逻辑上。
我也检查了一下我的启动程序,也没看出有什么问题。我把DMA拷贝数据段的部分改成了指针复制,发现没有任何影响。

20190423152055.png

然后我用ST-UTIL检查Option Bytes,结果发现了可疑的地方:

2019042223155.png

这个WDG_SW是什么?鼠标移上去看,发现是看门狗:

swdg.png

会不会是它的问题呢?它上面的提示翻译过来是:
勾选:软件独立看门狗
未勾选:硬件独立看门狗

啥叫看门狗?我有一种我可能很快就能找出问题原因的预感。

于是我把它勾选了。顺带一提,这个板子其实出过一次,那就是我有一次烧录它的时候,USB线松了一下,然后烧录失败了。板子重新接起来再次烧录的时候,发现很多页ROM都被勾选了写保护,虽说ST-UTIL能强行在烧写的时候自动去掉写保护再烧写,然后写完后又帮你把写保护加回去……

最后我检查了一下全部的Option Bytes,应该没问题了吧……

20190422231554.png

然后我点了“Apply”应用,再进“MCU Core...”重启程序。
20190423154201.png
瞬间步进电机就发出了理论上正确的声音——
直————
它开始不断地加速、减速、加速、减速,来回转动。这正是程序持续运行的效果,而且我再次检查单片机的RAM,发现各个内存变量都在正常累加。板子不再自动重启了,问题解决。

这样的话,问题的原因也找到了,就是看门狗的问题。那么这个看门狗是什么呢?我检查了一下STM32F10x的文档,发现看门狗是用来保证单片机程序运行正常的一个机制。如果看门狗检测到了单片机程序出现了软件上的错误,它能帮你重启单片机程序。

而它是如何保证程序正常呢?我看了STM32L4的IWDG(独立看门狗)的文档(虽说其实和STM32F10x的一样),它的描述是:
The independent watchdog is used to detect and resolve malfunctions due to software failure. It triggers a reset sequence when the counter reaches the timeout value.
独立看门狗被用于检测并解决软件错误导致的工作不正常情况。当它的计时器到达了超时时间后,它触发设备重启。

原来如此,看门狗就是用了以后要不断地喂狗。养狗不喂狗是不好的。它通过判断你是否喂狗,来判断你宕机了没。总之就是每运行一个阶段就喂一次狗,这样一旦你不喂狗了,狗就来咬死你,让你重启。

以及:
The IWDG features a 12-bit free-running downcounter. It is clocked by an independent low-speed internal RC oscillator at 32 kHz.
When the IWDG is activated, a reset is generated if the downcounter reaches zero or when the downcounter is reloaded outside the window (if this option is enabled).
独立看门狗有个12位的裸奔(我可以把free-running翻译成“裸奔”吧?)向下计数器。它使用独立的32 kHz低速内部RC振荡器时钟。
当独立看门狗被启动,如果向下计数器达到0则会生成一次重启动作,或者当向下计数器被加载了一个超出窗口限制的数值(如果这个选项被开启了的话)。

也就是说,你还可以设置狗的胃口。启用了胃口限制后,喂狗的时候喂了太大量的狗粮也会被狗咬。

以及:
The IWDG hardware is enabled by the device's option bytes. If enabled, the watchdog automatically starts at power on.
To prevent any reset, the Key register must be refreshed at regular intervals before the counter reaches 0 and within the window, if this option has been selected.
如果在设备的Option Bytes(果然是这样)里面启用了独立看门狗,则看门狗将会在上电启动后自动开启。
为了避免任何重启,你必须在看门狗计数器达到0之前,在窗口限定时间内刷新关键寄存器(如果你开启了窗口限制的话)

这不就是我遇到的情况吗?烧写到一半的时候USB松了,然后单片机的Option Bytes里面的独立看门狗就被启用了,我却不知道这个。导致设备不断被咬、不断重启……

IWDG.jpg

说这么多废话没用。我选择使用STM32自己的外设驱动去喂狗。

20190423160141.png

不过就目前而言我没有使用看门狗的必要。我除非给STM32写个操作系统,我的系统可以使用看门狗,以及多任务机制,只要时间片过长我就放狗。但我还是倾向于直接写程序实现功能。我用我的程序描述一整套业务逻辑,不通过操作系统来管理程序。

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2019-4-23 15:52:16 | 显示全部楼层
zhi zhi zi zhizhizhi 我 ™。。。理解不出你的形象表述哇
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-4-23 16:47:38 | 显示全部楼层
sml2 发表于 2019-4-23 15:52
zhi zhi zi zhizhizhi 我 ™。。。理解不出你的形象表述哇

是普通话的“直”“只”“至”
回复 赞! 靠!

使用道具 举报

发表于 2019-4-27 16:05:11 | 显示全部楼层
0xAA55 发表于 2019-4-23 16:47
是普通话的“直”“只”“至”

直[zhí]   只[zhǐ]   至[zhì]  声调我能区分。。。    不过话讲回来  狗的机制真心不错 正确使用的话 可以相对增强代码的健壮性(系统的稳定性)。。小打小闹可能没必要  但是后面要做项目说不定有大用呢
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-4-27 18:55:45 | 显示全部楼层
sml2 发表于 2019-4-27 16:05
直[zhí]   只[zhǐ]   至[zhì]  声调我能区分。。。    不过话讲回来  狗的机制真心不错 正确使用的话  ...

我可以弄一个Windows版的看门狗——其实它是默认开启的。那就是使用PeekMessage来喂狗。如果你不PeekMessage或者GetMessage,它就说“应用程序没有响应。如果您继续等待,程序可能会响应。您想结束这个进程吗?”
回复 赞! 靠!

使用道具 举报

发表于 2019-5-6 11:09:12 | 显示全部楼层
0xAA55 发表于 2019-4-27 18:55
我可以弄一个Windows版的看门狗——其实它是默认开启的。那就是使用PeekMessage来喂狗。如果你不PeekMess ...

早该猜到的  
回复 赞! 靠!

使用道具 举报

发表于 2019-5-6 11:11:45 | 显示全部楼层

如果这个image的URL不加http就显示出来了
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-5-6 15:18:43 | 显示全部楼层
sml2 发表于 2019-5-6 11:11
如果这个image的URL不加http就显示出来了


仔细看了一下,我竟然不知道还有这种方式插入图片!用base64编码直接就上传图片了。屌!

顺带一提,图片内容我还是重新弄了上传一下了。
下载.jpg
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-4 00:45 , Processed in 0.043593 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表