- 博客(62)
- 收藏
- 关注
原创 FREERTOS_定时器——创建和基本使用
FreeRTOS软件定时器是基于系统时钟tick实现的,由内核定时器服务任务管理。定时器分为周期模式(自动重装载)和单次模式(仅触发一次),回调函数必须简短且不能调用阻塞API。创建定时器需包含头文件、定义句柄、调用xTimerCreate()设置名称、周期、模式和回调函数,并通过xTimerStart()启动。核心操作包括实现回调函数、使用xTimerReset()/xTimerChangePeriod()等API动态控制定时器。示例展示了单次定时器(按键触发3秒后恢复默认模式)和周期定时器(动态调整LE
2025-12-02 22:23:09
178
原创 FREERTOS_任务通知——使用
FreeRTOS任务通知机制提供轻量级任务间通信方案,具有三大特点:1)直接通过任务句柄发送/接收32位通知数据,无需创建独立对象;2)支持覆盖、叠加等多种通知模式;3)可替代简单队列/信号量。使用时需包含头文件并获取接收任务句柄,发送方调用xTaskNotify()指定句柄和模式,接收方通过xTaskNotifyWait()等待通知。示例演示了LED控制场景:高16位存储命令标识(如CMD_SET_DELAY),低16位传递参数(如闪烁延时),实现高效的一对一通信。该机制节省内存且灵活,适合传递少量数据的
2025-12-02 21:31:55
252
原创 FREERTOS_事件组——创建和使用
本文介绍了事件组的创建与使用方法。首先通过xEventGroupCreate()创建事件组,并为每个事件分配独立的事件位(如EVENT_BIT_0)。核心操作包括xEventGroupSetBits()设置事件位和xEventGroupWaitBits()等待事件位,支持"或"(任意事件)和"与"(所有事件)两种组合逻辑模式。典型应用场景包括多事件触发判断和多任务同步,具有事件位独立、灵活等待模式和自动清除等特性。最后展示了如何通过位运算判断具体触发的事件组合。
2025-11-27 21:43:30
251
原创 FREERTOS_互斥量_创建和使用
本文介绍了互斥量的创建与使用方法。首先通过包含头文件、定义句柄并调用xSemaphoreCreateMutex()创建互斥量。使用时遵循"先获取、后使用、用完释放"原则,通过xSemaphoreTake()获取互斥量保护临界区,再通过xSemaphoreGive()释放。互斥量具有所有权特性(只能由获取者释放)和优先级继承机制,但不能在中断中使用。最后以串口打印为例,展示了互斥量如何保护共享资源访问。关键点包括临界区代码应尽量简短,避免长时间阻塞其他任务。
2025-11-27 20:47:28
176
原创 FREERTOS_信号量_创建和使用
摘要:信号量在嵌入式系统中用于任务同步和资源管理。二进制信号量(xSemaphoreCreateBinary)用于任务同步,初始为空;计数型信号量(xSemaphoreCreateCounting)用于资源计数,可设置初始值。核心操作函数xSemaphoreGive()和xSemaphoreTake()通用,分别实现信号量释放(计数值+1)和获取(计数值-1)。使用时需检查创建结果,处理可能的失败情况。二进制信号量适合事件触发场景,计数型信号量适用于资源管理,当资源不足时任务会阻塞等待。
2025-11-27 17:28:04
235
原创 FREERTOS_队列_创建和使用
摘要:本文介绍了队列的创建与基本使用方法。创建队列需要包含头文件、定义句柄并调用xQueueCreate函数,需检查创建结果。队列核心操作包括发送和接收消息,使用xQueueSend和xQueueReceive函数实现。队列采用数据拷贝机制确保安全,并支持阻塞机制优化CPU利用率。发送时队列满可阻塞等待,接收时队列空也可阻塞等待,避免轮询消耗资源。注意一个句柄只能绑定一个队列。
2025-11-27 17:01:05
216
原创 嵌入式系统bringup指南:软硬件调试
嵌入式系统中的bringup(启动调试)是连接理论设计与实际系统的关键环节,包括硬件和软件两部分。硬件bringup验证电源、时钟、外设等基础功能,确保硬件通电后能稳定运行;软件bringup则使操作系统、驱动和应用程序适配硬件平台。实际项目中,需先完成硬件调试再移植系统、开发驱动,最终实现全链路稳定运行。该阶段对多传感器、深度学习等复杂项目尤为重要,是后续功能开发和产品化的基础。常见工具包括万用表、示波器、串口终端等,用于排查兼容性和稳定性问题。
2025-11-25 20:50:28
604
原创 STM32基于HAL库创建驱动OLED的FREERTOS任务
摘要:本文介绍了基于STM32F103C8T6的OLED显示屏I2C驱动实现方法。使用PB8(SCL)和PB9(SDA)引脚配置为开漏输出模式,通过软件模拟I2C协议完成通信。详细说明了OLED初始化流程、I2C时序控制、显示功能实现以及FreeRTOS任务创建。包含完整的驱动代码,支持字符、字符串及多种数字格式显示,采用8x16点阵字库,提供清屏、光标定位等功能。在FreeRTOS中创建了优先级为Normal的显示任务,初始显示"STM3210"菜单界面,实现了基本的OLED显示控制功
2025-11-25 20:17:38
297
原创 FREERTOS任务创建
任务函数包含任务的具体执行逻辑,必须是一个无限循环,并包含适当的延时。为新任务定义 标识符(句柄)和属性(名称、栈大小、优先级)。FreeRTOS 内核会根据任务优先级自动进行调度,在使用函数前进行声明,符合 C 语言规范。函数是任务主动让出 CPU 的关键。这是创建任务的核心步骤,调用。函数来创建并启动任务。
2025-11-25 14:04:27
151
原创 电脑终端(不用软件)直连树莓派
如果你的电脑已经通过ssh远程控制树莓派,那么非常简单。如果没有ssh链接,本教程中的方式不适合。raspi-conf配置wifi。
2025-11-13 13:25:30
209
原创 VI编辑器指令和操作方法
Vim编辑器提供了三种基本模式:正常模式(默认状态,执行命令)、插入模式(输入文本)和末行模式(执行高级指令)。常用操作包括:使用hjkl或方向键移动光标,gg/G跳转行首尾,dd/yy删除/复制行,p粘贴,u撤销;末行模式下可进行保存(:w)、退出(:q)、查找替换(:%s)等操作。实用技巧包括可视化选择(v/V)、分屏编辑(:split)等。掌握这些基础操作可快速上手Vim文本编辑。
2025-11-08 21:57:00
345
原创 HAL库uint8_t,uint16_t,uint32_t类型报错error: #20: identifier “uint32_t“ is undefined
解决uint8_t未定义报错的两种方法: 标准方法:包含stdint.h头文件,或在工程设置中勾选"Use MicroLIB"。适用于大多数情况。 自定义方法:手动在头文件中定义类型(如typedef unsigned char uint8_t;),需注意与MCU架构匹配,但灵活性较差。 推荐优先使用标准方法,自定义类型仅作备用方案。需根据平台调整定义(如STM32中int为32位)。自定义时建议单独创建头文件(如my_typedef.h)集中管理类型声明。
2025-11-05 13:27:30
286
原创 STM32F103进行MPU6050姿态解算源码/eMPL库手把手移植/STM32手把手实现eMPL姿态解算库的移植
MPU6050传感器DMP驱动移植与实现 摘要:本文详细介绍了将MPU6050传感器的DMP(数字运动处理器)驱动移植到STM32F1平台的过程。主要内容包括: 在inv_mpu.c中增加定义声明,修改初始化函数和接口; 在inv_mpu_dmp_motion_driver.c中添加方向矩阵转换和自检函数; 实现MPU6050底层驱动,包括连续读写函数; 完成DMP初始化配置,包括传感器设置、FIFO配置和固件加载; 设计姿态解算函数,通过四元数计算俯仰角、横滚角和偏航角。 工程已在STM32F103C8T
2025-11-04 12:11:19
431
原创 STM32标准库/HAL库移植 宏的使用/宏使用技巧
摘要:本文介绍了四种GPIO引脚配置方法及其适用场景:1)有参宏直接调用库函数,但移植性差;2)简单宏定义实现基础功能;3)无参复杂宏直接操作寄存器;4)带参函数增强可读性和可维护性。特别针对HAL库使用时出现的枚举类型警告问题,提供了三种解决方案:直接使用枚举值、强制类型转换或三元条件运算符。文中比较了标准库与HAL库在引脚状态赋值时的差异,强调类型匹配的重要性,并给出了具体代码示例。
2025-11-03 13:40:08
765
原创 写代码时,光标处出现黑色横线
在代码编辑时出现黑色横线且输入覆盖原有文本,通常是不小心按到Insert键或数字键盘关闭时按了0键导致的。解决方法很简单:只需再次按下Insert键或在数字键盘关闭时再按一次0键即可恢复正常输入模式。
2025-11-03 13:35:09
115
原创 STM32 HAL库 代码备注以及HAL库代码区
摘要:本文介绍了函数文档中常用的注释标签及其用途。@brief用于概述函数作用,@param描述参数详情,@note提供使用注意事项。其他标签包括@retval/@return说明返回值,@warning/@attention标记风险提示,@ingroup标识模块分类。这些标签共同构成了规范的函数文档体系,便于开发者理解和使用API。
2025-11-03 13:32:54
113
原创 NPN和PNP三极管 及蜂鸣器 控制电路
摘要:文章详细介绍了NPN和PNP三极管的使用方法及驱动蜂鸣器电路设计要点。NPN三极管需将负载接集电极,PNP需接发射极以防止漏电。三极管作为开关使用时,NPN型发射极接地,PNP型发射极接高电平。驱动蜂鸣器时,无源蜂鸣器需加续流二极管避免反向电动势损坏电路。三极管的基极电流必须足够大才能进入饱和状态,确保可靠开关功能。在电路设计中需注意兼容有源和无源蜂鸣器,后者必须配置续流二极管(如IN4148)以保护电路。
2025-11-03 13:29:52
1073
原创 一、接地与退耦
摘要: 电路设计中需注意接地与退耦问题,避免大电流(如数码管)干扰小信号地线回路(如运放、ADC)。数字信号可容忍几十mV干扰,而模拟信号不可。导线分布电感(约10nH/cm)会导致电压波动(UL=Ldi/dt),需通过退耦电容(电解+瓷片)抑制电流突变(di/dt)。例如,红外通信(5Mbps)因退耦不足可能导致速率下降;接地错误(如信号源地接错位置)可能引发异常(如误鸣叫)。此外,整流滤波后的直流需稳定,LED电流及开关电源测量需规范(安全电压为交流36V/50Hz)。
2025-11-03 13:28:53
423
原创 单片机晶振电路分析
摘要:单片机工作的四大基本模块包括电源、时钟、复位和MCU芯片。晶振电路中,电容用于滤波和快速起振,1MΩ电阻通过增强损耗来降低Q值,促进电路启动。32.768KHz晶振专为RTC设计,通过15次二分频产生1Hz信号,其低频特性可降低功耗,适用于电池供电设备。这些元件共同确保了单片机的稳定运行和高效能耗管理。
2025-11-03 13:27:32
173
原创 AD使用记录
文章摘要:本文介绍了AD20原理图设计的实用技巧,包括导线连接(Placewire需在结点点击)、交叉分离(Cross-Overs显示为圆弧)、网络标号处理、走线方式切换(Shift+空格)等操作方法。同时讲解了元件绘制(建议放在原点)、总线绘制步骤、单位切换(Q键)以及PCB设计要点,如板框绘制需在Keep-OutLayer层完成。针对常见问题提供了解决方案,如元件位移过大时按住Ctrl移动、更新报错时删除重导等实用技巧。(149字)
2025-11-03 13:26:32
734
原创 STM32回调函数的使用 /定时器/GPIO/按鍵/串口的中斷回調
摘要:回调函数在HAL库中用于分离底层逻辑与用户业务逻辑,用户只需实现特定事件(如定时器中断、GPIO触发)的回调函数,HAL库会自动处理标志位等通用操作。标准库需手动编写完整中断服务函数,而HAL库通过分层设计(如HAL_TIM_IRQHandler)自动处理中断标志,用户仅需在回调函数(如HAL_TIM_PeriodElapsedCallback)中实现业务逻辑。串口通信需在回调函数中重新启用中断接收(HAL_UART_Receive_IT)以实现持续接收,发送完成通过HAL_UART_TxCpltCa
2025-11-03 09:26:14
1217
原创 MPU6050配置Studying
摘要: 本文详细介绍了STM32的软件I2C实现方法及MPU6050传感器驱动开发。主要内容包括:1. 软件I2C协议层的实现,包括起始位、停止位、字节收发等时序控制;2. MPU6050寄存器读写操作,支持加速度计和陀螺仪数据获取;3. 两种引脚配置方案比较(宏定义与函数实现);4. 标准库与HAL库在GPIO操作上的差异及解决方案;5. 精确延时函数的实现方法;6. MPU6050初始化配置流程。文章提供了完整的代码示例,涵盖了从底层驱动到应用层的完整实现过程。
2025-11-01 22:29:05
600
原创 STM32程序下载/串口一键下载电路
ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。ISP的时候需要用到(bootloader)自举程序,自举程序存储在 STM32 器件的内部自举 ROM 存储器(系统存储器)中。其主要任务是通过一种可用的串行外设( USART、 CAN、 USB、 I2C 等)将应用程序下载到内部 Flash中。每种串行接口都定义了相应的通信协议,其中包含兼容的命令集和序列。
2025-10-31 13:12:10
865
原创 匿名结构体与带标签名的结构体
Node x;// 方式二:可以向前声明(声明 struct Node 存在)// 正确,提前声明标签名为 Node 的结构体// 方式一:无法向前声明(因为结构体没有标签名,无法标识)// struct???;没有标签名,无法写这个声明当结构体内部没有自引用时,两种方式在日常使用中几乎没有区别,都能正常定义和使用结构体。支持和Node两种引用方式;允许向前声明,方便处理复杂的类型依赖;代码可读性更好(标签名能直观体现结构体的含义)。
2025-10-29 10:03:14
421
原创 HAL库RTOS按键检测1min快速移植
提前在CUBEMX中将对应按键勾选为输入模式,并根据按键检测的电平将IO配置为上拉或下拉,并命名KEY1(我这里是KEY1,其他的对照.c.h文件自行修改名称)。(这种配置方式,在文件生成时会自动将初始化代码放在main中,只需要田间按键检测的代码即可)懒得去CUBEMX中配置的话,就去看好对应的按键是哪个,创建key.c文件准备进行后续初始化函数和检测函数的编写。相较于way 1的.c文件增加了 void Key_Port_Init(void)与way 1的文件相同。
2025-10-28 13:29:50
184
原创 HAL库串口printf函数配置
进入到STM32xxxhal.c中(uart.c中也可以),加入如下两条语句,你的huart是数字几,后面就修改成几。在keil中点击魔术棒,如下按钮 ,进入项目参数设置界面,在Target下勾选上Usb MicroLIB。把如下代码添加在hal.c中,还是添加在STM32xxxhal.c中,我添加在154-170的位置。配置好时钟后,选择你的串口,生成代码。一、STM32CubeMX配置串口。二、修改代码——按如图顺序。三、使用MicroLIB库。三、增加代码——如图所示。三、验证printf。
2025-10-28 13:07:23
196
原创 神经网络初次学习收获
权重(weight):连接不同神经元的 “系数”,比如输入层到隐藏层的连接强度,类似线性方程y = wx + b中的w。偏置(bias):每个神经元的 “偏移量”,类似上述方程中的b。这些参数在模型初始化时是随机赋值的,随后会在训练过程中通过反向向传播和梯度下降不断更新,最终收敛到能最小化损失的值。
2025-10-21 19:37:53
1078
原创 新版Pycharm添加导入anaconda的python解释器
查询资料后知,在这个地方不应该导入python.exe文件,应该导入。安装目录下的\Anaconda3\Scripts\。
2025-09-26 16:39:11
308
原创 信号发生器和示波器阻抗匹配问题
信号源阻抗是信号源的固有输出阻抗(通常为50Ω),由内部电路决定且不可改变。面板上的"50Ω/高阻"选项是幅度校准设置,针对不同负载进行补偿。在四种组合中:1)50Ω设置+50Ω负载,输出V₀;2)50Ω设置+高阻负载,输出2V₀;3)高阻设置+50Ω负载,输出0.5V₀;4)高阻设置+高阻负载,输出V₀。只有当信号源设置与负载阻抗匹配时,输出才等于标称值,否则会出现幅度偏差。这解释了工程中阻抗匹配的重要性。
2025-08-02 00:10:51
1117
原创 运放搭建积分器
因为饱和,所以要加 反馈电阻,(高频状态一般不需要这个电阻):所以确定不会发生饱和的话,R4可以拿掉。,运放容易趋近饱和,加电阻是为了降低增益。改电容后:输出与输入是反的哈。例子:该电阻值后演示,
2025-07-13 14:30:03
319
原创 Keil编译报错[error: #101: “xxx_IRQn“ has already been declared in the current scope]解决办法
在使用HAL库时,突然出现大量报错,错误提示指向stm32f10x.h文件。经排查,问题源于代码中包含了两个功能重复的头文件。解决方法有两种:一是将stm32f10x.h替换为stm32f10x_hal.h;二是直接去掉重复的头文件引用。具体操作时,可以搜索stm32f10x.h的位置,并根据实际情况进行替换或删除。此外,还需检查main.c文件中是否已经包含了相关定义,避免重复定义导致的问题。通过上述步骤,报错问题得以解决。
2025-05-12 15:19:04
1094
原创 Keil安装pack包时报错解决:Cannot copy license file to “.Download“ folder.
在下载STM32G0系列的芯片包的时,打开安装包安装,出现了如下图这个报错,导致安装失败。以管理员打开进行安装,也不能解决。,去网站上找一个早点的,低版本Pack包进行安装就可以了。keil版本和固件版本不兼容。
2025-05-07 14:35:56
4218
1
原创 电流测量 I/V转换
电流 / 电压( I/V )转换器,这是因为大多数输入信号(如压力、流量、位移等)的调理电路都直接由相应的产品化器件——变送器来完成。为了将传感器输出的非标准电压信号转换为A/D 转换器能直接采集的电压信号,需使用 I/V变换电路,满足A/D 转换器的要求。用互感的方法,一般有这种模块,将电流感应成一个电压值,有对应的变换关系,I-V转换最简单的方式就是串一个电阻,如图,另一种适合微弱电流的IV转换,一般采用下面这种形式的。某宝的 I/V转换的模块原理图,研究学习用。
2025-05-01 13:43:35
685
原创 蓝桥杯/单片机——定时器/计数器和
定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5,T2为P3.1),则为计数方式,每来一个脉冲加1。
2025-01-27 21:39:20
1065
原创 Keil报错处理 :ERROR: PREPROCESSOR: MACROS TOO NESTED / C51 FATAL-ERROR /ACTION: PARSING SOURCE-FILE
如下图的代码,.c和.h文件都包含了一下,就导致了问题,大家可以去掉一个,或者加上。#ifndef进行判断是否已经引用,防止多次嵌套引用。宏定义嵌套太多。头文件引用错误导致的。
2024-12-31 19:13:13
1048
本报告重点介绍使用运算放大器的有源低通滤波器设计 低通滤波器通常用于在数据采集系统中实现抗混叠滤波 器 二阶滤波器的设计是需要考虑的主要主题 滤波器表是根据级联若于较低阶级以实现较高阶滤波器的想法开发
2025-01-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅