自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 单片机的RTC实时时钟

RTC有3个时钟源(本文均以STM32F1为例):HSE,LSI,LSE,前两个晶振电源由VDD提供,受VDD电源影响,LSE在VDD有效时通过VDD工作,VDD断电时可以通过备用电源VBAT提供时钟信号。就是用到时间戳,时间戳是从1970的1月1日0时0分0秒开始计时的秒数,到2025年大概是17亿,32位数据最大值为40多亿,所以目前不用担心计数值溢出问题。RTC实质是一个连续计数的计数器,拥有独立的时钟,计数频率为1Hz(1s),可以提供日历的功能,专门用来记录时间或设置时间。

2025-05-27 11:26:22 196

原创 单片机中的DMA传输

5.设置传输方向(如内存->外设),工作模式(循环模式(重装载数据量)/正常模式(数据量递减为0时停止)),增量模式(传输完一次时是否自增地址),数据宽度(8/16/32bit),中断使能。DMA请求的优先级分为四个等级:高,较高,中,低,有对应寄存器进行设置,当多个请求优先级一致时,通道编号较低的优先响应,如优先级一致两个请求,通道2的请求大于通道4的请求。上图为DMA1与外设的通道对应表,可见一个通道可以支持多个外设的请求,又有多个不同的通道,但同一时间只能应答一个请求,这就需要优先级进行仲裁。

2025-05-26 11:19:55 172

原创 FreeRTOS的内存管理

跟标准C库的堆申请类似,比如malloc()和free(),但是其代码庞大,不适合资源有限的嵌入式系统,且没有操作系统的线程保护机制,容易造成访问冲突,内存碎片化(多次申请和释放导致空闲内存无法合并,离散分布)等问题。使用最佳自适应算法,寻找能够满足自身需求的最小空闲内存段,适用于频繁创建和删除的任务,且每个任务的申请内存相同,才不会受内存碎片影响。使用一个大数组开辟可管理的空间,申请内存时,依次将数组空间分配给任务堆栈,适用于不需要删除的任务,队列,信号量等。

2025-05-14 16:58:14 187

原创 FreeRTOS的低功耗模式

本质是裸机的睡眠模式,调用WFI指令进入,因为FreeRTOS大部分时间其实实在运行空闲任务,当任务在阻塞或者没任务时都会执行空闲任务,所以FreeRTOS低功耗模式会在执行空闲任务时进入睡眠模式。停机模式:所有时钟源关闭,只要RTC和备份寄存器工作,功耗更低,任意外部中断唤醒,如外部复位,看门狗复位,RTC闹钟等,保留SRAM和寄存器数据,唤醒后在中断处开始执行。睡眠模式: CPU时钟关闭,其他正常工作,功耗较低,可以通过任意中断或事件唤醒,CPU的寄存器和内存数据均会保留,唤醒后接着执行之前的程序。

2025-04-30 11:36:40 241

原创 FreeRTOS软件定时器

定时器队列是定时器服务任务使用的,用户通过API向队列发送命令,定时器任务接收队列数据并解析命令指向对应操作。软件定时器的回调函数在定时器服务任务中调用,所以回调函数中禁止使用使任务阻塞的API,如延时,队列,信号量等。软件定时器是FreeRTOS提供的低精度定时器,可以用于硬件定时器资源不够且对时间精度要求不高的场合。软件定时器任务在创建时是休眠状态,只有调用相关API才会进入运行态,也能返回休眠态。定时器服务任务在开启调度器时如果使能了相关配置宏则自动创建。本文介绍软件定时器,个人理解,仅供参考。

2025-04-24 17:37:39 202

原创 字符串指针与字符串数组的区别,*str和str[]

(1)字符串指针指向常量字符,不可改变其值,字符串数组可以改变字符串值。因为字符串常量被放在只读内存段(.rodata)而数组放在栈/全局区。所有有时候你想对字符串的某个字符进行更改时程序会崩溃就是使用了字符串指针,改用字符串数组即可。(2)当用作函数参数时,数组会退化为指针,也就是它两完全相同。

2025-04-18 17:27:55 165

原创 FreeRTOS的队列、信号量、队列集、事件组

原因:在使用二值信号量时,高低优先级的任务同时使用同一个信号量,低优先级的任务长期占有信号量时,高优先级任务会在获取信号量时阻塞,此时中优先级任务可以抢占低优先级任务一直执行,导致低优先级任务无法释放信号量,高优先级任务一直处于阻塞态。优先级继承机制:这是互斥信号量带有的机制,可以防止优先级翻转问题,当低优先级占有信号量而导致高优先级任务阻塞时,会将低优先级任务的优先级提高到与高优先级任务的优先级一致,从而防止中间等级的任务抢占而延时高优先级任务的运行。多个任务阻塞读写时,优先级高,阻塞时间长的优先读写。

2025-04-17 13:48:07 319

原创 STM32的启动模式和启动过程

如上:在复位函数中调用了SystemInit和__main,SystemInit()其他.c中定义,主要设置相关时钟配置,__main函数是编译器检测到定义了main()函数后自动生成的,初始化堆栈并调用main()函数进入C语言文件,运行主函数。中断向量表记录了所有中断函数的入口地址,4字节偏移,当发生中断(异常)时,先从中断向量表中找到对应中断服务函数的地址,再去对应地址执行代码。这两个地址处于中断向量表的第一和第二,其地址是可以映射到其他地址的,根据不同的映射地址也就有了不同的启动模式。

2025-04-16 17:35:49 370

原创 单片机中.MAP文件解析

描述了各符号的相互引用信息,如上:最后一句,main.o中的SystemClock_Config函数调用了rt_memclr.o中的符号__aeabi_memclr4,其他类似。包括映像的入口地址,加载区的入口地址、大小、最大地址范围,运行区的入口地址、大小、最大地址范围。RW:Read Write 的缩写,包含可读写数据(RW data,有初值,且不为 0),占用 FLASH。(2)删除映像未使用的程序段:描述工程中未使用而被删除的程序段(函数/数据)。

2025-04-15 17:12:40 545

原创 FreeRTOS任务调度过程详解

vTaskDelay()是绝对延时,即自调用起需要到达指定时间再恢复运行,vTaskDelayUntil()是相对延时,即它的延时是根据特定的一个时间点开始以整个任务为整体周期性的延时。任务保存:当进行任务切换时,需要把当前执行任务的寄存器值保存起来,将当前CPU寄存器值保存到正在运行任务的任务堆栈中(任务堆栈中已经预留了各个寄存器的位置),以便下次切换回来时恢复到上次运行的状态。任务恢复:把要执行任务的堆栈寄存器值恢复到CPU寄存器中,部分寄存器由硬件自动保存恢复(注:自动这个过程还是使用的PSP)。

2025-04-07 17:25:39 541

原创 嵌入式常用的通信协议

读时序:主设备先将数据线拉低至少 1μs,然后释放数据线。蓝牙是一种短距离的无线通信协议,主要用于音频传输,BLE为带低功耗模式,通信速率在1~3M之间,开发方式有模块化和集成化两种,模块如HC-05,通过串口发送AT指令实现通信,集成如ESP32系列,自带蓝牙功能,需要了解相关协议栈,开发难度较大。WIFI是一种无线局域网技术,主要用于智能家居领域,有2.4G/5G/6G频段,速率快,低延迟,有AP,STA,组网模式,开发方式有模块官方SDK,arduino+wifi库,Linux+wifi驱动等。

2025-04-01 16:25:09 458

原创 FreeRTOS列表与列表项及其操作

列表是FreeRTOS中的一种数据结构,类似于C语言中的双向环形链表,用于跟踪FreeRTOS中的任务,记录任务的当前状态或事件,比如就绪列表,任务创建完成时就会添加至就绪列表,等待调度器调用。列表项是存放于列表中的数据,如果列表相当于数组,列表项就相当于数组中的元素,如果列表相当于链表,列表项就相当于链表的节点。(3)列表的尾部插入:其实是插入到列表索引值的前面,初始化时这个索引值指向末尾列表项。本文介绍FreeRTOS中的列表与列表项,及列表项的插入,删除等操作,仅作参考。(1)列表与列表项的初始化。

2025-03-27 10:21:24 247

原创 FreeRTOS的中断管理(STM32)

FreeRTOS中的一些中断特点介绍

2025-03-24 17:36:11 528

原创 FreeRTOS任务创建,删除,挂起和恢复

任务创建、删除、挂起、恢复

2025-03-21 17:24:38 332

原创 STM32移植FreeRTOS

STM32移植FreeRTOS

2025-03-20 10:15:27 610

空空如也

空空如也

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

TA关注的人

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