- 博客(38)
- 收藏
- 关注
原创 数据结构与算法:卡尔曼滤波
卡尔曼滤波(Kalman Filter)是一种用于估计动态系统状态的算法。它通过结合系统的预测模型和实际观测数据,逐步优化状态估计,从而得到更准确的结果。利用系统的动态模型和噪声统计特性,对状态进行最优估计。导航系统:如GPS定位、无人机导航。控制系统:如机器人运动控制、自动驾驶。信号处理:如传感器数据融合、图像处理。卡尔曼滤波是一种强大的状态估计算法,适合处理动态系统中的噪声和数据不确定性。通过学习卡尔曼滤波的原理和实现,你可以更好地理解状态估计的基本方法。
2025-02-24 13:32:17
1302
原创 数据结构与算法:均值滤波
均值滤波是一种简单的图像处理技术,用于去除图像中的噪声。它的核心思想是用一个像素周围邻域像素的平均值来代替该像素的值。通过这种方式,可以平滑图像,减少噪声的影响。举个例子:假设我们有一个 3x3 的图像区域,像素值如下:10 20 3040 50 6070 80 90如果我们对中心像素50进行均值滤波,那么新的像素值就是周围 9 个像素的平均值:均值滤波是一种简单而有效的图像处理技术,适合去除图像中的噪声和平滑图像。通过学习均值滤波的原理和实现,你可以更好地理解图像处理的基本方法。
2025-02-24 13:26:24
569
原创 数据结构与算法:多项式存储及运算
多项式是数学中常见的一种表达式,由多个项组成,每个项包含系数和指数。例如:在计算机中,我们需要用合适的数据结构来存储多项式,并实现多项式的加法、减法、乘法等运算。多项式是一种非常重要的数学表达式,通过合适的数据结构和算法,我们可以在计算机中高效地存储和运算多项式。希望通过这篇文章,你能轻松掌握多项式的存储及运算!
2025-02-22 09:30:00
329
原创 数据结构:二叉树( Binary tree)及其实现
二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。每个节点最多有两个子节点。左子节点和右子节点是有序的,不能随意交换。举个例子:1/ \2 3/ \4 5这是一个二叉树,根节点是1,左子节点是2,右子节点是32的左子节点是4,右子节点是5。二叉树是一种非常重要的数据结构,适合表示层次关系和递归结构。通过学习二叉树的存储、遍历和操作,你可以更好地理解树形数据结构的原理和应用。希望通过这篇文章,你能轻松掌握二叉树的相关知识!
2025-02-22 08:00:00
487
原创 数据结构与算法:数组的增删查改
数组是一种最基本的数据结构,它是一块连续的内存空间,用来存储相同类型的数据。顺序存储:数据在内存中是连续存储的。固定大小:数组的大小在定义时就确定了,不能动态改变。快速访问:通过下标可以直接访问任意位置的元素。举个例子:定义一个数组,它存储了 5 个整数。通过arr[0]可以访问第一个元素1,通过arr[4]可以访问最后一个元素5。数组是一种简单而强大的数据结构,适合存储固定大小的数据。通过学习数组的增删查改操作,你可以更好地理解数据结构的基本原理。希望通过这篇文章,你能轻松掌握数组的相关知识!
2025-02-21 17:16:49
319
原创 数据结构与算法:奇校验与偶校验
奇校验和偶校验是一种简单的数据校验方法,用于检测数据在传输过程中是否发生了单比特错误。它们的核心思想是通过增加一个校验位,使得数据中1 的个数满足奇数(奇校验)或偶数(偶校验)的条件。举个例子:假设我们要传输的数据是1011001。如果使用奇校验,校验位应该是1,因为数据中已经有 4 个1(偶数),加上校验位后1的个数变为 5(奇数)。如果使用偶校验,校验位应该是0,因为数据中已经有 4 个1(偶数),加上校验位后1的个数仍然是 4(偶数)。
2025-02-21 17:13:55
1022
原创 数据结构:广义表( Generalized List)及其实现
广义表(Generalized List)是一种扩展的线性表,它可以存储原子(单个数据元素)或子表(另一个广义表)。它可以递归定义,也就是说,一个广义表的元素可以是另一个广义表。:这是一个普通的线性表,包含 3 个原子。:这是一个广义表,包含 2 个原子和 1 个子表(2, 3)。:这是一个更复杂的广义表,包含嵌套的子表。广义表的灵活性使其非常适合表示复杂的数据结构,比如树、图等。广义表是一种非常灵活的数据结构,适合表示复杂的数据结构。通过学习广义表的基本操作和实现,你可以更好地解决实际问题。
2025-02-20 13:32:45
1484
原创 数据结构:串( Bunch)及其实现
串(String)是由零个或多个字符组成的有限序列,比如"hello"就是一个串。串是编程中非常常见的数据结构,常用于处理文本数据。顺序存储:串中的字符是连续存储的,类似于数组。链式存储:串中的字符也可以通过链表的方式存储,每个节点存储一个字符。常用操作:包括插入、删除、查找、替换等。串是一种非常重要的数据结构,常用于处理文本数据。顺序存储和链式存储各有优缺点,适合不同的场景。通过学习串的基本操作和常用算法,你可以更好地解决实际问题。希望通过这篇文章,你能轻松掌握串的相关知识!
2025-02-20 13:19:25
827
原创 数据结构:静态链表( Static Linked List)及其实现
静态链表是一种特殊的链表结构,它用数组来模拟链表的操作。你可以把它想象成一个“固定大小的链表”,每个节点都存储在一个固定的位置(数组下标),并通过一个“游标”来指向下一个节点。用数组实现:节点存储在数组中,数组的大小是固定的。游标代替指针:用数组下标(游标)来模拟指针,指向下一个节点。适合内存受限的场景:因为不需要动态分配内存,适合嵌入式系统等内存受限的环境。下面是一个静态链表的示意图:头节点下标:1空闲链表头节点下标:3数组下标:0 1 2 3 4 5。
2025-02-19 17:21:22
528
原创 数据结构:双向循环链表( Double Circular Linked List)及其实现
双向循环链表是一种更高级的链表结构,它就像一条双向环形跑道,每节车厢(节点)都有两个挂钩(指针),一个指向下一节车厢,另一个指向上一节车厢。数据:存储实际的数据(比如数字、字符串等)。前驱指针:指向前一个节点的地址。后继指针:指向下一个节点的地址。链表的最后一个节点的后继指针指向头节点,头节点的前驱指针指向最后一个节点,形成一个双向闭环。正因为如此,双向循环链表可以从任意节点开始,向前或向后无限遍历。下面是一个双向循环链表的示意图:复制。
2025-02-19 09:00:00
774
原创 数据结构:双向链表(Double Linked List)及其实现
双向链表是一种更高级的链表结构,它就像一辆可以双向行驶的火车,每节车厢(节点)都有两个挂钩(指针),一个指向下一节车厢,另一个指向上一节车厢。数据:存储实际的数据(比如数字、字符串等)。前驱指针:指向前一个节点的地址。后继指针:指向下一个节点的地址。可以从前往后遍历,也可以从后往前遍历。正因为如此,双向链表在某些场景下比单链表更方便。下面是一个双向链表的示意图:头指针 -> [10] <-> [20] <-> [30] -> NULL每个方框代表一个节点,包含数据、前驱指针和后继指针。
2025-02-18 08:30:00
444
原创 数据结构:循环链表(Circular Linked List)及其实现
循环链表是一种特殊的链表结构,它就像一条环形跑道,每节车厢(节点)都通过挂钩(指针)连接到下一节车厢,最后一节车厢又连接回第一节车厢。数据:存储实际的数据(比如数字、字符串等)。指针:指向下一个节点的地址。链表的最后一个节点的指针指向头节点,形成一个闭环。正因为如此,循环链表可以无限遍历下去。下面是一个循环链表的示意图:头指针 -> [10] -> [20] -> [30] -> (回到起点)每个方框代表一个节点,包含数据和指针。指针指向下一个节点,最后一个节点的指针指向头节点,形成一个环。
2025-02-18 08:00:00
380
原创 数据结构:单链表(Single Linked List)及其实现
单链表是一种最简单的链表结构,它就像一列火车,每节车厢(节点)都通过挂钩(指针)连接到下一节车厢。数据:存储实际的数据(比如数字、字符串等)。指针:指向下一个节点的地址。数据在内存中不是连续存储的,而是通过指针连接起来的。正因为如此,单链表可以动态地增加或删除节点,而不需要像数组那样移动大量数据。下面是一个单链表的示意图:头指针 -> [10] -> [20] -> [30] -> NULL每个方框代表一个节点,包含数据和指针。指针指向下一个节点,最后一个节点的指针指向NULL。
2025-02-17 13:15:08
1337
原创 数据结构:顺序表(Sequence List)及其实现
顺序表是一种最简单的数据结构,它就像一排连续的小房子,每个房子里都住着一个数据元素。这些房子是按顺序排列的,每个房子都有一个门牌号(下标),我们可以通过门牌号快速找到对应的数据。数据在内存中是连续存储的。正因为数据是连续的,所以我们可以通过下标快速访问任意位置的元素。数组是最基础的数据结构,适合数据量固定、操作简单的场景。顺序表是基于数组实现的“高级版”,适合数据量变化、操作复杂的场景。顺序表是一种简单而实用的数据结构,适合数据量固定且需要快速访问的场景。它的实现简单,但插入和删除操作效率较低。
2025-02-17 11:44:21
1126
原创 IAP学习记录
使用用户的应用程序(也成为Bootloader程序)对闪存进行烧录,该应用程序需要通过一种通信接口(如IO口/USB/CAN/UART/I2C/SPI等)对闪存进行烧录(即把APP程序烧录到闪存)。执行芯片厂商的Bootloader程序进入ISP模式,进入ISP模式后,用户可选择官方提供的烧录通信接口(如:串口),并配合ISP编程工具(如:Flymcu)对闪存进行烧录。5.根据设置的中断向量表偏移量,跳转到APP对应的中断服务函数。1.执行复位中断服务函数后,跳转到IAP程序main函数。
2025-02-16 08:45:00
380
原创 数据结构:队列(Queue)及其实现
队列是一种重要的线性数据结构,它遵循先进先出的原则,常见的操作包括入队、出队、查看队头元素等。通过C语言实现的队列,能够帮助我们解决许多实际问题,如进程调度、广度优先搜索、消息队列、缓冲区管理等。理解队列的实现和应用场景,对于编写高效的程序和解决各种实际问题至关重要。
2025-02-15 14:30:00
891
原创 数据结构:栈(Stack)及其实现
栈是一种遵循LIFO(先进后出)原则的线性数据结构,它的常见应用包括递归函数调用、表达式求值、括号匹配等。本文通过C语言实现了一个基于数组的栈,演示了栈的基本操作:压栈、弹栈、查看栈顶元素、判断栈空和栈满,并附上了详细的注释。栈是一种非常简单但功能强大的数据结构,理解栈的基本操作和应用场景对于学习计算机科学非常重要。栈作为一种数据结构,在许多计算机科学和实际应用中都扮演着重要的角色。
2025-02-15 11:00:00
1796
原创 C语言实现的常见排序算法
冒泡排序(Bubble Sort)冒泡排序是最简单的排序算法之一。它通过重复交换相邻的元素,将最大或最小的元素逐渐“冒泡”到序列的一端。虽然实现简单,但其时间复杂度较高,通常不适用于大规模数据的排序。实现逻辑本文介绍了几种经典的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。每种排序算法都有其特定的优缺点,适用于不同的应用场景。在选择排序算法时,需要根据数据的规模、要求的时间复杂度以及是否需要稳定排序来做出决策。
2025-02-14 11:30:00
765
原创 C语言实现的常见查找算法
本文介绍了四种常见的查找算法,包括线性查找、二分查找、插值查找和跳跃查找。线性查找适用于无序数组,最简单,但效率较低。二分查找适用于有序数组,效率高(O(log n)),但数组必须是排序过的。插值查找适用于均匀分布的数据,性能比二分查找更高,但需要数据均匀分布。跳跃查找适用于有序数组,通过跳跃查找减少查找次数。根据实际需求选择合适的查找算法,可以大大提高程序的性能。
2025-02-14 11:30:00
1199
原创 CAN学习记录
假如不在SS段内,这种情况下,采样点获得的电平状态时不正确的。所以节点会使用硬件同步方式调整,把自己的SS段平移到检测到边沿的地方,获得同步,同步情况下,采样点获得的电平状态才是正确的。CAN(Controller Area Network),是ISO国际标准化的串行通信协议,为了满足汽车产业的“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需求。注意:节点检测到总线上信号的跳变在SS段范围内,表示节点与总线的时序是同步的,此时采样点的电平即该位的电平。如果标识符值相同,邮箱小的先被发送。
2025-02-13 14:48:17
496
原创 通用定时器学习记录
2.定时器PWM输出MSP初始化 HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等。4.设置优先级,使能中断 HAL_NVIC_SetPriority() HAL_NVIC_EnableIRQ()7.编写中断服务函数 TIMx_IRQHandler()等 ---> HAL_TIM_IRQHandler()6.使能捕获、捕获中断及计数器 HAL_TIM_IC_Start_IT()4.使能输入捕获并启动计数器 HAL_TIM_IC_Start()
2025-02-13 14:47:20
894
原创 高级定时器学习记录
7.编写中断服务函数 TIMx_IRQHandler()等 -----> HAL_TIM_IRQHandler()5.设置优先级,使能中断 HAL_NVIC_SetPriority() HAL_NVIC_EnableIRQ()6.使能捕获、捕获中断及计数器 HAL_TIM_IC_Start_IT() HAL_TIM_IC_Start()4.设置优先级,使能中断 HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()如果使能了TDE位,会产生DMA请求。
2025-02-11 16:52:55
677
原创 定时器学习记录
TIM6和TIM7 预分频器(TIMx_PSC):用于设置预分频系数,范围:0~65535,实际预分频系数等于PSC+1。4.设置优先级,使能中断HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()TIM6和TIM7 计数器(TIMx_CNT):计数器实时数值,可用于设置计时器初始值,范围:0~65535。TIM6和TIM7 自动重装载寄存器(TIMx_ARR):用于设置自动重装载值,范围:0~65535。基本定时器:没有输入输出通道,常用作时基,即定时功能。
2025-02-11 16:51:39
514
原创 IWDG学习记录(正点原子)
1.取消PR/RLR寄存器寄存器写保护,设置IWDG预分频系数和重转载值,启动IWDG HAL_IWDG_Init() 寄存器配置步骤1~5。2.及时喂狗,即写入0XAAAA到IWDG_KR HAL_IWDG_Refresh。软件必须以一定的间隔写入OXAAAA,否则计数器为0时看门狗会产生复位。6刷新计数器值为IWDG_RLR的值(IWDG_KR=0XAAAA)写入0X5555表示允许访问IWDG_PR和IWDG_RLR寄存器。1.通过在键寄存器中写入0XCCCC来使能IWDG。
2025-02-10 14:29:59
696
原创 WWDG学习记录(正点原子)
3.设置优先级,使能中断 HAL_NVIC_SetPriority() HAL_NVIC_EnableIRQ。2.WWDG Msp初始化 HAL_WWDG_MspInit() 配置NVIC、CLOCK。4.设置中断服务函数 WWDG_IRQHandler---->HAL_WWDG_IRQHandler。1.WWDG工作参数初始化 HAL_WWDG_Init。6.在窗口期喂狗 HAL_WWDG_Refresh()计数器的值大于W[6:0]值时喂狗会复位。
2025-02-10 13:19:24
151
原创 DeepSeek AI 使用教程|提示词模板 + 视频教程 + 使用技巧
DeepSeek AI 使用教程|提示词模板 + 视频教程 + 使用技巧。✅ 文章创作 | 论文润色 | 编程辅助 | 营销文案 | AI 绘画。🔹 视频教程:手把手教学,助您快速掌握 DeepSeek AI。🔹 提示词模板:精心整理的高效提示词,提升 AI 输出质量。✅ 提升 DeepSeek AI 生成效果。🔹 使用技巧:避免常见问题,提高生成精准度。✅ 掌握高效提示词技巧。有需要可直接私信博主。
2025-02-10 13:14:49
564
原创 串口学习记录
因为介绍的每个位的内容篇幅过长,这里只对几个常用的位进行介绍,其余可通过数据手册查看,控制寄存器2和控制寄存器3内容差不多,这里不介绍,具体看数据手册。有效位为9个有效,具体看控制寄存器所选择的数据位长,设置好控制寄存器和波特率寄存器后,往该寄存器写入数据即可发送,接收数据则读该寄存器。4.设置优先级,使能中断:HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()串行通信:传输速率低,抗干扰能力强,通信距离长,IO资源占用较少,成本低。
2024-10-25 16:58:49
1333
原创 中断学习记录
需要了解的寄存器主要有下降沿触发选择寄存器(EXTI_FTSR)、上升沿触发选择寄存器(EXTI_RTSR)、中断屏蔽寄存器(EXTI_IMR)、挂起寄存器(EXTI_PR)特别注意:配置AFIO寄存器之前要使能AFIO时钟,方法如下:__HAL_RCC_AFIO_CLK_ENABLE();中断优先级寄存器(IPR):8位,240个寄存器,8个位对应一个中断,而STM32只使用高4位。应用程序中断及复位控制寄存器(AIRCR):32位,1个寄存器,位[10:8]控制优先级分组。
2024-10-24 17:56:54
786
原创 GPIO学习记录
端口配置低寄存器(GPIOx_CRL) (x=A..E):设置GPIO的Px0~7,该寄存器用来配置输入/输出模式,以及什么输入/输出模式,MODE为设置输入还是输出,CNF为设置什么类型的输入输出模式,例如设置PA0为通用推挽输出,速度为50MHz,则该寄存器应该为GPIOA_CRL=0X3,在这里还需要说明一下如果设置为上拉/下拉模式时还需要用到端口输出数据寄存器(GPIOx_ODR) (x=A..E)端口配置高寄存器(GPIOx_CRH) (x=A..E):与端口配置低寄存器。
2024-10-24 13:41:18
1680
原创 PWR电源控制
低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式Standby),可在系统空闲时降低STM32的功耗,延长设备使用时间。可编程电压检测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阈值以下或者PVD值以上,PVD会触发中断,用于执行紧急关闭任务。PWR负责管理STM32内部的电源供电部分,可以实现可编程电压检测器和低功耗模式的功能。下降沿阈值:最小值1.8,典型值1.88,最大值1.96V。复位持续时间:最小值1,典型值2.5,最大值4.5ms。
2024-10-18 16:04:00
166
原创 WDG看门狗
还有一种用法就是,即将复位,但是我们可以在中断里执行一些代码进行解决,或者这个任务不是很危险,超时了只想做一些提示,不想让他复位,这样的话就可以在早期中断里阻值复位。看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因出现卡死或者跑飞现象时,看门狗可以技术复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性。T6位作为标志位,当为1是表示为溢出,为0表示溢出,也就是最小值为100 0000(0X40),再次递减时即为011 1111(0X3F),这时溢出,进行复位操作。
2024-10-18 11:18:30
168
原创 BKP和RTC
BKP可用于存储用户应用程序数据,当VDD(2.0~3.6V)电源被切断,他们仍有VBAT(1.8~3.6V)维持供电。RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时。可选择三种RTC时钟源:HSE时钟除以128(通常为8MHz/128)RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲。RTC是一个独立的定时器,可为系统提供时钟和日历的功能。20位的可编程预分频器,可适配不同频率的输入时钟。
2024-10-17 16:44:09
283
原创 SPI通信
四根通信线:SCK(Serial Clock时钟线)、MOSI(Master Output Slave Input主机输出,从机输入线)、MISO(Master Input Slave Output主机输入,从机输出线)、SS(Slave Select片选线)区别就是,硬件波形数据线的变化是紧贴SCK边沿的,而软件波形,数据线的变化在边沿后有一些延迟。交换一个字节(模式0),组合之后总共有4个模式,因为这4种的功能都是一样的,在实际使用的时候主要学习一种就可以了,所以这里只展示模式0。
2024-10-17 13:57:41
734
原创 I2C外设
说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断,可以当作标志位)。说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断)。EV5:SB=1(状态寄存器的一个位,表示了硬件的状态),读SR1然后将地址写入DR寄存器将清除该事件。EV8:TxE=1,移位寄存器非空,数据寄存器空,写入DR寄存器将清除该事件。
2024-10-16 15:37:02
477
原创 I2C通信
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述8次,即可接收一个字节。发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述8次,即可发送一个字节。对于指定设备(Slave Adress),在当前地址指针指示的地址下,读取从机数据(Data)
2024-10-16 10:49:24
283
原创 DMA学习记录
外设寄存器,存储各个外设的配置参数,也就是我们初始化各个外设,最终所读写的东西。只读存储器,是一种非易失性,掉电不丢失的存储器。程序存储器FLASH,也就是主闪存,用途是存储C语言编译后的程序代码,也就是下载程序的位置,运行程序一般也是从主闪存里面开始运行的,STM32给它分配的地址是。DMA可以提供外设和存储器或者是存储器和存储器之间的高速数据传输,不需要CPU干预,能够节省CPU的资源。因为只有一条DMA总线,所以这里有仲裁器,仲裁器实际就是认定谁的等级高,等级高的优先通过,优先使用。
2024-10-15 15:15:10
406
原创 嵌入式笔试
1.输入一个长度为10的数组,最大的与第一个元素交换位置,最小的和最后一个元素交换,并输出数组。2.写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出长度。3.求一个3*3矩阵对角线元素之和。
2023-11-23 14:45:15
222
原创 嵌入式面试常见问题及答案
答:首先单片机中断处理有三个部分,第一个部分是中断响应,第二个中断处理,第三个中断返回,然后具体的过程是首先中断系统通过硬件自动生成长调用指令(LACLL),该指令将自动把断点地址压入堆栈保护,然后将对应的中断入口地址装入程序计数器PC,使程序转向该中断入口地址,执行中断服务程序。该指令的功能是把断点地址从堆栈中弹出,返回到程序计数器PC,此外,还通知中断系统已完成中断处理,并清楚优先级状态触发器。答:存储内容不同,管理方式不同,空间大小不同,能否产生碎片不同,生长方向不同,分配方式不同,分配效率不同。
2023-11-01 19:11:34
3472
1
DeepSeek彻底火了,如何用,有多强,一文带你看懂
2025-02-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人