看门狗1. 什么看门狗看门狗是一种计时硬件电路。
当系统环境比较恶劣复杂的时候,程序可能会出现一些不可预料的错误,导致程序卡死,崩溃等情况。看门狗就可以及时的重置程序,使程序重新从头开始运行。
STM32 有2个看门狗,独立看门狗,窗口看门狗。独立看门狗号称宠物狗,窗口看门狗号称警犬。
独立看门狗(IWDG)由其自己的专用低速时钟(LSI)驱动,因此即使主时钟失败,它仍然保持活动。
窗口看门狗(WWDG)的时钟是从APB1时钟预分频的,并且具有可配置的时间窗口,可以编程以检测异常晚或早的应用程序行为。
IWDG最适合需要看门狗作为完全独立于主应用程序之外的过程运行的应用程序,但对定时精度的要求较低。
WWDG最适合需要看门狗在准确的定时窗口内做出反应的应用程序。
2. 独立看门狗IWDG(Independent watchdog,独立看门狗)。独立看门狗是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个刷新计数器值的动作就是我们经常说的 ...
定时器1. 系统定时器1.1 SysTick介绍系统定时器(SysTick系统)是属于CM3内核,内嵌在NVIC中。
系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为1 / SYSCLK,一般我们设置系统时钟SYSCLK(与AHB相同)等于72M。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。
SysTick定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间SysTick的处理方式都是相同的。
系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。
1.2 SysTick工作原理在使用Systick定时器进行延时操作时,可以设定初值并使能后,每经过一个系统时钟周期,计数值就减1。当计数到0时,Systick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能)。这样可以 ...
中断系统1.中断概述 在主程序运行过程中,出现了特定事件,使得CPU暂停当前正在运行的程序,转而去处理这个事件,等这个事件处理完成之后,CPU再回到刚才被打断的位置继续处理,这就是中断。
这个打断CPU执行的特定事件,一般称之为中断源。被中断源打断的位置,称为断点。处理特定事件的过程,称为执行中断处理程序。
当然中断也是可以嵌套的,即中断嵌套。CPU会根据优先级的不同,来决定执行顺序
中断源可以是外部的,也可以是内部的。外部的叫外部中断源,内部的叫内部中断源(内部的中断有时候也叫异常)
Cortex-M3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
一般情况下,芯片厂商会对Cortex-M3的中断进行裁剪。具体中断信息可通过对应的芯片手册查看。
2. 中断向量表STM32的中断向量表是一个储存中断处理函数地址的数组,位于Flash区的起始位置。每个数组元素对应一个中断源,其地址指向相应的中断服务程序。当中断发生时,处理器会根据中断号查找向量表,然后跳转到对应的中断服务程序执行。
中断向量表的主要作用是解决中断函数 ...
1. 时钟1.1 时钟树在STM32中有3种不同的时钟源用来驱动系统时钟(SYSCLK):
HSI振荡器时钟(High Speed Internal oscillator,高速内部时钟)
HSE振荡器时钟(High Speed External(Oscillator / Clock),高速外部时钟)
PLL时钟(Phase Locked Loop 锁相环/倍频器)
还有2种2级时钟:
LSI时钟(Low Speed Internal,低速内部时钟)
LSE时钟(Low Speed External oscillator,低速外部时钟)。
1.2 HSE时钟高速外部时钟信号(HSE)可以由两种可能的时钟源生成:
HSE外部晶体/陶瓷谐振器
HSE用户外部时钟
谐振器和负载电容必须尽可能靠近振荡器引脚放置,以最小化输出失真和启动稳定时间。负载电容值必须根据所选振荡器进行调整。
目前几乎所有的STM32单片机的设计都是在外部接一个8MHz的晶振,经过PLL倍频(9倍频)后得到一个72MHz的系统时钟。系统默认就是这个时钟。通过启动文 ...
GPIO外设1. 什么是GPIO General-purpose and alternate-function I/Os (GPIOs and AFIOs),GPIO是微控制器(如STM32)与外界交互的核心接口,通过配置引脚模式实现灵活控制,即用程序来控制或读取GPIO引脚的输入或输出。AFIO是STM32微控制器中用于管理GPIO引脚复用功能的关键模块,其核心作用是将物理引脚动态配置为外设功能(如USART,SPI,PWM等),而非仅作为普通输入/输出。即复用IO引脚来控制外设。
可由STM32直接驱动GPIO引脚从而实现与外部设备通信,控制以及采集和捕获的功能。
1.1 GPIO详情 STM32有多组GPIO,不同的STM32芯片有不同组的GPIO端口。以STM32F103ZET6为例,其共有7组GPIO端口,分别是GPIOx(x从A-G),每组控制16个引脚,共有112个GPIO引脚。可通过查询对应的STM32芯片的数据手册,来获取对应的信息。
每个引脚的电平是0-3.3V,部分引脚最高可以兼容到5V。
1.2 GPIO的主要特点 (1)不同 ...
位操作位操作(Bit manipulation)是计算机编程中对位(bit)进行操作的技术,通常用于低级编程和优化。位操作可以对整数的二进制表示进行直接的修改,这在某些情况下比使用高级语言构造更高效。以下是一些基本的位操作:
按位与(AND):操作符 &。两个位都为1时结果才为1。
例如:1011 & 1100 = 1000
按位或(OR):操作符 |。两个位中至少有一个为1时结果为1。
例如:1011 | 1100 = 1111
按位异或(XOR):操作符 ^。两个位不同的时候结果为1。
例如:1011 ^ 1100 = 0111
按位非(NOT):操作符 ~。反转所有位,1变成0,0变成1。
例如:~1011 = 0100
左移(Left Shift):操作符 <<。将位向左移动指定的位数,右边空出的位补0。
例如:1011 << 1 = 10110
右移(Right Shift):操作符 >>。将位向右移动指定的位数,左边空出的位补符号位(算术右移)或0(逻 ...
什么是MakefileMakefile 是一个特殊的文件,通常用于管理和自动化软件的构建过程。它包含了一系列的指令,这些指令定义了如何编译和链接程序。Makefile 与 make 工具一起使用,make 是一个构建自动化工具,它会查找 Makefile 文件,并根据其中的指令来构建程序。
Makefile 的基本结构通常包括以下几个部分:
目标(Targets):这是构建过程中的一个步骤,比如编译一个源文件或安装程序,即最终要生成的目标文件
依赖(Dependencies):目标需要的文件,如果这些文件发生变化,目标将被重新构建,即目标文件由哪些文件生成
命令(Commands):生成目标的命令序列,即通过执行该命令,使依赖文件生成目标文件
基本规则12Targets:Dependencies(tab)Commands
tab不能用空格代替
Makefile文件的命名:makefile或者Makefile
下面是一个简单的makefile文件
12main: main.c func1.c func2.c gcc -o main main.c func1.c func2 ...
网络字节序什么是大端和小端?
大端(高端字节序,网络字节序):低位地址存放高位数据,高位地址存放低位数据
小端(低端字节序):低位地址存放低位数据,高位地址存放高位数据
什么时候使用大端和小端?
大端和小端只是对数据类型长度是两个及以上的,如int,short,对于单字节没限制,在网络中经常需要考虑大端和小端的是IP 和端口
大小端转换函数网络传输用的是大端法
如果机器用的是小端法,则需要进行大小端的转换
下面4个函数就是进行大小端转换的函数
123456#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);
函数名的h表示主机 host,n表示网络network,s表示short,l表示long
上述的几个函数,如果本来不需要转换,函数内部就不会做转换
IP 地址转换函数点分十进制IP转网络IPint i ...
递归非常神奇,说实话,在我大一刚开始接触递归的时候,我就和这个表情包一样。哈哈,废话不多说,进入正题。那么递归到底是怎么实现的,原理是什么?下面我会写出我对递归的理解,希望能帮助大家
什么是递归(Recursion)递归是一种在编程中常用的算法设计策略,通过函数直接或间接地调用自身来解决问题。递归的核心思想是将一个复杂的问题分解成更小的、相似的问题,直到问题变得足够简单,可以直接解决。
它在多种场景下都非常有用。以下是一些常见的使用递归的情况:
树和图的遍历:
二叉树、N叉树、图等结构的深度优先搜索(DFS)和广度优先搜索(BFS)通常使用递归实现。
遍历文件系统或目录结构时,递归可以用来访问每个文件或目录。
分治算法:
递归是分治策略的核心,如归并排序、快速排序等算法,通过递归将问题分解成更小的子问题,解决后再合并结果。
动态规划:
某些动态规划问题,如斐波那契数列、最长公共子序列等,可以通过递归(带备忘录或动态规划表)来解决。
回溯算法:
解决组合问题,如八皇后问题、数独求解器、排列组合问题等,递归用于探索所有可能的解。
数学计算:
计算阶乘、幂运算等数学问题 ...
快慢指针快慢指针是一种常用于链表问题的算法技巧,它主要通过两个指针的不同移动速度来解决某些特定的问题。以下是一些常见的使用快慢指针的场景:
检测链表是否有环:使用快慢指针,快指针每次移动两步,慢指针每次移动一步。如果链表中有环,那么快指针最终会追上慢指针。
找到链表中的环的入口:在检测到链表有环之后,可以通过重置慢指针到链表的头部,然后快慢指针同时移动,再次相遇时的位置即为环的入口。
计算链表中环的长度:在找到环的入口之后,可以通过只移动慢指针来计算环的长度。
删除链表中的环:在找到环的入口后,可以通过调整指针来删除环。
找到链表的中间节点:使用快慢指针,快指针移动两步,慢指针移动一步,当快指针到达链表末尾时,慢指针即为链表的中间节点。
链表的合并:当需要合并两个有序链表时,可以使用快慢指针来分别跟踪两个链表的当前节点,并根据值的大小来合并。
寻找链表的第k个节点:可以使用快指针先移动k步,然后快慢指针一起移动,当快指针到达链表末尾时,慢指针所在的位置就是第k个节点。
快慢指针的关键在于通过控制指针的移动速度来获取链表的某些性质,这种方法在解决链表问题时非常有效。