- 博客(120)
- 收藏
- 关注
原创 低功耗模式
摘要:本文介绍了STM32低功耗模式的原理与应用,包括Sleep、Stop、Standby三种模式的特点及实现方法。Sleep模式仅暂停CPU,外设保持运行;Stop模式关闭主时钟,保留SRAM数据;Standby模式功耗最低,仅保留VBAT域。通过HAL库函数可快速实现各模式切换,并详细说明唤醒机制及注意事项。实验部分展示了三种模式的具体代码实现及现象对比,为电池供电设备设计提供实用参考。
2025-08-19 22:34:11
573
原创 RTC实验
STM32 RTC实时时钟模块摘要 STM32的RTC(实时时钟)是一个独立计时外设,使用LSE(32.768kHz晶振)或LSI(内部RC振荡器)作为时钟源。RTC核心是一个32位计数器,通过预分频器产生1Hz时基信号,支持闹钟中断和时间保持功能。关键特性包括: 掉电保持:通过VBAT供电保持计时和备份寄存器数据 时间管理:HAL库封装了时间/日期转换功能 闹钟功能:支持单次闹钟中断触发 备份域:包含BKP寄存器用于存储关键数据 使用要点。
2025-08-19 14:47:10
849
原创 BKP相关知识点
摘要:本文详细介绍了STM32F103C8T6微控制器的BKP备份域功能及其应用。备份域由VBAT供电,包含10个16位数据寄存器(BKP_DR1-DR10)、RTC相关寄存器及Tamper防篡改功能,可在主电源掉电时保留数据。文章阐述了备份域的访问步骤、RTC时钟配置、Tamper功能实现方法,以及常见错误排查要点。特别强调备份寄存器读写时需要先解除写保护,并正确使用HAL库的RTC_BKP_DRx宏。通过示例代码演示了如何初始化备份域、读写BKP寄存器,并分析了不同复位情况下备份数据的保留特性。
2025-08-19 12:58:59
456
原创 ADC的实现(单通道,多通道,DMA)
本文详细介绍了STM32F103的12位逐次逼近型ADC的工作原理、配置方法和应用实例。主要内容包括:ADC基本特性(12位分辨率、0-4095转换范围、14MHz时钟限制)、通道配置、采样时间选择、规则组/注入组区别;DMA配置要点(通道映射、数据传输模式);HAL库关键函数说明;并提供了三种典型应用实验:单通道轮询采样、单通道DMA连续采样、多通道DMA扫描采样。特别强调了实际应用中的注意事项,如采样时间选择、Vref校准、DMA循环模式处理等,为工程实践提供了详细指导。
2025-08-18 22:35:57
772
原创 DMA相关知识点
DMA(直接内存访问)技术摘要 DMA是一种无需CPU干预的数据传输方式,可实现外设与内存间的高效数据搬运。核心功能包括: 三种传输模式:内存间拷贝(M2M)、内存到外设(M2P)、外设到内存(P2M) 硬件特性。
2025-08-18 19:06:53
761
原创 窗口看门狗(WWDG)
摘要 窗口看门狗(WWDG)是一种用于提高MCU系统可靠性的看门狗定时器,通过强制复位防止程序跑飞或异常占用。其核心特性包括7位递减计数器、窗口喂狗机制及提前唤醒中断(EWI)。WWDG时钟源自APB1分频,需在特定窗口内(T≤W且T>0x3F)喂狗,否则触发复位。EWI在计数器降至0x40时产生中断,提供最后一次喂狗机会。HAL库提供了初始化、喂狗和中断回调等API,支持调试时冻结计数器。与独立看门狗(IWDG)相比,WWDG强调时序约束,适用于需严格节拍控制的系统。
2025-08-18 15:18:23
958
原创 独立看门狗(IWDG)
独立看门狗(IWDG)是STM32中基于LSI时钟(40kHz)的硬件定时器,用于检测程序异常。它通过递减计数器监控系统运行,需定期"喂狗"(刷新计数器),否则会触发MCU复位。实验通过HAL库配置IWDG参数(预分频32、重载值1250)实现1秒超时检测。当主循环延时超过1秒未喂狗时,MCU会复位并打印复位标志;延时缩短则可正常喂狗保持运行。该机制适用于工业控制等需要高可靠性的场景,能有效防止系统死锁。
2025-08-18 14:05:55
730
原创 定时测距(超声波传感器HC-SR04)
本文介绍了一种基于STM32F103的HC-SR04超声波测距模块驱动程序实现方案。通过配置TIM2定时器产生1μs精度的计时基准,配合GPIO接口控制Trig触发信号和检测Echo回波信号。程序包含初始化、距离测量等功能,采用简单的轮询方式实现时间测量,并将脉冲时间转换为距离值(计算公式:距离=时间×0.01715cm/μs)。文章还给出了硬件连接定义、代码实现细节以及改进建议,包括增加超时保护、温度补偿等优化措施,最后提供了带超时保护的距离测量函数实现,确保系统鲁棒性。该方案适用于需要简单可靠距离测量的
2025-08-18 12:39:45
661
原创 脉冲计数实现
摘要:本文详细介绍了如何配置STM32定时器2(TIM2)通道2(CH2)作为外部脉冲计数器,使用外部时钟模式1(ECM1)对PA1引脚的低电平脉冲进行计数。通过HAL库函数配置定时器参数(PSC=0不分频,ARR=65535满量程),设置上升沿触发,并实现串口打印脉冲数。文中包含完整的代码实现(main.c/counter.h/counter.c),重点讲解了外部时钟模式1的工作原理、参数配置方法(包括定时器基础配置、输入捕获配置和从模式配置),以及脉冲计数增量处理、ARR回卷等关键技术。
2025-08-17 23:40:05
744
原创 PWM输入捕获(测量按键按下时间、测量PWM波)
摘要:本文介绍了使用STM32F1的TIM2通道2(PA1)实现按键按下时间测量的方法。通过配置定时器(PSC=71,ARR=65535)实现1μs的分辨率,采用下降沿捕获方式检测按键按下事件。文章详细讲解了输入捕获的初始化配置、中断处理逻辑以及时间计算原理(总时间=溢出次数×65536+捕获值),并提供了完整代码实现,包括状态机管理、边沿检测和时间计算等功能。同时讨论了ARR参数的选择依据和优化建议,以及抗抖动处理方法,为嵌入式系统中的高精度时间测量提供了实用解决方案。
2025-08-17 21:34:10
652
原创 定时器输出PWM波配置(呼吸灯)
摘要:本文介绍了使用STM32F103定时器4通道3生成PWM波控制LED实现呼吸灯效果的方法。通过配置TIM4(PB8)为PWM输出模式,设置PSC=71、ARR=499获得2kHz频率,并利用HAL库函数控制占空比实现亮度渐变。详细说明了PWM初始化流程、参数计算、极性设置要点,以及LED接法与极性选择的关系。提供了完整的代码实现方案,包括时钟配置、GPIO初始化、PWM参数设置和占空比动态调整方法,并针对常见问题给出了改进建议和排查方法。
2025-08-17 19:05:35
766
原创 定时器中断点灯
本文介绍了如何使用STM32的TIM2定时器实现500ms中断控制LED翻转。主要内容包括:1.系统时钟配置为72MHz,APB1分频后TIM2时钟为72MHz;2.定时器参数设置(PSC=7199,ARR=4999)计算得到500ms中断周期;3.HAL库初始化流程,包括使能时钟、配置NVIC中断优先级;4.中断服务函数和回调函数实现LED翻转功能;5.提供了不同中断周期的参数选择建议,并强调了F1系列定时器时钟"×2规则"的注意事项。
2025-08-17 15:48:14
779
原创 使用SysTick模拟多线程
本文介绍了一种基于STM32 HAL库的极简协作式多任务实现方案。核心思想是利用SysTick中断(1ms周期)进行时间计数并置位任务标志,在主循环中轮询执行任务函数。两个LED任务分别以1s和0.5s周期闪烁,通过中断轻量化处理(仅计数和置位)和主循环协作式调度,实现了类似多线程的效果。文章详细解析了实现原理,包括中断处理、标志位管理、任务调度等关键环节,并指出了变量volatile声明、任务非阻塞执行等注意事项。
2025-08-17 10:23:36
761
原创 带操作系统的延时函数
本文介绍了一种基于STM32 SysTick定时器的精确延时实现方法。该方案通过读取SysTick计数器的当前值(VAL)和重装载值(LOAD),在不干扰系统节拍的前提下实现了微秒级延时。核心思路是将SysTick当作全局倒计时器,通过计算两次VAL读数的差值来累计消逝的时钟周期,当累计值达到目标微秒数对应的时钟周期数时退出循环。该方法自动处理计数器回卷情况,在72MHz时钟下可实现1us精度,同时兼容毫秒和秒级延时。
2025-08-17 09:45:17
589
原创 SysTick寄存器(嘀嗒定时器实现延时)
摘要 本文介绍了基于STM32微控制器的延时函数实现原理,主要包含两种方案:1) 使用SysTick定时器实现微秒级延时,通过计算时钟周期数并配置24位递减计数器实现;2) 使用DWT周期计数器(CYCCNT)实现更高精度的延时。SysTick方案最大延时约233ms(72MHz时钟),可能影响HAL库的系统节拍功能;DWT方案则不影响SysTick且具有纳秒级分辨率,但需初始化DWT模块。两种方案均为忙等实现,中断可能影响实际延时精度。
2025-08-16 23:20:58
559
原创 EXTI配置流程
本文介绍了STM32F1系列使用HAL库配置外部中断(EXTI)的完整流程。关键步骤包括:1.开启GPIO和AFIO时钟;2.配置GPIO为中断模式并设置触发边沿;3.通过AFIO完成EXTI线映射;4.配置NVIC中断优先级和使能。重点说明了F1系列特有的AFIO时钟需求、EXTI线号与IRQ的对应关系,以及中断处理流程。文中提供了PA0下降沿触发中断的完整示例代码,并分析了中断消抖的两种实现方式(阻塞式和非阻塞式),建议采用定时器结合主循环的非阻塞方案以提高系统实时性。
2025-08-16 18:15:50
827
原创 按键及消抖
本文介绍了6种常见的按键消抖方法,重点分析了延时阻塞法的问题并提供了优化方案。延时法虽然简单但会阻塞CPU,影响系统实时性。推荐的非阻塞方案包括:状态机消抖法(通过状态转换和多次确认实现稳定检测)、定时器中断消抖(利用硬件定时器周期性采样)、计数滤波法(通过积分计数和回滞判定)以及操作系统事件消抖(适用于RTOS环境)。此外还介绍了硬件RC滤波和软件滤波算法。这些方法都能有效消除按键抖动,同时避免了CPU阻塞问题,开发者可根据项目复杂度、实时性要求和硬件条件选择适合的方案。
2025-08-16 16:00:11
761
原创 GPIO初始化及调用
本文详细对比了STM32 HAL库和标准外设库(SPL)操作GPIO点亮LED的方法。针对PC13引脚(低电平点亮),分别给出两种库的完整实现步骤:1)使能时钟;2)配置GPIO模式;3)初始化引脚;4)控制LED状态。HAL库使用__HAL_RCC_GPIOx_CLK_ENABLE()和HAL_GPIO_WritePin等函数,SPL则采用RCC_APB2PeriphClockCmd和GPIO_SetBits等API。
2025-08-16 15:01:40
592
原创 GPIO寄存器
摘要:STM32的GPIO寄存器分为CRL(控制引脚0-7)和CRH(控制引脚8-15),每个引脚通过4位配置工作模式。使用时分三步:确定引脚号,设置MODE和CNF值,通过寄存器操作进行配置。此外,BSRR寄存器支持原子操作设置/清除引脚状态,低16位置位,高16位清零,比传统ODR操作更安全。BRR寄存器仅支持清零操作,但推荐优先使用BSRR实现完整的GPIO控制功能。
2025-08-16 10:41:13
575
原创 系统时钟配置
STM32F103C8T6系统时钟配置为72MHz的关键要点:系统时钟是MCU工作的核心节拍,配置72MHz可实现最优性能。通过8MHz外部晶振(HSE)经PLL×9倍频得到72MHz主频,同时设置AHB=72MHz、APB1=36MHz、APB2=72MHz,并配置FLASH等待周期为2。该配置充分利用芯片性能,保证外设时序精度,且与常用分频系数匹配良好。实现时需注意:先配置振荡器再切换时钟源,APB1不得超过36MHz,72MHz必须设置FLASH_LATENCY_2。
2025-08-15 23:55:33
657
原创 PID学习笔记6-倒立摆的实现
本文介绍了一个基于STM32的倒立摆控制系统设计。系统采用双环串级PID控制结构,内环为角度环(5ms周期)负责稳定摆杆,外环为位置环(50ms周期)控制横杆位置。通过定时器中断(1ms)统一采集角度传感器和编码器数据,并实现安全互锁保护。系统包含按键控制、LED状态指示和OLED参数显示功能。调试过程需先校准中心角度值,再依次调节角度环和位置环PID参数。硬件设计需注意传感器精度、电机带宽和电源稳定性。系统通过状态机实现自动启摆,当摆杆进入中心区域后切换至PID稳定控制。
2025-08-14 18:58:12
520
原创 PID学习笔记5-双环PID
本文介绍了基于STM32的双环PID控制系统实现方法,主要包括位置环(外环)和速度环(内环)的串级控制结构。代码实现了PID参数的动态调整、OLED显示及串口数据输出功能。系统特点:1. 采用先内环(速度)后外环(位置)的调试顺序;2. 内环控制周期40ms,通过编码器获取速度反馈;3. 外环输出作为内环目标值,形成串级控制。关键参数包括:内环默认Kp=0.3/Ki=0.3,外环Kp=0.3/Kd=0.4,均设有输出限幅保护。
2025-08-14 14:19:07
238
原创 PID学习笔记4-PID算法改进之输出偏移输入死区
摘要:本文分析了STM32位置式PID控制的三种实现方式。1)仅PD控制响应快但存在稳态误差和功耗问题;2)加入固定输出偏移可克服静摩擦但导致到位抖动;3)增加输入死区能消除抖动但会保留小静差。提出改进建议:采用迟滞死区、条件输出偏移、抗饱和积分等方法,在消除抖动的同时控制静差。最终建议综合使用条件偏移、迟滞死区和小积分项,实现既无抖动又误差可控的系统。参数设置需根据实际系统特性调整,平衡响应速度与稳态精度。
2025-08-14 12:48:38
947
原创 PID学习笔记3-PID算法改进之微分项优化
摘要:本文介绍了两种PID控制算法的改进方法——微分先行和不完全微分在位置控制中的应用。微分先行通过计算实际值变化率来抑制目标值突变引起的尖峰,保留阻尼效果;不完全微分则通过低通滤波降低噪声干扰。实验基于STM32平台,通过编码器和电位器实现位置闭环控制,对比分析了两种方法在超调抑制、噪声处理和响应速度上的差异。实际应用中可根据目标变化频率和噪声情况选择合适方法,或采用"微分先行+低通滤波"的组合方案。调试时建议先调P参数,再逐步加入D和I参数以获得最佳控制效果。
2025-08-14 11:12:27
596
原创 PID学习笔记2-PID算法改进之积分项优化
本文总结了江协科技PID课程2-1视频中位置式PID控制的三种抗积分饱和方法:06积分限幅法通过硬性限制ErrorInt防止积分无限累积,适用于执行器易饱和场景;07积分分离法在误差大于阈值时清零积分,远端靠P、D快速响应,近端启用I消除静差;08变速积分法通过连续变化的系数C(|e|)实现平滑过渡,误差大时积分慢,误差小时积分快。三种方法各有优势:积分限幅是基础必备,分离法简单直接适合大步阶定位,变速积分则更平滑适合动态范围大的系统。
2025-08-10 23:39:54
542
原创 PID学习笔记1
【STM32 PID控制实现摘要】 本文基于江协科技PID课程,总结了4种电机控制回路的实现方法:1)位置式PID定速控制;2)增量式PID定速控制;3)位置式PID定位控制;4)增量式PID定位控制。核心差异在于: 控制对象:速度环测量40ms编码器脉冲增量,位置环累计脉冲数; 算法实现:位置式采用绝对输出(含显式积分项),增量式采用输出增量叠加; 参数影响:Kp决定响应速度,Ki消除稳态误差但易引发振荡,Kd抑制超调但放大噪声; 抗饱和特性:增量式天然更抗积分饱和,位置式需额外处理积分限幅。
2025-08-09 19:29:43
904
原创 MQTT与服务器通讯
摘要:本文详细介绍了MQTT 3.1.1协议的核心功能与实现要点,包括协议特性、消息模型、主题规则、QoS级别、遗嘱机制等关键技术。同时提供了基于STM32+ESP8266的物联网终端实现方案,通过温湿度传感器采集数据并上传至OneNET平台。内容涵盖协议报文解析、主题设计规范、错误处理建议,以及完整的硬件连接方案和代码实现(包括DHT11驱动、ESP8266通信、MQTT报文打包等模块),为物联网开发者提供了从协议理解到落地的完整参考。
2025-08-08 22:35:53
966
原创 CAN通信
CAN总线技术摘要 CAN(控制器局域网络)是由Bosch开发的串行通信协议,具备多主通信、高可靠性和强抗干扰能力,广泛应用于汽车电子(发动机控制、ABS等)和工业自动化领域。其物理层采用双绞线总线结构,两端需接120Ω终端电阻,电平标准为差分信号(显性/隐性逻辑)。协议层支持多种帧类型(数据/远程/错误帧),采用基于ID优先级的仲裁机制。STM32单片机内置CAN控制器(bxCAN),支持标准/扩展帧、硬件过滤和自动重传等功能。
2025-08-06 23:27:16
706
原创 4G模块(E840)给单片机发送指令
本文介绍了一个基于STM32和E8404G模块的远程控制LED系统。系统通过STM32的USART2串口与E8404G模块通信,实现4G网络数据的接收与处理。主程序通过串口中断接收E840模块数据,并在主循环中检测"ON"/"OFF"指令控制LED状态。系统采用环形缓冲区存储数据,支持格式化数据收发,可实现实时远程控制。工作流程展示了从云端/手机APP发送指令到最终控制LED的过程,包括数据转发、串口接收、指令解析等环节。
2025-08-02 00:14:37
284
原创 通过WIFI(ESP8266)给单片机发送指令
本文介绍了一个基于ESP8266 WiFi模块的远程控制系统。系统通过STM32单片机连接ESP8266模块,实现WiFi网络通信和TCP服务器连接。代码包含ESP8266初始化、串口通信、网络连接和透传模式设置等功能。主程序通过解析接收到的"ON"/"OFF"指令控制外设。系统工作流程为:终端设备通过TCP发送指令→ESP8266通过串口转发给单片机→单片机解析并执行相应控制操作。
2025-08-01 21:15:33
137
原创 WIFI模块(ESP8266连接串口2,作为服务器)
本工程实现了STM32通过USART2串口控制ESP8266 WiFi模块的基础功能,主要包括: 核心功能 ESP8266初始化(AT指令测试、模式设置) WiFi热点(AP)模式配置 TCP服务器建立(默认端口8080) 串口数据收发(中断方式) 应用场景 物联网设备无线通信 远程调试接口 WiFi数据透传中继 智能设备无线控制 工作流程 硬件连接:STM32 USART2 ↔ ESP8266 初始化:AT指令测试 → AP模式设置 → 多连接配置 → 启动TCP服务
2025-08-01 17:02:36
638
原创 WIFI模块(ESP8266连接串口2,连接TCP服务器)
摘要:本工程实现STM32通过ESP8266 WiFi模块自动连接TCP服务器的功能。系统采用72MHz主频STM32,通过USART1与PC通信(115200波特率),USART2与ESP8266通信。主程序自动完成WiFi连接(支持SSID/密码配置)、TCP服务器连接(IP/端口可配)并进入透传模式。每500ms向服务器发送测试数据,接收响应后通过串口1输出。
2025-08-01 16:28:33
752
原创 WIFI模块(ESP8266连接串口2,入网功能实现)
该代码实现了STM32通过USART2与ESP8266模块通信,自动完成WiFi连接初始化。主要功能包括:1) 通过串口1(USART1)输出调试信息;2) 自动发送AT指令配置ESP8266为STA模式并连接指定WiFi;3) 实现串口中断处理接收不定长数据;4) 提供AT命令发送和响应检测功能。系统上电后会自动完成模块检测、模式设置、WiFi连接等步骤,所有操作状态通过串口1实时输出。代码结构清晰,包含错误处理和超时机制,可直接用于嵌入式WiFi通信项目开发。
2025-08-01 15:47:03
570
原创 蓝牙模块(HC-08,串口2控制)
本系统实现了STM32通过蓝牙模块与手机APP及上位机的双向通信。硬件连接上,STM32的UART1通过USB-TTL模块连接电脑串口助手,UART2连接蓝牙模块与手机APP通信。软件设计中采用HAL库和标准库两种实现方式,均通过串口中断(RXNE+IDLE)实现不定长数据接收,其中蓝牙模块支持AT指令配置和命令控制功能。系统特点包括:1)双串口独立工作,STM32可同时与电脑和手机通信;2)支持printf重定向,便于调试;3)采用空闲中断机制实现变长数据帧接收。
2025-07-31 23:42:43
859
原创 STM32串口通讯
摘要:USART(通用同步/异步收发器)是嵌入式系统中常用的串行通信接口,支持同步(USART)和异步(UART)两种模式。异步模式下只需TX/RX两根线,通过起始位、数据位、校验位和停止位实现通信;同步模式则需额外时钟线(SCLK),适合高速场景。STM32的USART配置包括GPIO初始化(TX推挽输出、RX浮空输入)、波特率设置、数据格式定义等。
2025-07-31 16:29:39
644
原创 SPI同时控制OLED和W25Q128(实现一主多从)
摘要:本文介绍了如何使用STM32的SPI1总线分时复用控制W25Q128 Flash存储器和SSD1306 OLED屏幕。通过硬件连接和软件设计,实现了SPI总线共享而片选独立控制的方法。文中详细阐述了SPI初始化、引脚配置、外设驱动实现及分时访问流程,重点说明了CS片选管理、数据传输时序等关键点,并提供了常见问题的解决方法。该方案采用标准库实现,适用于需要SPI总线复用多个外设的应用场景。
2025-07-30 23:32:19
615
原创 SPI与W25Q通信
摘要:本文详细介绍了SPI与IIC两种串行通信协议的对比,重点分析了SPI通信协议的工作原理、四种工作模式及硬件架构。以W25Q128 SPI Flash存储器为例,阐述了其存储结构、指令集和状态寄存器,并提供了基于STM32标准库和HAL库的驱动程序实现方案,包括初始化配置、数据读写、扇区擦除等关键操作。通过代码示例展示了SPI与W25Q128的具体通信流程,强调了写使能、忙状态检测等操作要点,为嵌入式系统开发提供了实用的SPI Flash驱动参考。
2025-07-30 19:30:26
796
原创 IIC控制OLED屏幕显示
本文详细介绍了IIC通信协议的工作原理及其在OLED显示控制中的应用。IIC是一种半双工、同步串行总线协议,通过SCL时钟线和SDA数据线实现主从设备通信。文章重点阐述了IIC的总线结构、通信流程(包括起始/停止信号、地址传输、数据帧和应答机制)以及波形特性。 在应用层面,文章以STM32控制SSD1306 OLED为例,详细解析了IIC接口的硬件连接、软件模拟时序实现方法,以及OLED的初始化、显示控制等关键操作。
2025-07-30 00:36:11
593
原创 FreeRtos(基于FreeRtos的智能台灯)
本文介绍了一个基于FreeRTOS的智能灯光控制系统优化方案。系统通过红外传感器检测人体并实时测量距离,距离过近或久坐时间超过阈值会触发报警。提供了三种工作模式:智能模式(根据光照自动调节灯光)、按键模式(手动调节)和远程模式(蓝牙控制)。优化内容包括:1) 使用宏定义集中管理常量参数;2) 对系统状态结构体和变量进行封装;3) 改进模式切换的边界处理;4) 优化任务优先级和互斥机制;5) 增强代码风格和注释规范。
2025-07-27 23:59:35
264
原创 回调函数的使用
摘要:回调函数是通过函数指针传递到另一函数中的可调用函数,实现"程序反向调用自定义代码"的功能。C语言中,通过typedef定义函数指针类型,在主逻辑函数中调用回调函数实现灵活功能。示例展示了冒泡排序通过回调实现升/降序切换,以及学生查询系统通过回调实现不同查找条件。回调函数在处理事件、异步操作等场景有广泛应用,能有效提高代码的复用性和灵活性。
2025-07-27 15:40:06
233
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人