自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 数组与指针的初遇

数组与指针有许多相似的地方,同时也有很多联系。首先,数组名是数组第一个元素的地址。通过指向数组的指针便可以轻松调取里面的值。

2024-07-20 18:45:00 107

原创 C语言小知识(后续会补充)

在C程序里,以“#”字符开头的代码行都是一条C预处理器语句。比如将0和1定义为OFF和ON,那么之后程序里所有的OFF和ON在预处理时都会替换为0和1。4.链接:将目标文件与库文件链接,生成可执行程序。(.o->.exe等可执行文件)1.预处理:处理#开头的预处理指令,生成经过宏替换的源文件。2.编译:将预处理后的源文件翻译成汇编文件。补码可以简化计算机的计算过程,正数的补码是该数的二进制形式。变量和宏同理,也会在预处理时被替换为变量所代表的数据。3.汇编:将汇编文件转换为目标文件。变量是给数据取的名字。

2024-07-19 12:30:00 200

原创 该死的运算符

运算符根据操作数的多少大体上可以分成三类,单目、双目以及三目,也就是说运算符的单目与双目取决于有多少个操作数。操作数,也就是参与运算的数,比如1+1,这里面就有两个操作数,而 + 也就是双目运算符。从功能上分类,运算符分为算数运算符,逻辑运算符,关系运算符和赋值运算符。大部分的运算顺序都是从左往右,少部分则会反过来。很多文章对运算符的优先级讲得都很明白,优先级表就不贴出来了。在本人看来,多练就掌握了,部分不太好记的会在实验中展示。

2024-07-18 12:01:08 141

原创 数据类型与转义字符

其中bool(布尔)类型是C99新添加的数据类型,只返回ture(1)和flase(0)两个值。比特位(bit),是CPU能读取的最小单位字节(Byte),内存最小寻址单位。

2024-07-17 20:40:49 314

原创 重新学习STM32(2)NVIC

NVIC,即嵌套向量中断控制器,控制着中断相关的功能,是内核里面的一个外设。中断在单片机编程中的作用是使单片机能及时响应需要立即处理的事件,但是这些事件也分紧急和非紧急,因此需要优先级来区分。优先级分为主优先级和子优先级,其中主优先级又叫抢占优先级(后面主优先级全部称为抢占优先级),当同时有多个时间产生中断时,比较抢占优先级,该优先级高的先响应,抢占优先级相同的比较子优先级。优先级分组如下图。

2024-06-07 22:16:40 638

原创 重新学习STM32(1)GPIO

GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚。STM32 芯片通过 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。所有的 GPIO引脚都有基本的输入输出功能,也就是说,所有GPIO引脚都有收发数据的能力。GPIO最基本的输出功能是通过 STM32 控制引脚输出高、低电平,进而实现例如控制 LED 灯的亮灭的功能。GPIO最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过电平高低区分按键是否被按下。

2024-06-07 18:09:07 518

原创 重新学习stm32(序)stm32简介

寄存器映射简单来说就是我们可以先找到每个外设内存的起始地址,根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,然后通过 C 语言指针的操作方式来访问这些单元,这个别名就是寄存器,取别名的过程就叫寄存器映射。32 表示 32 位。这 4GB 的地址空间中, ARM 已经大体上的平均分成了 8 个块(Block),其中片上外设的地址在Block2中,我们在实际编程中通过修改这部分的地址来控制外设,进而实现各种各样的功能。在编程的时候,我们一定要注意好我们所选择的外设挂载在哪根总线上。

2024-06-07 17:38:50 475

原创 基础摄影知识

风光 光线不足,ISO 200以下。有明显参照物如地平线等,不要拍歪。九分身,到小腿部分,人像显高。中景,七分身,到大腿部分。F光圈越大,景深越浅。

2024-06-07 16:55:42 114

原创 MQTT协议

在MQTT协议使用的过程中,服务器会保存一些重要的消息,此时cleanSession的值为flase,即保存数据,ture代表清除数据。同样的,该确认也是一个数据包,叫做CONNACK。MQTT是一种比http更简单的顶层协议,在MQTT组成的协议中,网络一般为中心分布型,所有设备节点既可能是发布者,也可能是订阅者,他们都会连在中心服务器上。发布者将需要发送的内容放在消息中发出,消息中蕴含的内容叫负载(Payload),负载一般也是字符串,发布者将消息发布后,订阅者只需要订阅该主题就能获取消息。

2024-05-23 14:14:19 455

原创 FreeRTOS逻辑梳理

因为是多任务系统,所有需要执行的任务都会放在就绪列表里,因此任务之间肯定会有优先级的区分。优先级会帮助操作系统确定哪个任务需要优先执行,如果有任务优先级相同,那么按优先级排序轮到他们这个优先级执行的时候,会轮流执行一段时间。列表即链表,FreeRTOS中的链表都是首尾相连的环形链表,链表上还可以如果把FreeRTOS比作人,那么列表就像骨骼一样,操作系统的血肉都需要以列表为基础进行构建。上面说到任务会在延时的时候挂起,这个时候我们会将需要挂起的任务从就绪列表中拿走而不是移除,因为这个任务还需要执行。

2024-04-25 18:00:00 236

原创 跟着野火从零开始手搓emWin(2)emWin 在 Windows 上仿真

emWin 的 Windows 仿真版本是免费的,大家可以直接在 Segger 官网下载,下载链接:https://www.segger.com/downloads/emwin/。这里通过 VS 2019 运行仿真工程,使用的emWin是5.48版本。

2024-04-24 19:00:00 677

原创 跟着野火从零开始手搓emWin(1)初识emWin

PS:在嵌入式领域,本人认为QT的应用范围和性能几乎吊打市面上所有的GUI工具。但是本人之所以学习emWin,是因为自己有些微不足道的小想法,需要通过它来实现。但是QT有点吃硬件的配置,为了MCU专门发行的QT我又懒得去弄(玩嵌入式的多少都知道装QT的痛),所以我选择emWin。因为很大一部分原因是出于爱好,所以这个系列会更新的很慢。这一篇算是简单介绍,没什么有营养的东西,可以直接跳过。

2024-04-24 06:00:00 512

原创 跟着野火从零开始手搓FreeRTOS(6)多优先级的配置

首先需要定义空闲任务的优先级,还要定义一个表示创建任务的最高优先级的静态变量uxTopReadyPriority,默认这个变量的值为0,即空闲任务的优先级。/* 空闲任务的优先级,task.h定义 *//* uxTopReadyPriority,定义task.c定义 */

2024-04-23 18:00:00 989

原创 浅谈架构方法之时间片轮询

如果我们把TaskRemarks()放到SysTick的中断服务函数中,那么当这个中断执行的时候,滴答计时器的计数就会重置,同时TaskRemarks()函数也会重新执行,从而达到时间片轮询的效果。裸机系统能够处理一些相对简单的任务,但是功能单一,只会一直按顺序执行死循环里的任务,CPU只会全力做完一件事才会进行下一项任务,延时的时候也只会等待,浪费资源。操作系统的实时性和可靠性高还能同时执行多个任务,但是操作系统较为复杂,需要额外的学习成本,而且其对内存空间的要求需要我们注意内存的大小。

2024-04-22 17:06:03 677 1

原创 c8t6+DHT11测量温湿度+串口显示

最小系统和温湿度传感器DHT11连接,并通过CH340模块在电脑串口助手上打印返回消息。

2024-04-18 18:00:00 656

原创 摄影构图方法

常见引导线有栏杆,脚印,河流,墙等,引导线的要求是有明确边缘的物体。沿着画面竖直居中线或水平居中线构图,视觉舒适简单,画面平衡舒服,多用于有镜面对称的地方,例如水面和对称的建筑。在实际使用中不要刻意去追求构图而忽略实际场景的情况,但同时也可以将多种方法结合在一起,在实际拍摄上经常用的到,效果也很好。画面中有在对角线上的主体或平行于对角线的元素,常用于要表现一定程度情绪的人物照片,使画面有明显的线条感。摄影是光的艺术,而艺术从来都不是刻板的,有时候也可以按自己的感觉去拍,往往会有意想不到的惊艳。

2024-04-17 22:20:00 328

原创 从零开始手搓ZigBee(1)系统硬件介绍

ZigBee节点两个(不带天线);stm32c8t6最小系统板两个;ZigBee节点一个(带天线);温湿度传感器DHT11两个;

2024-04-14 00:03:09 117

原创 stm32报错问题集锦

而STM32F103VE的FLASH在128到256之间,所以最开始的启动文件是带hd的。上图显示的报错是ADC的中断相关部分出了问题,但实际上这个报错的原因是不同型号的芯片之间,他们的FLASH即闪存大小不同导致的。低容量:16KB 、32KB ,选择 startup_stm32f10x_ld.s 或 startup_stm32f10x_ld_vl.s。中容量 :64KB、128KB ,选择 startup_stm32f10x_md.s 或 startup_stm32f10x_md_vl.s。

2024-04-13 23:42:47 689 1

原创 跟着野火从一开始手搓FreeRTOS(2)创建任务

任务就是无限执行的函数,在main.c中定义任务:让LED1以500ms的频率闪烁。/* 延时500个tick */LED1_OFF;/* 延时500个tick */这里的延时函数必须使用 FreeRTOS 提供的延时函数,不要使用我们裸机编程中的软件延时。vTaskDelay()会让当前任务被阻塞转而去执行其他任务;而裸机的延时会让CPU陷入死循环,一直在执行当前任务无法跳出,无法实现多任务系统。

2024-04-11 18:00:00 1054

原创 PS技巧笔记

新建色相饱和度图层,选择图层面板的手,在头发反光明显的位置单击向左拖动,降低饱和度,适当提高明度,ctrl+I,画笔白色对调整部位进行绘制,添加纯色填充图层,混合模式颜色,点击蒙版,ctrl+I,在需要的地方进行绘制,用吸管选择头发上原有的颜色,色相饱和度图层降低不透明度,新建曲线调整图层,加深头发颜色,选择其蒙版,ctrl+I,画笔白色,加深适当位置,提高光泽感,为了更自然,为所有蒙版添加一些羽化。新建图层,修复画笔工具,样本选中所有图层,进行修复,降低不透明度,与原图层混合,降低失真度。

2024-04-09 22:47:29 149 1

原创 跟着野火从零开始手搓FreeRTOS(5)空闲任务与阻塞延时

栈和TCB的内存空间均在main.c中定义。任务栈是一个定义好的数组,大小由中定义的宏 控制,默认为 128, 单位为字(byte),即 512 个字节(bit)。/* 定义空闲任务的栈 *//* 在FreeRTOSConfig.h中定义 *//* 获取空闲任务的内存 *//* 在main.c中定义 *///定义空闲任务发任务控制块。

2024-04-09 18:00:00 621 1

原创 跟着野火从一开始手搓FreeRTOS(外)错误集锦

PS:本篇负责记录在移植过程中碰到的问题,会不定时更新。

2024-04-07 18:00:00 246

原创 跟着野火从一开始手搓FreeRTOS(1)FreeRTOS移植

MemMang 文件夹下存放的是跟内存管理相关的,也是直接复制即可。这五个 heap 文件在移植的时候必须使用一个,因为 FreeRTOS 在创建内核对象的时候使用的是动态分配内存,而这些动态内存分配的函数则在这几个文件里面实现,不同的分配算法会导致不同的效率与结果,这里先选用。进行了中文注释,所以我以野火采用的9.0.0版本,这个版本的源码已经在野火的资料中包含了,所以我就直接拿来用了。我是通过官网下载的。首先是source,这些源文件和两个文件夹里的文件负责操作系统与硬件间的连接,是通用的。

2024-04-06 18:00:00 1102 1

原创 从零开始手搓ZigBee毕设(序)系统框架及功能

本系统主要是通过将stm32与ZigBee模块组合成的节点连接传感器来收集数据,然后上传到ZigBee网关,通过网关连接的WiFi模块将数据上传到阿里云,并将数据进行可视化处理后,使得用户可以通过电脑端和手机端查看。

2024-04-05 23:56:36 202 1

原创 跟着野火从零开始手搓FreeRTOS(4)临界段的概念及应用

在FreeRTOS中,系统调度也就是 PendSV 中断,所以对临界段的保护还是在于对中断的开和关的控制。带中断保护的开中断函数, 将上一次关中断时保存的 BASEPRI 的值作为形参 ,与 portSET_INTERRUPT_MASK_FROM_ISR()成对使用。不带中断保护的开中断函数, 直接将 BASEPRI 的值设置为 0,与portDISABLE_INTERRUPTS()成对使用。在 FreeRTOS 中,对临界段的保护出现在两种场合,一种是在中断场合一种是在非中断场合。下面是不带返回值的。

2024-04-05 20:45:00 876 1

原创 跟着野火从零开始手搓FreeRTOS(3.2)就绪列表与调度器的实现

任务创建好之后,我们需要把任务添加到就绪列表里面, 表示任务已经就绪,系统随时可以调度。就绪列表在。

2024-04-03 18:00:00 878 1

原创 跟着野火从零开始手搓FreeRTOS(3.1)任务的了解与创建

我们要实现两个变量按照一定的频率轮流的翻转,每个变量对应一个任务,所以需要定义两个任务栈。任务栈其实就是一个预先定义好的全局数据,我们可以直接在main.c中定义,也可以放在FreeROS.h中。我这里是放在了main.c中。任务栈(TaskxStack)数据类型为StackType_t,大小由 TASK1_STACK_SIZE 这个宏来定义,默认为 128,单位为字,即 512字节,这也是 FreeRTOS 推荐的最小的任务栈。

2024-04-01 18:00:00 865 1

原创 神秘的指针

在C语言中,系统会为变量分配对应长度的空间,编译器可以通过变量名来访问这个变量。当要读取某个变量时,编译器根据变量名所在的地址和数据类型读取数据。一般的变量存的是数据,而指针变量存的是地址,这个被存放的地址就是指针,存放这个地址的变量,就是指针变量。指针变量的类型就是存放地址指向的数据类型。指针占四个字节的大小,用于存放地址。当编译器要调用指针存储的数据时,由于指针变量存放的是地址,所以会直接得到这个地址里的数据。pa = &c;

2024-03-28 19:44:24 311 1

原创 跟着野火从零开始手搓FreeRTOS(2.3)实验演示

PS:这两天要对之前的项目进行修改,最近这几天应该不会更新下一部分的任务了。至于debug不会的兄弟,我之后会在补课专栏里稍微讲一下。这部分没什么说的,基本上就是新建上节点,插入链表中。然后在魔术棒里选择软件仿真,这点在新建工程的时候就提过了。这个实验主要是验证链表的使用,因此只要查看运行结果即可。由上图所示,我们可以发现结果和我们所设置的完全符合。

2024-03-25 23:02:25 326 1

原创 跟着野火从零开始手搓FreeRTOS(2.2)链表的初始化和插入

* 节点结构体定义 *//* 辅助值,用于帮助节点做顺序排列 */ (1)/* 指向链表下一个节点 */ (2)/* 指向链表前一个节点 */ (3)/* 指向拥有该节点的内核对象,通常是TCB */ (4)/* 指向该节点所在的链表 */ (5)/* 节点数据类型重定义 */ (6)(1)xItemValue是一个辅助值,用于帮助节点做顺序排列。该辅助值的数据类型为TickType_t。因为我们已经移植好了头文件,所以TickType_t并不会报错。

2024-03-22 22:55:16 714 1

原创 结构体的定义和应用

在上述代码中,便采用了在定义结构体是顺便声明的方式。需要注意的是,如果结构体在main函数外定义,那么此处的声明就是全局变量。结构体是多个数据类型组合在一起的结合体,能够同时存放多种数据类型包括数组,并且引用方便,能大量节省代码行。在实际开发时,省去代码行能够增强程序的稳定性,而且便于修改,方便阅读程序。PS:本专栏文章基本上都是基于本人的理解而作,后续可能会进行内容的填充和优化。此外,也可以在结构体声明的时候加在末尾。具体应用会在下面展示。接下来是结构体嵌套,就是将一个结构体声明塞在另一个结构体里面。

2024-03-22 22:47:10 203 1

原创 跟着野火从零开始手搓FreeRTOS(2.1)列表与列表项简介

链表首尾相连的,成一个环形,仿佛圆形的晾衣架。链表上的每个节点就像衣架上面的钩子,钩子本身没什么东西,但是可以挂很多不一样的东西,比如衣服、袜子、毛巾之类的。正如节点一样,节点指针将节点连接起来,并携带不同类型的数据挂载在链表上,数据类型可以为int、float、char等。链表常规的操作就是节点的插入和删除,为了顺利的插入,通常一条链表我们会人为地规定一个根节点,通常根节点还会有一个节点计数器,用于统计整条链表的节点个数。链表由几个节点相连而成,节点由节点指针和携带的数据组成,节点指针指向下一个节点。

2024-03-21 19:39:20 357 1

原创 链表是什么

而指针就像车厢之间的连接器,连接着相邻的每一节车厢。在内存上,数组是连续的一段地址,由于在应用时很难确定实际要用到多少内存,所以很容易造成内存的浪费。PS:最后向大家推荐一下我这部分参照的B站up主——图码,他的视频结合代码和动画,视频简单易懂,目前还在更新数据结构的部分,希望大家能多支持一下他~(我真不是打广告的。简单来说,每个节点由数据、指针和私有信息(后面会讲到,这里先忽略)组成,几个节点相连就组成了链表。需要注意的是,节点可以挂载携带很多类型的数据,但是它们本身并不能存储多少数据。

2024-03-20 22:27:31 186 1

原创 跟着野火从零开始手搓FreeRTOS(1)新建工程

在MDK中新建工程,选择使用的芯片型号,我这里选的是ARM-CM3,然后在弹出来的表格中选择CMSIS下的CORE和Device下的Startup,点击OK。需要注意的是,portable内的文件是需要从野火的例程拷贝的,在第一部分的7到12的工程里都有这个文件夹,因为我对“freertos”文件夹重命名了,所以和我的名字不同。首先新建文件夹,我新建文件夹 “mine” 存放我所有的工程。在user文件夹下新建“main.c”文件并添加到user下,编写main函数并编译。至此,工程新建完成。

2024-03-20 21:39:39 194

原创 跟着野火从零开始手搓FreeRTOS(序)操作系统简介

这样的好处是不会丢失事件和中断,但解决任务仍是通过轮询的方式。多任务系统,是由操作系统的调度器判断执行哪个任务,每个任务都是无限循环,任务间按优先级执行,高优先级任务就绪,则放弃低优先级去执行高优先级。在本系列文章中,很多地方我会按照自己的喜好新建文件夹或者变量名之类的,看不习惯的各位可以按照原视频或者自己的喜好修改。因此,很多地方都是按照我自己的感觉来的,不习惯的朋友可以去看书和视频。PS:本人的本系列文章只是自己的感悟整理,如有问题,敬请及时提醒整改,之后可能会对本系列文章进行部分优化,欢迎大家指正。

2024-03-20 21:29:08 401

原创 实践:实现平台升降功能

关于如何停止电机的运作,可以通过在上下位置都安装限位器来实现,避免了采集ADC的过程,而且容易实现;找时间把项目整理了一下,添加了一些具体的东西。当电机上升完成后,电机会发生阻转,导致ADC增大到比正常运作还大,通过检测这个值,进行判断何时停止上升。在电机运行中,偶尔会有一些很大或者很小的值出现,导致平台在上升过程中没有实现理想状态。平台底部加装限位器,当平台下降压到限位器时,电路导通,高电平,反之低电平;PS:就这个ADC判断困扰了本人好久······电机引脚,高电平转,低电平不转。

2024-03-18 19:32:30 246

原创 思路:实现平台升降功能

最近开始实习,从这篇文章开始,会记录一些工作中遇到的个人认为很有用的思路流程,算是做个笔记吧。当物品拿起时,外部电平变为低电平(0),此时判断标志位不为0,因此标志位置1,平台上升。PS:本人所有文章只提供大概思路,之后可能会进行优化,提供具体应用场景。当物品放下时,外部电平为高电平(1),标志位变为2,使平台下降;开始时外部电平为低电平(0),标志位为0,无变化;物品放下,高电平导通,电机正转,平台下降;物品拿起,低电平,平台上升,直至回归原位。看心情更新······电机引脚,高电平转,低电平不转。

2024-03-14 20:18:58 164

USART功能模板.zip

基于本例程STM32F103VET6实现以下功能: 1、通过串口1连接串口助手,定时在串口助手上打印信息; 2、借由 中断,通过串口助手输入的信息会在串口助手上显示出来 PS:本例程模板只为了移植方便,只包含串口相关功能

2024-06-24

基于stm32F1的气体监测.zip

本工程能监测温湿度、一氧化碳、汽车尾气以及PM2.5等数据,并将数据通过串口助手显示出来。 本工程基于C8T6最小系统板开发,代码亲测有效。

2024-06-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除