- 博客(106)
- 收藏
- 关注

原创 低功耗蓝牙BLE的详细解读(2024 7.29更新)
其实学习单片机在我目前看来最重要的知识点无非有两个,第一个为微操作系统的移植,第二个为通讯技术的使用。前者可以降低系统的响应时间,通过任务优先级与任务调度的处理可以清晰化开发逻辑。第二个通信技术的使用才可以达到通过无线设备进行操纵,毕竟是万物互联的时代。至于微操作系统可学的有国外的freetos与国内的开源openharmony。通信技术则需要都熟练掌握,主流的协议有蓝牙协议和WiFi协议。现在这个专栏就是记录初步了解蓝牙技术的相关知识点。
2024-04-30 18:20:00
6554
6

原创 基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制总结版(11.22)
实现效果:当仅绿灯亮时,第一次长按按键绿灯状态改变,再次长按按键绿灯会往相反的方向变化,并且在达到极点时,停止调节。蓝灯与绿灯的亮度相互独立,互不影响。在两灯均亮的时候,此时长按按键依旧会造成亮度的改变,但是会由于亮度在前面单独调节不同导致调节所到极点的时间不一样。但是共同点在调节到极点时如果不松开按键亮度均不发生变化。直至双灯亮度均达到极点,此时系统亮度恒定。
2023-11-22 18:18:57
272

原创 移植FreeRTOS的STM32F103双轮平衡小车(开源,代码文末)
利用stm32f103作为主控,移植FreeRTOS来进行实时任务调度本设计是一个具有自动调节平衡功能的两轮小车。由MPU6050模块、1.44寸LCD显示屏、TB6612电机驱动模块、霍尔电机、航模电池供电电路等模块组成。本项目研究一种使用单片机PID算法的自平衡方案。这种方案后续可以制作成为自平衡代步工具,自平衡自行车等等。其实通俗一点来说,这个模块就是用来测量小车的各姿态角在讨论姿态角之前我们可以了解一下机体坐标系机体坐标系小车的姿态角——欧拉角。
2023-09-22 16:33:46
3954
7

原创 C语言基础知识点(六)二维数组指针和地址
在C语言中,数组名是一个指向数组第一个元素的指针,即其本身代表了该数组第一个元素的地址。是二维数组的第一行,是指向第一个元素的指针。是指向第一行的指针,解引用两次后得到第一行的第一个元素;是指向第二行的指针,解引用两次后得到第二行的第一个元素。是指向第一行的指针,解引用后得到第一行的第一个元素;是指向第二行的指针,解引用后得到第二行的第一个元素。是第一行的第一个元素,解引用后得到该元素的值;是第一行的第二个元素,解引用后得到该元素的值。是第二行的第一个元素,解引用后得到该元素的值;
2023-09-15 22:13:43
589

原创 全地形越障排爆小车
SCCB(Serial Camera Control Bus ),为串行相机控制总线。与I2C协议极为类似。SCCB 的起始信号、停止信号及数据有效性与 I2C 完全一样。1.起始信号: 在 SCL(图中为 SIO_C) 为高电平时, SDA(图中为 SIO_D)出现一个下降沿,则 SCCB 开始传输。2.停止信号:在 SCL 为高电平时, SDA 出现一个上升沿,则 SCCB 停止传输。3.数据有效性:除了开始和停止状态, 在数据传输过程中,当 SCL 为高电平时,
2023-08-26 11:56:27
1637
2

原创 STM32移植FreeRTOS系列十三:RTOS中的任务切换流程(总结)
在了解PendSV(可悬起系统调用)前,需要对SVC(系统服务调用,亦简称系统调用)有一个基本的概念。SVC 用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。
2023-07-09 16:24:13
4681
1
原创 力扣C语言刷题记录(四)加一
题目描述给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。示例2:输入:digits = [4,3,2,1]输出:[4,3,2,2]解释:输入数组表示数字 4321。示例 3:输入:digits = [9]输出:[
2024-12-04 09:53:50
546
原创 力扣C语言刷题记录(三)搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为。
2024-12-03 17:59:32
302
原创 力扣C语言刷题记录 (二)移除元素
官方解答在每次遍历到符合条件的元素时,从后往前使用数组尾部的元素覆盖掉该元素。// 它以不等于 val 的值排序。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。// 长度正确的预期答案。// 排序 nums 的前 k 个元素。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你的函数函数应该返回 k = 2, 并且 nums。如果所有的断言都通过,你的解决方案将会。
2024-12-03 14:53:10
462
原创 力扣C语言刷题记录(一)两数之和
但是当函数返回时,局部数组的生命周期结束,其内存将被释放或重用。这意味着返回的指针将指向不确定的内存,也就是我们常说的野指针。因此无法正常返回数据。修改为使用动态内存分配来创建一个数组,使得该数组在函数外部也是有效的。在对第二个符合条件的数时进行遍历,可能会重复与自身相加。在创建数组并对数组进行初始化时使用的是显式初始化。
2024-12-03 14:44:36
266
原创 c语言基础知识点(十五)C语言中的指针+1与指针的二进制表示+1的区别
给一个指针加上一个整数与给该指针的二进制表示加上同样的整数,这两者之间存在本质的区别,主要体现在操作对象、操作意义以及结果上。
2024-11-13 20:19:40
444
原创 C语言基础知识点(十四)C语言中对常量进行类型转换的操作
(void (*)())0 的实际含义就是:将常数0转型为“指向返回值为void的函数的指针”。的函数的指针),并将其初始化为上述转换后的结果,即一个空函数指针。(即指向不接受参数且返回。
2024-11-13 19:55:15
406
原创 C语言基础知识点(十三)结构体的深拷贝与浅拷贝
在C或C++等语言中,结构体(Struct)是一种用户自定义的数据类型,它允许将不同类型的数据项组合成一个单一的类型。对于结构体的拷贝,存在深拷贝(Deep Copy)和浅拷贝(Shallow Copy)两种概念,这两种拷贝方式在处理结构体(特别是包含指针成员的结构体)时尤为重要。
2024-08-05 20:05:09
905
原创 减速电机的减速比计算原理
这里的2号齿轮与3号齿轮同轴,4号齿轮与6号齿轮同轴,7号齿轮与8号齿轮同轴,9号齿轮与输出的电机转轴同轴。同轴的齿轮在单位时间内转过的圈数一致,而边缘水平贴合的齿轮在单位时间内所转过的齿数一致。今天因为看到减速电机的内部中有通过齿轮来增加扭矩的结构,想找点原理性的文章来看一下,奈何遍寻不得。减速比为64,我的理解是在初始的齿轮转一圈的时候,最后的齿轮会转1:64圈。所以当初始的齿轮转64圈时,最后的电机才会转1圈。1s内,当输入轴转动269圈时,输出轴接近转动1圈。对该电机上的齿轮进行标注。
2024-08-05 20:03:42
910
原创 SSH实现电脑VScode免密登录到虚拟机其原理
在SSH免密登录的过程中,私钥并不是直接用来“解密”公钥加密的文件或挑战。这里的“解密”过程实际上是利用了非对称加密技术的特性,其中公钥用于加密数据,而对应的私钥用于解密这些数据。这是非对称加密技术的核心原理之一。
2024-08-01 20:37:50
1195
原创 计算机底层知识点(一)晶体管与CPU执行指令之间的联系
此时我们需要一个二进制解码器,将读取到的指令进行解码从而去进行操作对应的单元。这里的每个组合在接收到我们所希望的输出位置的二进制数后,都会触发要激活的特定输出,同时停用所有其他输出。一个晶体管中,通常有三个端子,一个集电极,一个发射极和一个电路中的基极,它可以充当绝缘体,防止电流在集电极和集电极之间流动。这意味着CPU可以同时处理多条指令的不同阶段,但每条指令的执行仍然是串行的(即一次只能执行一条指令的一个阶段)。我们的神秘组件也可以装在一个盒子里,这是一个基本的以及被称为算术逻辑的东西的不完整版本。
2024-08-01 20:36:12
1315
原创 工程踩坑指南(6.12更新)
1、在进行值的传递时要注意传递的是指针还是值。谨记,在不需要对传入的参数进行操作,例如仅仅只是打印或者。读取值时采用将参数拷贝下来的形式,拷贝函数可以使用。为了防止重复踩坑,现在将踩的坑分点记录下来。
2024-04-11 12:13:42
177
原创 FreeRTOS系列总结篇
主要是针对优先级不同的任务,优先级高的任务会抢占优先级低的任务:主要是针对优先级相同的任务,当多个任务的优先级相同时,任务调度器就会在时钟节拍到时切换任务。同等优先级任务轮流享有相同的CPU时间,叫时间片,在FreeRTOS中,一个时间片等于SysTick中断周期。:当前执行任务将一直运行,同时高优先级的任务不会抢占低优先级任务。
2024-04-07 12:18:51
372
原创 C语言——链表
本来想自己总结一个,但是这位博主已经写的很好了·按照我的理解就是数组存放在连续的内存空间中,方便进行访问但是不方便进行插入和删除。就好比一排凳子大家贴着坐,当插入或者删除时,此时在后面位置的人都需要随之移动。而链表的元素是通过指针来进行访问,大家存放的位置也就是地址在内存空间是不连续的。此时的排序改变的话,就会起连锁反应。大家的序号的会改变,但是不需要挪位置。也就大大减轻了CPU的压力。
2024-04-07 12:17:56
237
原创 FreeRTOS系列目录总结
写个目录,方便大家进行跳转FreeRTOS系列一:FreeRTOS移植实验_stm32f103 freertos开发手册v1.1-优快云博客FreeRTOS系列二:FreeRTOS系统配置_configsystick_clock_hz-优快云博客FreeRTOS系列三:动态任务创建和API函数介绍和实战编程_freertos动态分配任务-优快云博客FreeRTOS系列四:动态任务的创建和删除详细过程(函数解析)_while( uxdeletedtaskswaitingcleanup > ( ubase
2024-04-02 18:33:41
644
原创 FreeRTOS系列补充1:重点记忆知识点
FreeRTOS采用抢占式优先级调度策略。任务根据其优先级进行调度,优先级高的任务会抢占优先级低的任务的执行权。FreeRTOS使用任务控制块(Task Control Block,简称TCB)来管理任务信息和状态。调度器根据任务的优先级和状态进行任务切换。
2024-04-01 18:28:10
851
原创 FreeRTOS系列补充2:重点API函数的应用代码范例(特特特详细)
其实在网上已经有很多相关的博文了,不过我还是决定自己动手来记录一下。按照之前的经验,需要达到的目的为切题,详细。否则回看的时候不清楚。好多,整理的好累。应用场景:FreeRTOS在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。
2024-04-01 18:25:46
1405
原创 计算机中的代码内存分布位置
中的,这里也说明一点,并不是所有用 const 修饰的变量都是存放于只读变量区的(const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:val_c;,flash里面的数据掉电可保存,sram中的数据掉电就丢失,sram的执行速度要快于flash,flash容量大于sram。当调用函数的时候函数中定义的变量会被加到栈中,当函数离开的时候,被添加的变量会从栈中移除,栈在最高的地址上,所以添加的变量地址会逐渐变小,里面的内容可读可写。
2024-03-28 20:31:41
1012
原创 Windows 删除文件 - 解决提示需要xxx权限才能删除文件(全网最简单)
比如直接删除名称为1的文件夹删除不掉,那么就可以双击进入到里面,一层一层删。其实这个问题解决很简单。只要一层一层删除就好了。
2024-03-28 14:20:18
489
原创 C语言基础知识点(十八)联合、
联合的成员是遵循字节对齐,共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。在C语言中是一种数据类型,能在同一个内存空间中存储不同的数据类型(不是同时储存)。使用联合类型的数组,其中的联合都大小相等,每个联合可以存储各种数据类型。典型用法:设计一种表以存储及无规律、实现也不知道顺序的混合类型。这次采用在代码结果里加入注释来进行讲解,希望会更加直观。
2024-03-21 15:48:21
330
原创 C语言基础知识点(十七)结构体中只用指针来存储字符串
分配了足够的内存空间来存储用户输入的名字和姓氏,并使用。函数将用户输入的字符串复制到这些内存空间中。
2024-03-21 14:55:02
311
原创 C语言基础(十六)通过指针来输入和获取结构体的变量值
其实就是通过定义形参,然后取定义好的结构体变量的地址传递进函数,然后在函数中通过指针变量所导入的地址的值进行操作。:该函数用于展示用户输入的名字、姓氏以及字母的总数。:该函数用于获取用户输入的名字信息。,其中包含了用户的名字和姓氏以及字母的个数。函数安全地获取用户输入的字符串,并计算名字中字母的总数。:该函数用于计算名字中字母的总数。的字符数量,然后将它们相加,并将结果存储在结构体变量的。函数来读取用户输入的字符串,并在需要时去掉换行符。:该函数用于安全地获取用户输入的字符串。(存储姓氏的数组)和。
2024-03-21 14:13:46
697
原创 C语言基础知识点 (十五) 结构体中的字符数组和字符指针
读取字符串到这些字段时,会涉及到未分配的内存地址,从而导致程序运行时错误。,而不是数组类型,因此它们并没有被分配内存空间来存储字符串。通过字符指针来存储的字符串并没有分配内存空间来存储字符串,使用。,这意味着它们有固定大小的内存空间来存储字符串。,以确保有足够的内存空间来存储字符串。,并且要确保输入的字符串不会超出预分配的内存空间。今天在学习字符数组和字符指针来储存字符串时发现。可以使用指向char的指针来代替字符数组,但是。读取字符串时,最好使用安全的输入函数,如。来向这些字段中读取字符串是安全的。
2024-03-20 11:57:14
760
原创 C语言基础知识点(十四)求模符号%
今天继续看基础,发现这个求模符号可以对正数取模也可以对复数取模。求模运算符的作用是给出左侧证书除以右侧证书的余数。如果第一个运算对象是正书,那么求模的结果也是正数。负数求模规则:如果第一个运算对象是负数,那么求模的结果为负数;求模预算符只能用于整数不能用于浮点数。
2024-03-19 11:39:31
827
原创 C语言基础知识点(十)编译器中栈的属性与数组元素的地址存放关系
我们可以看到,在该编译器中栈的开口往下,地址由高往低生长,先在高的地址存放放进来的变量,再到低的地址存放后放进来的变量。就好像指针变量ptr2的地址比ptr1低。但是数组由于本身的特性,下标大的反而会比下标小的地址更高,不受栈开口方向影响。今天在看C语言基础知识点时遇到一个很有趣的问题,我们先看一眼代码。
2024-03-18 15:49:07
424
原创 C语言基础知识点(十一)printf的转换说明
f 单精度浮点数(默认float)、十进制记数法(%.nf 这里n表示精确到小数位后n位.十进制计数)%d 有符号十进制整数(int)(%ld、%Ld:长整型数据(long),%hd:输出短整形。%d就是输出的时候的占位符,占a的位 表示以十进制整数形式输出a。%s 对应字符串char*(%s == %hs == %hS 输出 窄字符)%d是用来指定输入和输出时的数据类型和格式,表示“以十进制整数的形式输出”。%S 对应宽字符串WCAHR*(%ws == %S 输出宽字符串)
2024-03-18 10:31:07
719
原创 基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.20)
現在的思路是建立一个变量,在按键按下时会进行累加,然后在按键松开的时候对这个变量的值进行判断。就可以判断。但是现在发现短按时灯会短暂熄灭又亮起。测试发现该问题偶发性。
2023-11-21 14:11:50
120
原创 基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.17,PWM控制与状态切换)
看了两天文档才慢慢看懂,有点满了现在接着前一天的思路,可以通过代码来控制pwm的占空比。我这里采用的是TP0定时器。
2023-11-18 17:41:20
454
原创 基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.17,PWM)
紧接上文,基本的控制逻辑并不难写,难的是是、如何输出自己想要频率的PWM波在对应的端口阅读文档定时器与PWM相关的寄存器,因为之前玩的STM32,所以看起来还是有点困难,准备边看边记录。如果想要实现在长按时改变PWM,短按时改变状态。那么只需要在按下按键后隔一段时间检测按键是否松开,如果松开代表是短按,如果没松开那么视为长按事件源代码相关理解void TC0_INIT(void){ TC0H = 0XFF; //PWM高电平占空比,定时器高8位 TC0L = 0X07; //
2023-11-18 10:20:36
120
原创 基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.15)
关机状态时白灯亮蓝灯灭,此时长按按键无反应,白灯亮度降低的状态,蓝灯保持灭的状态。点按按键一次,白灯熄灭,蓝灯亮此时W引脚控制的灯亮。继续点按按键。蓝灯亮,此时W引脚控制的灯灭,Y引脚控制的灯由灭到亮。再短按一次W引脚、Y引脚控制的灯与蓝灯齐亮。在开机状态时可以通过长按按键来控制W引脚、Y引脚控制的灯亮度。解决方案,采用其他版本的IDE。
2023-11-15 17:52:32
209
原创 11.13/14 理解SDK框架遇到的问题
printf("绿色值每一次增量------%f\n", red_increment);希望采用 %.2f打印出每次的步进值。希望采用 %f打印出每次的步进值。希望采用 %df打印出每次的步进值。后面三个参数均为u8类型。
2023-11-14 09:04:28
352
1
原创 状态机实现RGB灯跳变
首先需要定义系统可能存在的所有状态,通常用枚举类型来表示。同时需要定义可能发生的所有事件,例如输入的数据、定时器到达等。使用switch-case if-else 函数指针等语句来定义状态转换和动作。当事件发生时,判断当前状态,并根据不同的事件执行相应的动作,并将状态转换为下一个状态。
2023-11-10 17:55:49
202
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人