软件STM32cubeIDE下STM32H743xx使用:看门狗iwdg+复位标志位-基础样例
- 1、前言
- [2 、实验环境](#2 、实验环境)
- 3、自我总结
- [4 、实验过程](#4 、实验过程)
-
- [4-1 实验说明](#4-1 实验说明)
- [4-2 图形下,配置选择](#4-2 图形下,配置选择)
-
- (1)配置时钟和下载
- ==(4) 时钟配置== 时钟配置==)
- ==(2)配置看门狗==
- (3)配置串口输入-用以printf
- (5) 生成代码,加入printf 生成代码,加入printf)
- [4-3 代码编写](#4-3 代码编写)
-
- [(1) 看门狗代码](#(1) 看门狗代码)
- [(2) 复位标志位代码1](#(2) 复位标志位代码1)
- [(3) 复位标志位代码2](#(3) 复位标志位代码2)
- [(4) 实验结果H7展示](#(4) 实验结果H7展示)
- [4-4 对比F4开发板](#4-4 对比F4开发板)
- 5、代码链接
- 6、细节部分
-
-
- (1)printf打印输出
-
- [情况一:使用定义PUTCHAR_PROTOTYPE方式 。](#情况一:使用定义PUTCHAR_PROTOTYPE方式 。)
- [情况二:使用定义define方式 。](#情况二:使用定义define方式 。)
- [(2)看门狗的"IDWG window value"](#(2)看门狗的“IDWG window value”)
- (3)时钟配置480Mhz
- (4)软件异常,无法新建工程,库文件报错
-
- 7、总结
1、前言
最近调试H7时,以为H7上复位标志位和F4上不太一样,所以做完实验后,决定有必要记录下,实验结论是一样的,另外也在H7上调试看门狗,让吃灰的H7发挥作用,也用用。
用STM32也好几年了,很多像pwm和串口,也调试过很多了,但仍然认为很多东西,依旧要当自己为新手。像这次调试的这个,之前没有调试过,也没有想到过会要用上。
2 、实验环境
- 软件环境:STM32cubeIDE 1.8.0
- 硬件芯片:STM32H743IIT6(正点原子开发板H7)
- 其它硬件:ST-link-V3SET。
- 硬件如下,可以看到,因为用到了ST-link-V3SET,因为这个设备自带一个uart串口转换器,省去了串口转换器,如果没有自带,需要弄个进行串口通信的。
3、自我总结
关于F4和F1标志位情况,可以看我之前文章。
软件STM32cubeIDE下STM32F1xx和STM32F4xx使用:备份寄存器+复位标志位-基础样例
(1)对于看门狗(Iwdg):
就是一个防止程序跑飞的看门狗,如果程序跑飞了,他会帮助你复位,不至于发生更大的意外,我们一把写好相关代码后,都希望只要不断电,就一直工作下,所以设这个看门狗,出现意外后,让其帮忙复位。
H7相比F4和F1类似,验证完后,都是一样的地方。但发现在配置看门狗的时候,多了一个"IWDG window value",一个窗口值配置,这个看到后查了一下,网上说法大概是这个意思,如下图所示。
在IWDG的配置中,"IWDG window value"是指窗口值(Window Value)。窗口值是IWDG计数器的一个特殊触发点,用于设置一个时间窗口。在这个窗口内,IWDG计数器必须被重载,否则将导致系统复位。
IWDG窗口值与IWDG预分频器(Prescaler)和重载寄存器(Reload Register)一起工作。窗口值设置了一个较小的计数范围,当IWDG计数器的值位于窗口内时,重载寄存器必须被重新加载,否则会发生复位。这种机制可以防止IWDG计数器无限增加而导致系统停止响应。
(2)对于复位标志位(RCC_CSR):
复位标志位,你可以理解是软件自己检测的一种工具,打个比方,当代码出现异常,不再喂狗的时候,看门狗就会使得整个系统复位,起来后,你去读取复位标志,复位标志位,就会告诉软件,上次是因为什么而复位的。
一些复位信号的产生,会引起整个系统的产生,然后有个地方会存下是什么复位了,记录这个复位,让你好读取。软件做的只有读取和将那个地方清空一下,方便下次起来,好判定。如果不清空,那么因为本次已经置位了,下次,你可能不知道是什么复位了。
调试的时候也发现,以为复位标志在H7和F4也是不太一样的,H7上得上下电复位标志位,是可以真实反映出上下电,以为F4不能,经过验证后,发现一致,记忆是容易出错的。
另外就是H7有着更多得复位标志位。
4 、实验过程
4-1 实验说明
本次实验使用正点原子开发板H7,调试看门狗程序,并读取复位标志位,在不同复位情况下,看复位标志位显示值有何种变化。
4-2 图形下,配置选择
(1)配置时钟和下载
如两张图,我们看到,时钟配置,还是和以前一样的,就是使用外部使用。
但是下载口,已经分开了,单独有个"Trace and Debug"栏,下面的"debug"有选择下载的,我们如下图选择即可。
(4) 时钟配置
可以看到我这步时第四步,而不是顺序第2步,为啥要先配置时钟树呢,因为我们需要知道看门狗时钟,才好计算实际时间,知道看门狗的时钟是32Khz的,如下图所示。
但是在自己写文章,再次进行调试和截图,发现它有不见了,这真的很神奇吧,时钟可以正常配置480Mhz。
(2)配置看门狗
看门狗配置也不太一样了,多了一个选择,"IWDG window value",这个细节部分会说明下,可以随便设个值,然后再代码里改吧。
由上步骤所示,我们知道是32khzd的频率。
那么计算后,就是256/32*1250=10s,也就是10s左右不喂狗,就会复位。
这块我以为窗口值,是代表提前复位,但是实际好像不这样的。这里我以为是10000-128,后来看,好像不是。
(3)配置串口输入-用以printf
这块也遇到一个问题,以前使用F4习惯,uart1默认就是PA9和PA10,没想到这回默认是另一个,这块需要先锁定,然后选择配置uart1,我们对串口没有特别需求(如DMA,或者中断),所以都默认配置了。
(5) 生成代码,加入printf
关于printf,我也是参考自己之前写的文章,之前在看之前文章,几个简单步骤和代码片段,就可以实现prinf了
#关于软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一
所以我这边直接截图了,有需要直接看代码。
4-3 代码编写
(1) 看门狗代码
看门狗虽然软件设置好了,但是多了一个"IWDG window value",我这边碰到一个问题,具体问题会在"细节部分"进行说明,这里设置失能。
另外我们也需要加入喂狗代码片段
(2) 复位标志位代码1
至于复位标志位读取,可以继续沿用hal库,也就是F4的写法,如下所示。
(3) 复位标志位代码2
也可以使用另一种方式,是请教大佬的方式,直接使用标志位进行与。
不过发现这样的写法,无法使用hal库清除标志位。
(4) 实验结果H7展示
情况一:看门狗自动复位。
即不喂狗,直接让看门狗复位。
情况二:复位按键复位。
即在看门狗复位前,按下复位按键,可以看到和F4一样的,在F4上,上下电复位标志位"RCC_FLAG_PORRST"是0,这里H7是0,说明没有下电的。
情况三:上下电复位,关总电开关。
为了验证"RCC_FLAG_PORRST"即,上下电复位标志是起作用,将总开关电关掉,重新上电,可以下电的。
4-4 对比F4开发板
为此,重新拿起F4开发板,再做了一组实验,已进行对比实验。
情况一:看门狗自动复位。
即不喂狗,直接让看门狗复位。如下图,所示,这是和H7上没有区别的。
情况二:复位按键复位。
可以看到和H7一样的,在H7上,上下电复位标志位"RCC_FLAG_PORRST"是0,这里H7是0,说明没有下电的。
情况三:上下电复位,关总电开关。
为了F4验证"RCC_FLAG_PORRST"即,上下电复位标志是起作用,将总开关电关掉,重新上电,可以下电的。
5、代码链接
代码链接:https://download.csdn.net/download/qq_22146161/88356935
6、细节部分
(1)printf打印输出
我做实验的的时候,发现在一种特殊的情况,单片机竟然不输出,后来发现是加入"\n",换行符,就可以。
于是我将此情况做了一个实验,使用不同printf的定义方式,看看情况。
后来写文章时,复看原文章时,评论区早有人说这个情况,今天也是补充吧。
情况一:使用定义PUTCHAR_PROTOTYPE方式 。
结果1:不加入换行符,单片机就不会输出。
结果2:加入换行符,单片机就输出。
情况二:使用定义define方式 。
结果1:不加入换行符,单片机就也会输出。
结果2:加入换行符,单片机就也会输出。
(2)看门狗的"IDWG window value"
在实际调试时,发现,在IDWG window value设置值为128时,只要加入喂狗函数,没过两秒,整体就重启了,如下图所示。
后来想到,应该是新加入这个"IDWG window value"代码关系于是在网上找其他人,看看他人怎么写的。
参考文章:https://blog.51cto.com/u_15046463/5685671
在代码里设置相同配置,问题就解决了,即设 失能。
另外我看到资料说这个窗口值是硬件上阈值,所以感觉像是最后兜底的,就是如果一直没喂狗,到超过这个窗口值,直接硬件复位,为此这个值一定比装载值大,才能用来兜底。
(3)时钟配置480Mhz
(4)软件异常,无法新建工程,库文件报错
这块真的很尴尬呢,复测时,发现自己代码直接报错,尝试更换hal库文件都不行,想到IOC文件可能出现问题,于是重新生成一遍代码,就好了,像是软件bug,
并且期间,新建工程,都是空的。
如下图,工程目录test_H7_rst_flag的ioc文件,重新生成一遍代码,就好了
解决后,可以新建新的工程了。
7、总结
这次算是自我更正了,以为H7,F4和F1,不太一样,没想到是一样的,只有实验过后才能测出结论。