上位机图像处理和嵌入式模块部署(f103 mcu中的看门狗)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        项目开发中,我们总是希望固件代码能够稳定、健壮。为此,我们进行了各种软件质量管理,从需求开发开始,一直到静态检查、单元测试、代码review、黑盒测试、压力测试等等。但是,谁也不能保证,经过这样的流程验证之后,软件质量就是万无一失的。所以,为了解决mcu死锁的问题,人们设计了开门狗这个功能。

        所谓的看门狗,就是要求我们单位时间内必须有一个喂狗操作。如果没有做到这一点,那么系统就会reset复位重启。为什么做不到这一点呢?一般就是程序跑飞,或者是系统进入了死循环状态。看门狗只是我们系统开发的底线,并不意味着我们就不需要做好软件质量的管理了。

        今天,我们继续看下stm32f103下面看门狗是怎么做的?

1、直接查看main函数

        main函数是系统功能的主窗口,我们从这里出发,

int main(void)
{
    SystemClock_Config();
	LED_GPIO_Config();	 
	LED1_OFF;

    Key_GPIO_Config();
	
	IWDG_Config(IWDG_PRESCALER_64 ,625);
	HAL_Delay(200);
	
	while(1)                            
	{	   
		if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON )
		{ 
			HAL_IWDG_Refresh(&IWDG_Handle);
		}

	  LED1_ON;		
	}
}

        代码本身并不复杂。首先设置时钟,接着配置LED,并且把LED熄灭。然后配置输入key。这一切都做完之后,就到了今天的重点,配置和启动看门狗,时间为1s。这个地方,我们延时200ms,主要是为了观察使用,使得系统启动后有一个明显的熄灯动作。

        初始化都做完之后,下面就是开始循环检测。如果系统发现KEY1被按下去的时候,那么定时喂狗,LED持续点亮。如果没有,那么我们可以看到,LED灯周期性熄灭,这主要是发生了系统重启复位。

2、看门狗初始化

        关于看门狗的设置,建议会使用、会配置参数就好了,

void IWDG_Config(uint8_t prv ,uint16_t rlv)
{	
	IWDG_Handle.Instance = IWDG;
    IWDG_Handle.Init.Prescaler = prv;
    IWDG_Handle.Init.Reload = rlv;
    HAL_IWDG_Init(&IWDG_Handle);
}

3、喂狗操作

        这里喂狗的操作直接调用了HAL_IWDG_Refresh函数即可。

4、其他所要做的修改

        因为我们测试的是stm32f103核心板,和代码匹配的板子不一样,所以一部分配置需要修改下。第一,LED需要绑定到pc13上面;第二,只需要一个a0 key,另外一个可以删除掉;第三,Key_Scan函数修改成非阻塞的形式;第四,SysTick_Handler中一定要添加HAL_IncTick,不然HAL_Delay会hang在那里。

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
	if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )  
	{	 
		return 	KEY_ON;	 
	}
	else
	{
		return KEY_OFF;
	}
}

5、编译、测试

        测试相对就比较简单了。首先我们确保编译没有问题,接着通过st-link v2下载到开发板上,最后用短接线把a0和gnd或者3.3v进行短接。观察一下,如果接到gnd发生了闪烁,但是接到3.3v没有闪烁,这就代表看门狗发挥了效果。反之,就要去好好检查失败的原因了。

        另外为了测试方便,可以把烧录后重启勾选上,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644311.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react组件传参 父传子可以传字符串,布尔值,数组,对象,jsx,

在react中&#xff0c;父传子组件 props的灵活性是很强大的&#xff0c;可以传字符串&#xff0c;布尔值&#xff0c;数组&#xff0c;对象&#xff0c;jsx&#xff0c; function Son(props) {console.log(props,"props的值")return(<div>这是儿子组件 {props.…

LeetCode 第131场双周赛个人题解

100309. 求出出现两次数字的 XOR 值 原题链接 求出出现两次数字的 XOR 值 - 力扣 (LeetCode) 竞赛 思路分析 签到题&#xff0c;一次遍历 AC代码 class Solution:def duplicateNumbersXOR(self, nums: List[int]) -> int:cnt Counter(nums)res 0st set(nums)for x …

Go微服务: Http服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把Http服务注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/go-mi…

插入耳麦耳机的麦克风线,但录入声音失败的解决办法

现状&#xff1a;可以查看到有麦克风&#xff0c;但说话时&#xff0c;音量条没有上升 解决&#xff1a;控制面板-语音识别。对头戴式耳机进行操作。 效果&#xff1a;完成后&#xff0c;用搜狗语音打字验证通过。 注意&#xff1a;电脑上还连接了个有线音箱&#xff0c;但说…

Python | Leetcode Python题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution:def hasPathSum(self, root: TreeNode, sum: int) -> bool:if not root:return Falseif not root.left and not root.right:return sum root.valreturn self.hasPathSum(root.left, sum - root.val) or self.hasPathSum…

从0开始学统计-蒙彼利埃尔悖论与条件概率

1.什么叫均衡可比&#xff1f; "均衡可比"指的是在进行比较时&#xff0c;确保所比较的对象或情况具有相似的特征和条件&#xff0c;以保持比较的公正性和准确性。这个概念通常应用于研究设计和数据分析中&#xff0c;以确保比较结果的可信度和有效性。 在研究中&a…

用 Pyinstaller 模块将 Python 程序打包成 exe 文件

一、安装Pyinstaller pip install Pyinstaller二、将 Python 程序打包成 exe 文件 Pyinstaller -F -w sum_income.py参考文献 用 Pyinstaller 模块将 Python 程序打包成 exe 文件&#xff08;全网最全面最详细&#xff0c;万字详述&#xff09;

ESP32-C3模组上跑通OTA升级(9)

接前一篇文章&#xff1a;ESP32-C3模组上跑通OTA升级&#xff08;8&#xff09; 本文内容参考&#xff1a; 《ESP32-C3 物联网工程开发实战》 乐鑫科技 特此致谢&#xff01; 七、固件版本 将不同功能的固件标记为不同版本是方便后期维护的一个重要手段。ESP-IDF提供了一些标…

MacPro中Ubuntu安装GNOME桌面

第一步&#xff0c;先在MacPro中安装UTM虚拟机。 查看另一文章&#xff1a; https://blog.csdn.net/qq_38382925/article/details/139157877?spm1001.2014.3001.5502 第二步&#xff0c;在虚拟机中安装Ubuntu ARM64 server 查看另一文章&#xff1a; https://blog.csdn.net/qq…

联想端游联运SDK接入指南

1. 接入流程 本文档主要介绍了 联想PC游戏SDK接入流程、联想游戏提供的功能、接入注意事项等。 1.1. 接入方式 1. 联想游戏SDK2.1版本支持“账号防沉迷支付”接入方式&#xff1b; a. 联想提供账号注册、登录等能力 b. 联想提供防沉迷服务 c. 联想提供游戏内支付 1.2. 对…

[MRCTF2020]Xor

32位程序 主要逻辑 flagMSAWB~FXZ:J:tQJ"N bpdd}8g for i in range(len(flag)):print(chr(ord(flag[i])^i),end)

Nature Communications | 柔性半导体器件的大规模集成(柔性半导体器件/柔性电子)

韩国中央大学Sung Kyu Park、 韩国成均馆大学Jong-Woong Kim和Yong-Hoon Kim团队,在《Nature Communications》上发布了一篇题为“Full integration of highly stretchable inorganic transistors and circuits within molecular-tailored elastic substrates on a large scal…

【OpenGL实践12】关于缓存区Framebuffer的运用

文章目录 一、说明二、帧缓冲区三、创建新的帧缓冲区四、附属装饰4.1 纹理图像4.2 渲染缓冲区对象图像 五、使用帧缓冲区5.1 后期处理5.2 更改代码 六、后期处理效果6.1 色彩处理6.2 模糊6.3 Sobel算子 七、结论练习 一、说明 关于FrameBuffer的使用&#xff0c;是OpenGL的高级…

九、图形化脚本

多年来&#xff0c; shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时&#xff0c;就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。 9.1 创建文本菜单 创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户…

从浮点数定义到FP8: AI模型中不同的数据类型

背景&#xff1a;AI模型中不同的数据类型对硬件算力和内存的需求是不同的&#xff0c;为了提高模型在硬件平台的吞吐量&#xff0c;减少数据通信带宽需求&#xff0c;往往倾向于将高位宽数据运算转向较低位宽的数据运算。本文通过重新回顾计算机中整数和浮点数的定义&#xff0…

从0开始带你成为Kafka消息中间件高手---第二讲

从0开始带你成为Kafka消息中间件高手—第二讲 那么在消费数据的时候&#xff0c;需要从磁盘文件里读取数据后通过网络发送出去&#xff0c;这个时候怎么提升性能呢&#xff1f; 首先就是利用了page cache技术&#xff0c;之前说过&#xff0c;kafka写入数据到磁盘文件的时候&…

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把GRPC服务实现注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

微信小程序上线必备:SSL证书申请以及安装

一、认识ssl证书 1、ssl证书是什么&#xff1f; SSL证书&#xff0c;全称Secure Socket Layer Certificate&#xff0c;是一种数字证书&#xff0c;它遵循SSL&#xff08;现在通常指TLS&#xff0c;Transport Layer Security&#xff09;协议标准&#xff0c;用于在客户端&…

C++ vector类

目录 0.前言 1.vector介绍 2.vector使用 2.1 构造函数(Constructor) 2.1.1. 默认构造函数 (Default Constructor) 2.1.2 填充构造函数 (Fill Constructor) 2.1.3 范围构造函数 (Range Constructor) 2.1.4 拷贝构造函数 (Copy Constructor) 2.2 迭代器(Iterator) 2.2.…

封装了一个iOS水平方向瀑布流布局

首先查看效果图 是支持多分区的 思路就是和竖直方向上的瀑布流布局是一样的&#xff0c; 只不过这里记录的列是水平方向的&#xff0c;同时要记录下 当前最小的x 所在的列&#xff0c;其实原理和竖直方向上的是相同的 &#xff0c;下面贴出代码 父类layout中的代码 // // …